AKS集群中Ingress外部IP频繁变更的原因排查
你的Ingress IP频繁切换,核心原因是多个Ingress Controller在争抢处理同一个Ingress资源,具体细节如下:
IngressClass与Controller的匹配冲突
标准的ingress-nginx部署会创建名为nginx的IngressClass,同时Controller容器会通过--ingress-class=nginx参数声明自己监听这个类的Ingress资源。你修改部署文件时只替换了命名空间名称,但没有修改Controller的--ingress-class参数和对应的IngressClass资源名称,导致三个Controller(默认的、外部的、内部的)都在监听nginx这个IngressClass。当你把Ingress的ingressClassName设为nginx时,三个Controller会同时尝试更新该Ingress的ADDRESS字段,各自把自己的LoadBalancer IP写进去,就造成了IP频繁切换的现象。IngressClassName配置不匹配
当你设置ingressClassName: external-ingress时,由于不存在对应名称的IngressClass资源,部分Controller(比如默认的nginx类Controller)可能依然会尝试处理这个Ingress(如果没有设置严格的类匹配),导致IP时而切换到默认Controller的IP;而外部Controller因为没有监听external-ingress这个类,无法正确处理,所以IP变更后无法正常工作。
要解决这个问题,必须让每个Ingress Controller对应唯一的IngressClass,实现资源隔离:
1. 修改每个Controller的监听类参数
针对三个Controller的Deployment,分别修改容器启动参数中的--ingress-class为唯一值:
- 默认Controller(ingress-nginx命名空间):保留
--ingress-class=nginx - 外部Controller(external-ingress命名空间):改为
--ingress-class=external-nginx - 内部Controller(internal-ingress命名空间):改为
--ingress-class=internal-nginx
你可以通过以下命令修改Deployment:
kubectl edit deployment ingress-nginx-controller -n external-ingress
找到容器的args列表,添加或修改--ingress-class=external-nginx参数。
2. 创建对应名称的IngressClass资源
为每个Controller创建独立的IngressClass,确保spec.controller字段指向对应Controller的服务账号(格式为namespace/controller-serviceaccount-name)。例如,外部Controller的IngressClass YAML:
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: external-nginx spec: controller: k8s.io/ingress-nginx
注意:spec.controller的值要和Controller部署中--controller-class参数一致(默认是k8s.io/ingress-nginx,如果修改过也要对应调整)。
3. 修正Ingress资源的ingressClassName
将你的外部Ingress的ingressClassName设为external-nginx,内部Ingress设为internal-nginx,确保每个Ingress只被对应的Controller处理。
4. 验证配置
修改完成后,执行以下命令确认IngressClass和Controller的匹配状态:
kubectl get ingressclass kubectl get pods -n external-ingress -w # 查看外部Controller是否正常运行 kubectl get ing -w # 观察Ingress的ADDRESS是否稳定在对应Controller的LB IP
内容的提问来源于stack exchange,提问作者thargalin

