Kubernetes环境下HAProxy负载均衡TCP服务无法正常转发的问题排查
解决HAProxy Ingress TCP服务长期访问的问题
你完全没有误解HAProxy的TCP ConfigMap配置——它已经能正常跟随Pod扩缩容更新转发规则了。真正的问题是:你目前只用了临时的kubectl port-forward来暴露HAProxy Ingress Controller,这本来就只是调试用的手段,长期方案需要把Ingress Controller本身通过稳定的Service暴露给外部。
下面是具体的解决步骤:
1. 确认HAProxy Ingress Controller的端口配置
首先要确保你的HAProxy Ingress Controller Pod已经监听了ConfigMap里定义的9000端口。检查Ingress Controller的Deployment/DaemonSet配置,确保容器部分包含以下端口声明:
containers: - name: haproxy-ingress # ...其他配置 ports: # ...原有端口(比如HTTP/HTTPS的80、443) - name: tcp-9000 containerPort: 9000 protocol: TCP
同时要确认Ingress Controller的启动参数里已经指定了TCP ConfigMap,比如:
args: # ...其他参数 --configmap-tcp-services=default/tcp-services
2. 创建NodePort Service暴露HAProxy的TCP端口
因为你没有云厂商的LoadBalancer支持,NodePort是最适合裸金属/私有集群的长期暴露方案。创建一个Service,把Ingress Controller的9000端口映射到集群节点的固定端口(默认范围30000-32767):
apiVersion: v1 kind: Service metadata: name: haproxy-ingress-tcp # 注意:这里的命名空间要和HAProxy Ingress Controller所在的命名空间一致,比如默认是haproxy-ingress namespace: default spec: type: NodePort selector: # 这里的标签要完全匹配HAProxy Ingress Controller Pod的标签,比如默认标签是app=haproxy-ingress app: haproxy-ingress ports: - name: tcp-9000 port: 9000 targetPort: 9000 protocol: TCP # 可选:指定固定的NodePort(比如30001),不指定的话集群会自动分配 # nodePort: 30001
3. 验证稳定访问
创建完成后,执行kubectl get service haproxy-ingress-tcp查看分配的NodePort,比如输出可能是:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE haproxy-ingress-tcp NodePort 10.96.xxx.xxx <none> 9000:30001/TCP 5m
这时你就可以通过任意集群节点IP:30001来访问你的TCP服务了——不管Ingress Pod怎么扩缩容、重启,这个访问地址都是稳定的。
额外注意事项
- 如果是多节点集群,要确保所有节点的NodePort(比如30001)都能被外部网络访问(防火墙需要开放对应端口)。
- 如果你用DaemonSet部署HAProxy Ingress(裸金属场景常见),也可以考虑用HostPort直接在每个节点上暴露9000端口,但HostPort存在端口冲突风险,NodePort更灵活。
- 再确认下你的TCP ConfigMap配置:格式是
外部端口: 命名空间/服务名:服务端口,如果你的prokittest服务在default命名空间,那配置应该是9000: "default/prokittest:25565",你之前写的cosmoage/prokittest如果是命名空间错误,需要修正,但根据你说haproxy.cfg会自动更新,大概率是正确的。
内容的提问来源于stack exchange,提问作者ChuYong
相关产品推荐
相关产品推荐

