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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:47:30