K8s Nginx Ingress Controller随机404及证书识别故障咨询
Nginx Ingress随机返回404与正常业务响应的定位修复
故障核心特征
对比两次完全相同的请求返回结果,可直接锁定问题方向:
- 正常响应使用自定义配置的
test.internal证书,返回业务200状态码 - 404响应使用Ingress内置的默认假证书(O=Acme Co; CN=Kubernetes Ingress Controller Fake Certificate),返回Nginx默认404页面
- 故障无固定复现规律,相同请求随机返回两种结果
结合你当前Deployment设置1个副本的前提,该现象是Service标签选择器配置过宽,意外命中集群内其他同标签的Ingress Controller Pod作为后端端点导致的。
排查验证步骤
- 查看当前Service的实际后端端点列表
执行命令:kubectl get endpoints ingress-nginx-controller -n kube-system -o wide
正常情况下副本数为1时,端点列表应仅包含1个Pod IP。若出现2个及以上IP地址,即可确认选择器命中了其他无关Pod。 - 反向查询所有匹配Service选择器的Pod
执行命令:kubectl get pods -n kube-system -l app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/component=controller -o wide
列表中不属于当前部署实例的Pod,就是异常端点的来源。 - 冲突机制验证:若两个同标签的Ingress Controller实例使用相同的选举ID、相同的Ingress Class配置,仅获得集群选举锁的实例会加载业务Ingress规则、生成正式Nginx配置;未获得锁的实例会保持默认Nginx配置,无任何转发规则、使用内置默认证书,所有请求均返回404,与你观测到的现象完全吻合。
修复方案
- 为当前部署的Ingress Controller增加唯一标识标签,避免和集群内其他同类型实例的标签重叠:
- 在Deployment的Pod模板标签中,增加如
ingress-nginx/instance-id: dedicated-test的唯一值标签 - 同步修改对应Service的selector规则,仅匹配带该唯一标签的Pod,确保Service的Endpoints列表仅包含当前部署的Controller实例
- 在Deployment的Pod模板标签中,增加如
- 调整两个共存Ingress Controller实例的配置,避免资源冲突:
- 为不同实例配置差异化的
--election-id参数值,避免集群锁竞争 - 为不同实例配置差异化的
--ingress-class参数值,避免Ingress规则加载冲突
- 为不同实例配置差异化的
- 调整完成后重新检查Endpoints列表,确认仅存在当前实例的Pod IP,连续执行多次请求验证返回结果一致性。
内容的提问来源于stack exchange,提问作者oandersonm
相关产品推荐
相关产品推荐

