如何将Ingress-nginx的externalIPs设置为仅单个指定节点IP
问题原因
你之前的配置不生效核心是两个原因:
- ConfigMap里的
bind-address参数控制的是Nginx进程在Pod内部的监听绑定地址,属于Pod内的应用层配置,和Service层面对外宣告的externalIPs完全无关,修改这个参数不会改变对外暴露的IP列表。 - 你使用的云场景部署模板默认开启了Service配置自动调和逻辑:Ingress Nginx控制器启动时携带的
--publish-service参数,会持续将所有运行Ingress控制器Pod的节点IP同步到ingress-nginx-controllerService的externalIPs、Endpoints字段,你手动修改的配置会被这个自动逻辑覆盖,所以修改后过段时间就会恢复为所有节点IP。
可行方案
方案1:替换为裸金属场景部署包(最稳定,无自动回滚逻辑)
云场景部署包本身的设计目标就是对接云厂商负载均衡、自动同步所有节点流量入口,不适合你要固定单IP的场景,直接替换为裸金属版本即可:
- 先完整清理当前已部署的云版本Ingress Nginx资源,避免残留webhook、配置资源影响新部署。
- 部署v1.2.0版本对应的裸金属场景Ingress Nginx部署清单,该版本清单没有强制同步所有节点IP的逻辑。
- 部署完成后执行
kubectl edit svc ingress-nginx-controller -n ingress-nginx编辑Service,在spec段下添加你需要的单个externalIP配置:
spec: externalIPs: - 192.168.30.16
保存退出后配置会持久生效,不会被自动覆盖。
方案2:保留现有部署,关闭自动IP同步逻辑
如果不想重装现有Ingress Nginx,可以直接关停自动同步IP的逻辑:
- 执行
kubectl edit deploy ingress-nginx-controller -n ingress-nginx编辑控制器Deployment,找到容器的args启动参数段,删除--publish-service=$(POD_NAMESPACE)/ingress-nginx-controller这一行,保存后等待控制器Pod滚动重启完成。 - 再次编辑
ingress-nginx-controllerService,将externalIPs修改为你需要的单个IP即可,后续不会再被自动回滚。
注意:该方案下如果Ingress控制器Pod因为节点故障、调度等原因漂移到其他节点,Service不会自动更新对外IP,建议搭配节点亲和规则使用。
方案3:搭配节点亲和固定控制器调度位置
为了避免Pod漂移导致单IP访问不通,建议在完成上述配置后,给Ingress Nginx控制器Pod添加节点亲和规则,强制Pod只调度到你指定的目标节点(也就是你配置的externalIP对应的节点):
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - 替换为目标节点的主机名
配置后控制器Pod只会运行在你指定的单节点上,配合单个externalIP配置即可完全满足单入口访问的需求。
内容的提问来源于stack exchange,提问作者Linh Nguyen
相关产品推荐
相关产品推荐

