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

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-public Service的端点正常:kubectl get ep crdb-cluster-public,需显示所有集群节点的IP和端口;
  • 检查外部网络是否能访问172.20.15.81:26257,排除防火墙、安全组的端口拦截。

内容的提问来源于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 12:14:53