如何从stable/nginx-ingress无缝迁移至kubernetes/ingress-nginx?
零停机迁移Ingress Controller至新版kubernetes/ingress-nginx的解决方案
方案一:让新旧控制器同时监听旧Ingress资源
这是实现双控制器并行路由的核心方案,通过配置新控制器兼容旧Ingress的instanceClassName,确保过渡期间流量不中断:
- 部署新控制器时,通过Helm values配置让它同时监听
nginx和nginx2两个Ingress类:controller: ingressClassResource: name: nginx2 default: false watchIngressWithoutClass: false extraArgs: --watch-ingress-classes=nginx,nginx2 - 部署完成后,直接访问新控制器的ELB对应域名,验证其能正常处理旧Ingress的请求
- 调整DNS记录,逐步将流量切到新ELB(比如先设置50%流量权重,观察无异常后拉满;或把DNS TTL设为30秒以内加速生效)
- 批量更新所有Ingress资源的
instanceClassName为nginx2,命令示例:kubectl patch ingress --all -p '{"spec":{"ingressClassName":"nginx2"}}' - 监控旧控制器的请求量,确认无流量残留后,删除旧控制器和旧IngressClass
方案二:双Ingress并行部署
为每个服务维护两份Ingress配置,分别绑定新旧控制器,实现流量隔离并行:
- 对现有每个绑定
instanceClassName: nginx的Ingress,复制一份新Ingress,将instanceClassName改为nginx2,配置规则完全一致 - 部署新控制器后,验证新Ingress能正常路由对应服务的流量
- 更新DNS指向新ELB,此时新旧ELB分别处理对应Ingress的流量,无停机风险
- 等待DNS完全生效(可通过
nslookup等工具确认),再删除旧Ingress和旧控制器
关键注意事项
- 确保新旧控制器的核心配置一致:SSL证书挂载、rewrite规则、超时参数、限流策略等,避免流量切换后出现服务异常
- 迁移过程中实时监控两个控制器的QPS、错误率、响应时间等指标,确保服务状态稳定
- 先在测试环境完整验证迁移流程,确认无问题后再推广到生产环境
内容的提问来源于stack exchange,提问作者Myles Merrell
相关产品推荐
相关产品推荐

