Kubernetes中CockroachDB集群无法外部访问问题排查
问题分析与解决
这个现象完全不正常,核心问题出在TCP协议转发的配置逻辑和Ingress的认知误区上,具体错误点和修复步骤如下:
一、Ingress无法分配IP的原因
HAProxy Ingress Controller作为集群统一的流量网关,所有Ingress资源都会复用它的LoadBalancer IP(即你看到的172.20.15.81),不会为每个Ingress单独分配独立IP。你遇到的Ingress无IP问题,大概率是以下两种情况:
- 你的Ingress资源未指定正确的
ingressClassName,导致HAProxy无法识别(需和HAProxy Controller的class一致,通常为haproxy); - 对Ingress的作用理解有误:TCP协议转发不需要依赖Ingress的规则配置,Ingress本身仅用于HTTP/HTTPS流量,TCP转发需直接通过HAProxy的端口映射完成。
二、404错误的核心原因
404是典型的用HTTP方式访问TCP端口导致的错误:CockroachDB的26257端口是纯TCP协议(用于SQL客户端、集群通信),不处理HTTP请求。你用浏览器或HTTP工具访问该端口,自然会返回404。
三、修复步骤
1. 修正HAProxy的TCP端口映射配置
如果是通过Helm部署的HAProxy,需要在values.yaml中明确绑定26257端口到CockroachDB的对外Service:
tcp: # 格式:"目标命名空间/Service名称:Service端口" 26257: "default/crdb-cluster-public:26257"
- 替换
default为你的CockroachDB集群所在命名空间; crdb-cluster-public是Operator默认创建的对外Service,可通过kubectl get svc确认名称。
然后重新部署Helm Chart:
helm upgrade helm-chart-haproxy haproxy-ingress/haproxy-ingress -f values.yaml
2. 验证Ingress资源(可选)
如果需要保留Ingress资源用于标识或后续HTTP流量(如CockroachDB控制台),需确保Ingress指定了正确的ingressClassName:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: crdb-ingress spec: ingressClassName: haproxy # 必须和HAProxy Controller的class一致 rules: - host: your-dns-domain http: paths: - path: / pathType: Prefix backend: service: name: crdb-cluster-public port: number: 8080 # 控制台端口,仅用于HTTP访问
3. 正确访问CockroachDB
使用TCP客户端直接连接域名的26257端口,比如:
cockroach sql --host=your-dns-domain --port=26257
不要用浏览器或HTTP工具访问26257端口,这不符合该端口的协议规范。
4. 额外检查点
- 确认
crdb-cluster-publicService的端点正常:kubectl get ep crdb-cluster-public,需显示所有集群节点的IP和端口; - 检查外部网络是否能访问
172.20.15.81:26257,排除防火墙、安全组的端口拦截。
内容的提问来源于stack exchange,提问作者simone.benati
相关产品推荐
相关产品推荐

