Nginx Ingress中ClickHouse TCP 9000端口连接失败排查
问题分析与解决步骤
核心问题:你错误地使用HTTP类型的Ingress资源来配置TCP端口转发——Nginx Ingress Controller的TCP/UDP转发机制和HTTP Ingress完全独立,不需要创建Ingress资源,而是依赖你已经配置的tcp参数,再配合正确的客户端连接方式。
1. 删除无效的HTTP Ingress资源
你创建的ingress-test-clickhouse-native是HTTP协议的Ingress,它只会把HTTP请求转发到ClickHouse的9000端口,这就是浏览器访问返回提示的原因,而clickhouse-client使用的是原生TCP协议,这个Ingress完全无法处理这类流量。执行命令删除:
kubectl delete ingress ingress-test-clickhouse-native
2. 确认TCP转发配置生效
检查Nginx Controller的TCP配置ConfigMap(默认在ingress-nginx命名空间,名称为ingress-nginx-controller-tcp),确认其中包含以下条目:
9000: "test-clickhouse-operator/clickhouse-test-chi-speed:9000"
如果你是通过Helm部署的,之前在values.yaml中添加的配置应该已经自动生成这个ConfigMap,若未生效,重新执行Helm升级:
helm upgrade ingress-nginx ingress-nginx/ingress-nginx -n ingress-nginx -f values.yaml
3. 调整客户端连接方式
现在Nginx Controller的外部IP(an.external.ip)的9000端口已经直接转发到ClickHouse服务的9000端口,需要做两步操作:
- 将域名
clickhousenative.staging.mydomain.com解析到Nginx Controller的外部IPan.external.ip - 使用
clickhouse-client连接时,明确指定9000端口(即使默认是9000,也要显式声明,避免域名解析后默认走HTTP端口的误解):clickhouse-client -h clickhousenative.staging.mydomain.com --port 9000
4. 验证转发链路
先跳过域名,直接用Nginx的外部IP测试,排查问题:
clickhouse-client -h an.external.ip --port 9000
- 如果能正常连接:说明TCP转发配置没问题,问题出在域名解析环节
- 如果连接失败:检查集群节点的NodePort(32033)是否开放了TCP流量,或者防火墙/安全组是否限制了9000端口的外部访问
内容的提问来源于stack exchange,提问作者dummydeveloper
相关产品推荐
相关产品推荐

