多节点AWS EKS集群部署绑定ELB的NGINX Ingress Controller出现节点健康检查失败
问题核心判断
你遇到的ELB健康检查部分节点失败的情况,既不是部署YAML有配置遗漏,也不需要为每个可用区单独部署一套独立的ingress-nginx-controller,问题本质非常明确:
- AWS EKS中通过K8s Service自动创建的经典ELB,默认会把集群所有节点注册为后端目标,对全部节点上对应的NodePort端口发起健康检查
- 你用来部署的TLS终止版配置文件默认是单副本Deployment,当前
ingress-nginx-controllerPod只调度到了1个节点上,只有这个节点在对应的NodePort端口有服务能响应健康检查,剩下3个没跑Pod的节点根本没在对应端口开监听,自然连续触发健康检查失败阈值,被ELB标记为不健康。
可落地的解决方法
生产场景推荐:把控制器改成DaemonSet部署
- 完全不需要拆分跨可用区的独立控制器实例,只要把原来的单副本Deployment改成DaemonSet调度就行
- 调整后集群里每个Ready节点(包括你现有的4个节点)都会自动跑一个
ingress-nginx-controllerPod,每个节点对应的NodePort端口都有正常服务响应,所有节点自然能通过ELB的健康检查 - 这种方案比拆多套独立controller的运维成本低很多,流量转发链路更短,也不会出现跨可用区配置不一致、流量路由错乱的问题
- 调整的时候可以搭配节点亲和性、容忍规则,避免控制器Pod被调度到带不可调度污点的系统节点上。
临时测试场景:手动调整ELB健康检查规则
如果只是临时测试不需要高可用,可以登AWS控制台找到对应ELB,手动修改健康检查的检测参数,匹配当前实际跑了controller的节点状态。
- 这种方案绝对不能长期用,因为单副本控制器是单点,一旦Pod漂移到其他节点,原节点的健康检查马上又会报失败。
补充注意点
如果一定要保持Deployment的部署模式不改,必须满足两个要求才能让所有节点通过健康检查:
- 控制器的副本数大于等于集群总节点数
- 配置Pod反亲和规则,保证每个节点最多调度一个控制器Pod,避免出现单节点堆多个Pod、其他节点完全没有服务的情况
内容的提问来源于stack exchange,提问作者Jérémy Octeau
相关产品推荐
相关产品推荐

