You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为AKS中的ingress-nginx控制器无停机切换至新静态IP?

如何为AKS中的ingress-nginx控制器无停机切换至新静态IP?

我来分享几个亲测有效的零停机切换方案,完美解决你担心的DNS缓存导致用户访问中断的问题:

方案一:双Ingress控制器并行切换(最稳妥的零停机方式)

这个思路和你想到的方向一致,通过让新旧两个Ingress控制器同时运行,实现流量的平滑过渡,具体步骤拆解如下:

  1. 准备新的环境变量
    先把新的静态IP和集群节点资源组(和旧控制器配置保持一致)定义好:
newStaticIp=5.6.7.8
myNodeRg=MC_foobar_eastus
  1. 部署全新的Ingress控制器
    用Helm部署一个和旧控制器配置几乎完全一致的新实例,唯一区别是绑定新静态IP,暂时不要将其设为默认IngressClass(避免自动抢占现有Ingress资源):
helm upgrade --install ingress-nginx-new ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.ingressClassResource.name=nginx \
  --set controller.ingressClassResource.enabled=true \
  --set controller.ingressClassResource.default=false \
  --set controller.service.loadBalancerIP=$newStaticIp \
  --set controller.service.annotations.service\.beta\.kubernetes\.io/azure-load-balancer-resource-group=$myNodeRg
  1. 验证新控制器状态
    等新控制器的Pod全部进入Running状态后,检查Service的外部IP是否成功绑定到你设置的新静态IP:
kubectl get svc ingress-nginx-new-controller -n ingress-nginx
  1. 更新DNS指向新IP
    把你的域名DNS记录更新为指向新的静态IP。这时候因为DNS缓存的存在,一部分用户会继续访问旧IP,一部分已经切换到新IP——但两个控制器都在正常处理流量,完全不用担心用户断网。

  2. 等待DNS缓存完全过期
    根据你DNS记录设置的TTL值,等待足够长的时间(通常建议24-48小时,覆盖绝大多数客户端的缓存周期),确保所有用户的流量都已经切换到新IP。

  3. 安全清理旧控制器
    确认旧控制器已经没有流量流入后,就可以放心卸载它了:

helm uninstall ingress-nginx --namespace ingress-nginx

如果需要统一命名,之后也可以把新控制器重命名为原来的ingress-nginx。

为什么不直接原地更新?

你说得完全没错,直接修改旧控制器的静态IP并重新运行Helm命令,会触发Azure负载均衡器的重新配置——这个过程中旧IP会被释放、新IP绑定,短时间内会出现流量中断;再加上DNS缓存的存在,部分用户会在缓存有效期内访问旧IP失败,完全达不到零停机的要求。

额外注意事项

  • 确保新的静态IP和AKS集群处于同一区域,如果IP不在集群默认资源组,一定要正确设置azure-load-balancer-resource-group注解。
  • 双控制器运行期间,集群的CPU和内存消耗会临时翻倍,要提前确保集群有足够的资源余量。
  • 切换过程中可以多监控两个控制器的日志和流量指标,确保所有请求都被正常处理。

备注:内容来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:48:07