You need to enable JavaScript to run this app. K8s Nginx Ingress Controller随机404及证书识别故障咨询
优惠活动
大模型
产品
解决方案
定价
更多

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增加唯一标识标签,避免和集群内其他同类型实例的标签重叠:
    1. 在Deployment的Pod模板标签中,增加如ingress-nginx/instance-id: dedicated-test的唯一值标签
    2. 同步修改对应Service的selector规则,仅匹配带该唯一标签的Pod,确保Service的Endpoints列表仅包含当前部署的Controller实例
  • 调整两个共存Ingress Controller实例的配置,避免资源冲突:
    1. 为不同实例配置差异化的--election-id参数值,避免集群锁竞争
    2. 为不同实例配置差异化的--ingress-class参数值,避免Ingress规则加载冲突
  • 调整完成后重新检查Endpoints列表,确认仅存在当前实例的Pod IP,连续执行多次请求验证返回结果一致性。

内容的提问来源于stack exchange,提问作者oandersonm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 05:36:05