Kubernetes中NGINX Ingress暴露TCP服务的闲置连接问题
NGINX Ingress Controller 持续建立后端TCP连接的原因与解决方法
原因分析
你看到的这些定期刷新的ESTABLISHED连接,是NGINX Ingress Controller针对TCP服务的主动健康检查机制导致的:
- 默认情况下,Ingress Controller会定期向后端服务发起TCP连接,以此验证服务是否正常可用,确保后续客户端流量能被正确转发。
- 3条连接大概率和你Ingress Controller的副本数对应,每个副本会独立发起健康检查请求;端口每隔几秒刷新,是因为每次健康检查会使用新的源端口发起连接。
- 即便没有客户端流量,这个主动检查也会持续运行,属于Ingress Controller保障服务可用性的默认行为。
解决方法
根据你的需求,有几种调整方式可选:
1. 调整健康检查间隔(推荐)
通过修改TCP服务对应的ConfigMap,延长健康检查的时间间隔,减少连接建立的频率:
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx # 替换为你的Ingress Controller所在命名空间 data: "外部端口": "default/sample-go-app:8080" # 添加健康检查间隔配置,比如设置为30秒(默认是5秒) "外部端口-health-check-interval": "30s"
修改完成后,重启Ingress Controller Deployment让配置生效:
kubectl rollout restart deployment <ingress-controller-deployment-name> -n <ingress-namespace>
2. 关闭主动健康检查(谨慎使用)
如果你的集群已经通过其他机制(比如Kubernetes的livenessProbe/readinessProbe)监控后端服务状态,可以关闭Ingress Controller的主动TCP健康检查:
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: "外部端口": "default/sample-go-app:8080" # 关闭主动健康检查 "外部端口-health-check": "off"
注意:关闭主动检查后,Ingress Controller无法及时感知后端服务的TCP层面故障,可能导致流量转发失败,仅在你有可靠替代监控方案时使用。
3. 改用被动健康检查
被动健康检查不主动发起连接,而是通过监控后端连接的失败次数来标记服务状态。可以在ConfigMap中配置相关参数替换主动检查:
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: "外部端口": "default/sample-go-app:8080" # 启用被动健康检查 "外部端口-passive-health-check": "on" # 设置失败阈值,比如连续5次失败标记服务不可用 "外部端口-passive-health-check-fail-threshold": "5"
内容的提问来源于stack exchange,提问作者SanVEE
相关产品推荐
相关产品推荐

