Kubernetes 1.16下Nginx Ingress(0.26.1)暴露Mariadb TCP服务失败求助
解决Nginx Ingress暴露Mariadb TCP服务无法外部连接的问题
问题回顾
你尝试通过Nginx Ingress Controller暴露default命名空间下的Mariadb ClusterIP Service,已经完成了tcp-services ConfigMap配置,且控制器日志显示已读取该配置,但外部客户端连接时报错:ERROR 2002 (HY000): Can't connect to MySQL server。
已确认的正确配置
先梳理你已经做对的部分:
- Ingress Controller启动参数正确指定了TCP配置映射:
--tcp-services-configmap=nginx-ingress/tcp-services - tcp-services ConfigMap配置无误,正确将端口3306映射到
default/mariadb:3306:apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: nginx-ingress data: 3306: "default/mariadb:3306" - Nginx生成的TCP服务配置符合预期,已经在控制器内部监听3306端口并代理到对应上游服务
核心问题:Ingress Controller Service未暴露TCP端口
你之前遗漏了关键一步:需要在Nginx Ingress Controller的NodePort Service中添加对应TCP端口的映射。Ingress Controller内部监听了3306端口,但如果没有通过Service把这个端口暴露到集群节点上,外部流量根本无法到达控制器的监听端口。
你补充的Service配置正好解决了这个问题:
apiVersion: v1 kind: Service metadata: name: nginx-ingress-controller spec: externalTrafficPolicy: Cluster ports: - name: http port: 80 protocol: TCP targetPort: http - name: https port: 443 protocol: TCP targetPort: https - name: 3066-tcp port: 3066 protocol: TCP targetPort: 3066-tcp selector: app: nginx-ingress component: controller release: nginx-ingress sessionAffinity: None type: NodePort
这里新增的端口映射将集群节点的3066端口转发到Ingress Controller Pod的3066-tcp端口(对应控制器内部监听的3306端口,应该是你在控制器部署中定义的端口别名),外部客户端现在可以通过集群节点IP:3066访问Mariadb服务。
额外排查建议(供其他遇到类似问题的参考)
如果以后再遇到类似TCP服务暴露问题,还可以从这些方向排查:
- 检查集群节点的防火墙/安全组是否开放了对应的NodePort(比如这里的3066)
- 在Ingress Controller Pod内部测试上游连通性:
确认控制器能正常访问Mariadb Servicekubectl exec -n nginx-ingress <你的控制器Pod名称> -- mysql -h mariadb.default.svc.cluster.local -P 3306 -u <Mariadb用户名> -p - 确认Mariadb Service的端口配置正确,且Pod处于Running状态
- 检查外部客户端的网络是否能到达集群节点(比如是否有公网访问权限、是否在同一VPC等)
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

