You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中HAProxy Ingress无地址分配问题排查求助

问题排查与解决方案:Ingress未分配地址+CockroachDB端口转发失败

环境信息

  • Kubernetes版本:v1.25.9+rke2r1
  • 已部署组件:MetalLB(含可用外部IP池)、HAProxy Ingress Controller
  • 目标:通过Ingress暴露由CrdbCluster Operator管理的CockroachDB实例

当前现象

  1. Ingress资源已创建,但ADDRESS字段为空,外部访问超时
  2. 端口转发CockroachDB Service时出现连接重置错误
  3. HAProxy Pod日志无异常,Ingress与关联Service配置表面正常

相关资源输出

Ingress列表

k get ingress -A
NAMESPACE              NAME              CLASS     HOSTS                                                     ADDRESS   PORTS   AGE
cockroachdb-instance   sql-cockroachdb   haproxy   cockroachdb.dev-service-stage.k8s.mi1.prod.cloudfire.it             80      15m

Ingress详情

k describe ingress sql-cockroachdb -n cockroachdb-instance
Name:             sql-cockroachdb
Labels:           app.kubernetes.io/component=database
                  app.kubernetes.io/instance=cockroachdb
                  app.kubernetes.io/managed-by=cockroach-operator
                  app.kubernetes.io/name=cockroachdb
                  app.kubernetes.io/part-of=cockroachdb
                  app.kubernetes.io/version=v23.1.4
                  crdb=test
Namespace:        cockroachdb-instance
Address:          
Ingress Class:    haproxy
Default backend:  <default>
Rules:
  Host                                                     Path  Backends
  ----                                                     ----  --------
  cockroachdb.dev-service-stage.k8s.mi1.prod.cloudfire.it  
                                                              cockroachdb-public:sql (10.222.19.88:26257,10.222.196.89:26257,10.222.30.93:26257)
Annotations:                                               crdb.io/last-applied:
                                                             UEsDBBQACAAIAAAAAAAAAAAAAAAAAAAAAAAIAAAAb3JpZ2luYWyMk0GT0zAMhf+LzrG3pbvQ5ki5cIEZYLgwHGRbaTxxbK+sFDqd/HfGbelsoYe9aZSn7+kpyRFGEnQoCO0RAhoKpV...
                                                           field.cattle.io/publicEndpoints:
                                                             [{\"addresses\":[\"\"],\"port\":80,\"protocol\":\"HTTP\",\"serviceName\":\"cockroachdb-instance:cockroachdb-public\",\"ingressName\":\"cockroachdb-instance...
Events:
  Type    Reason  Age                From                Message
  ----    ------  ----               ----                -------
  Normal  CREATE  28m                ingress-controller  Ingress cockroachdb-instance/sql-cockroachdb
  Normal  CREATE  28m                ingress-controller  Ingress cockroachdb-instance/sql-cockroachdb
  Normal  UPDATE  27m (x2 over 27m)  ingress-controller  Ingress cockroachdb-instance/sql-cockroachdb
  Normal  UPDATE  27m (x2 over 27m)  ingress-controller  Ingress cockroachdb-instance/sql-cockroachdb

端口转发错误日志

E0711 09:59:38.779413   43555 portforward.go:409] an error occurred forwarding 8081 -> 26258: error forwarding port 26258 to pod 8a774d302b846fdbdd7bbc6b3f35144d9712f15de9ab72d4ef9e0c8cdfa8ee85, uid : failed to execute portforward in network namespace \"/var/run/netns/cni-f1c36dc8-3647-e00e-b67e-7abb019b236b\": read tcp4 127.0.0.1:33424->127.0.0.1:26258: read: connection reset by peer

CrdbCluster配置

apiVersion: crdb.cockroachlabs.com/v1alpha1
kind: CrdbCluster
metadata:
  name: cockroachdb
spec:
  dataStore:
    pvc:
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: "20Gi"
        volumeMode: Filesystem
  resources:
    requests:
      cpu: 500m
      memory: 2Gi
    limits:
      cpu: 2
      memory: 4Gi
  tlsEnabled: true
  ingress:
    sql:
      ingressClassName: haproxy
      host: cockroachdb.dev-service-stage.k8s.mi1.prod.cloudfire.it
  image:
    name: cockroachdb/cockroach:v23.1.4
  nodes: 3
  additionalLabels:
    crdb: test

排查步骤与解决方向

1. 优先解决CockroachDB端口转发问题(可能是根源)

端口转发连接重置,大概率是Pod内部服务未正常监听或TLS配置导致的:

  • 检查Pod端口监听状态:
    k exec -n cockroachdb-instance cockroachdb-0 -- netstat -tulpn
    
    注意:CockroachDB默认SQL端口是26257,UI端口是8080,你转发的26258可能是配置错误,确认是否有进程监听目标端口。
  • 查看Pod启动日志,排查服务异常原因:
    k logs -n cockroachdb-instance cockroachdb-0
    
    重点关注TLS证书加载失败、集群节点无法加入等错误(你已启用tlsEnabled: true)。
  • 用官方客户端验证服务可用性:
    k exec -n cockroachdb-instance cockroachdb-0 -- ./cockroach sql --certs-dir=/cockroach/cockroach-certs --host=cockroachdb-public
    
    启用TLS后,普通TCP连接会被重置,必须用带证书的客户端访问。

2. 排查Ingress未分配地址问题

Ingress无ADDRESS通常是HAProxy Controller与MetalLB关联异常:

  • 检查HAProxy Controller的Service状态:
    k get svc -n haproxy-controller # 替换为你的HAProxy实际命名空间
    
    确认Service类型为LoadBalancer,且EXTERNAL-IP字段有值(属于MetalLB的IP池范围)。
  • 验证IngressClass关联关系:
    k get ingressclass haproxy -o yaml
    
    确认spec.controller字段值与HAProxy Controller的配置一致(通常为haproxy.org/ingress-controller)。
  • 检查MetalLB配置:确认IP池有可用IP,且HAProxy的LoadBalancer Service无Pending状态。
  • 过滤HAProxy Controller的Ingress相关日志:
    k logs -n haproxy-controller -l app.kubernetes.io/name=haproxy-ingress | grep sql-cockroachdb
    
    未过滤的日志可能遗漏了关键错误信息。

3. 验证CockroachDB Service可用性

  • 检查Service端点状态:
    k describe svc cockroachdb-public -n cockroachdb-instance
    
    确认Endpoints字段中所有Pod的26257端口处于Ready状态。
  • 从集群内部测试连通性:
    k run -it --rm test-pod --image=busybox -- /bin/sh
    # 在测试Pod内执行
    nc -zv cockroachdb-public.cockroachdb-instance.svc.cluster.local 26257
    
    连接失败则说明Service到Pod的链路存在问题(如TLS拦截、Pod未就绪)。

4. 检查Ingress规则的协议兼容性

CockroachDB的SQL协议是TCP协议,HAProxy Ingress默认处理HTTP流量,需配置TCP转发:

  • 在Ingress中添加TCP转发注解:
    annotations:
      haproxy.org/tcp-services: "sql:cockroachdb-instance/cockroachdb-public:26257"
    
  • 或在HAProxy Controller的ConfigMap中预先配置TCP端口映射,再通过Ingress关联该配置。

内容的提问来源于stack exchange,提问作者simone.benati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:03:04