Ingress 本身仅支持七层 HTTP/HTTPS 流量,TCP/UDP 四层转发由 ingress-nginx 控制器通过 --tcp-services-configmap 和 --udp-services-configmap 参数配合对应命名空间内的 ConfigMap 实现,需在控制器 Deployment 和 Service 中同步配置端口映射。

Kubernetes Ingress 本身只处理 HTTP/HTTPS(七层)流量,不支持 TCP/UDP 四层转发。真正实现 TCP/UDP 代理的是 ingress-nginx 控制器(即 nginx-ingress-controller 这个 Pod),它在标准 Ingress 功能之外,额外提供了基于 ConfigMap 的四层服务映射能力。
TCP/UDP 转发的核心机制
ingress-nginx 控制器通过两个启动参数启用四层支持:
- --tcp-services-configmap:指定一个 ConfigMap,定义外部端口 → 后端 Service 的映射关系(TCP)
- --udp-services-configmap:同上,用于 UDP 流量
这两个 ConfigMap 必须位于与控制器 Pod 相同的命名空间(通常是 ingress-nginx 或 kube-system),且控制器启动时已加载对应参数,否则配置无效。
配置 TCP 服务转发(以 MySQL 为例)
假设你有一个运行在 default 命名空间、名为 mysql 的 Service,监听端口 3306,希望对外暴露为 3306(也可自定义,如 3307):
- 编辑或创建 ConfigMap(如名为
tcp-services):
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
"3306": "default/mysql:3306"
注意:
• 键是 控制器监听的外部端口(字符串格式,带引号)
• 值格式为 "
• 不需要写协议或路径,仅做端口透传
- 确保
ingress-nginx-controllerDeployment 中包含启动参数:--tcp-services-configmap=ingress-nginx/tcp-services - 修改
ingress-nginx-controller的 Service(类型通常为LoadBalancer或NodePort),显式添加该端口:
- name: mysql
port: 3306
targetPort: 3306
protocol: TCP
如果是 NodePort 类型,Kubernetes 会自动分配 nodePort;如果是云厂商 LoadBalancer,需确保 SLB 安全组放行该端口。
配置 UDP 服务转发(以 DNS 为例)
类似 TCP,但使用 udp-services ConfigMap:
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
data:
"53": "kube-system/kube-dns:53"
同时确认控制器启动参数含:--udp-services-configmap=ingress-nginx/udp-services
并在控制器 Service 中添加 UDP 端口定义:
port: 53
targetPort: 53
protocol: UDP
验证与排错要点
- 检查控制器 Pod 日志是否报错加载 ConfigMap,例如:
failed to list configmaps或invalid format in tcp-services - 进入控制器容器执行
ps aux | grep nginx,确认启动命令中确实包含--tcp-services-configmap等参数 - 查看生成的
nginx.conf(通常在/etc/nginx/nginx.conf),搜索server { listen 3306,确认存在对应proxy_pass upstream_balancer块 - 确保后端 Service 的
clusterIP非None(Headless Service 需额外测试连通性),且targetPort与实际 Pod 监听端口一致











