配置nginx-ingress路由后upstream默认指向127.0.0.1:8181的问题排查
异常根因说明
出现upstream默认指向127.0.0.1:8181的问题,本质是NGINX官方Ingress控制器无法正确解析Ingress规则里关联的后端Service引用,只能回退到内置兜底后端地址,具体配置错误点如下:
- 版本兼容问题是核心诱因:你使用的
nginx/nginx-ingress:1.9.1版本,从1.9.0大版本更新开始,默认关闭了对networking.k8s.io/v1beta1版本Ingress资源的解析支持。虽然控制器能识别到Ingress的域名、路径等顶层配置、生成对应命名规则的upstream块,但因为无法匹配v1beta1版本的backend字段结构,拿不到你配置的landing服务的关联信息,就会直接将upstream的server地址设置为内置的兜底地址127.0.0.1:8181。 - 冗余配置加剧了解析异常:你在Ingress配置中同时保留了新旧两套Ingress类的标识:旧版注解
kubernetes.io/ingress.class: "nginx"和新版spec.ingressClassName: nginx字段。1.9.x版本的控制器优先识别新版的ingressClassName字段,同时存在旧注解会造成解析逻辑的顺序混乱,进一步提升backend引用解析失败的概率。
修复调整方案
- 优先将Ingress资源升级为集群当前支持的
networking.k8s.io/v1版本,调整backend结构以匹配v1版本的API规范,补充必填的pathType: Prefix字段,同时删除冗余的旧版Ingress类注解,调整后的有效配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: landing namespace: landing spec: ingressClassName: nginx rules: - host: landing.site http: paths: - path: / pathType: Prefix backend: service: name: landing port: number: 80
- 如果因为存量资源限制必须保留v1beta1版本的Ingress配置,需要在nginx-ingress控制器Deployment的启动参数列表里,追加
-enable-v1beta1-ingress-support=true参数,显式开启对旧版Ingress的解析能力。 - 调整完成后,重新查看控制器Pod内生成的nginx配置,对应upstream块的server地址会替换为landing服务对应的后端Endpoints地址(业务Pod的IP+80端口),不再出现默认的
127.0.0.1:8181地址。
内容的提问来源于stack exchange,提问作者Dmitriy Krinitsyn
相关产品推荐
相关产品推荐

