Kubernetes中运行的Ingress能否无停机重配置?业务迁移场景咨询
把service.domain.com无缝迁移到service_new_one的Ingress方案
嘿,我看你尝试直接修改旧Ingress的后端服务来完成迁移,但这种方式很容易踩坑——比如现有长连接突然中断、用户的旧书签/链接没法平滑过渡,或者新服务没准备好处理根路径的请求。下面给你几个更稳妥的方案,按需选择:
方案1:HTTP重定向(平滑过渡首选)
别直接改旧Ingress的后端,先给service.domain.com加个重定向规则,把所有请求转到service_one.domain.com/one,同时保留旧后端一段时间(兼容那些没更新的老客户端):
# 更新后的Ingress1_legacy配置 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress1-legacy annotations: # 永久重定向(适合正式迁移,告诉浏览器缓存这个规则) nginx.ingress.kubernetes.io/permanent-redirect: "https://service_one.domain.com/one$request_uri" # 如果是测试阶段,用临时重定向(不缓存): # nginx.ingress.kubernetes.io/temporary-redirect: "https://service_one.domain.com/one$request_uri" spec: rules: - host: service.domain.com http: paths: - path: / pathType: Prefix backend: service: name: service_legacy # 留着旧后端,避免直接断开老请求 port: number: 80
这样用户访问旧域名会自动跳转到新服务地址,旧服务还能兜底处理没被重定向的请求。等所有流量都迁到新服务后,再删掉旧Ingress就行。
方案2:金丝雀发布(无URL变更,逐步切流量)
如果你不想改用户访问的URL,只是想让旧域名的流量直接到新服务,又怕直接改Ingress导致流量中断,可以用金丝雀Ingress慢慢切流量:
- 先建个金丝雀Ingress,把10%的流量导去新服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress1-canary annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" # 这里可以调比例,比如从10%到50%再到100% spec: rules: - host: service.domain.com http: paths: - path: / pathType: Prefix backend: service: name: service_new_one port: number: 80
- 观察一段时间,确认新服务运行正常后,慢慢把
canary-weight调到100%,之后就可以删掉旧的Ingress1_legacy和金丝雀Ingress,或者直接修改原Ingress的后端。
方案3:直接修改原Ingress后端(无兼容需求)
如果你确定不需要兼容旧服务,直接改原Ingress的后端也可以,但要注意两点:
- 确保
service_new_one能处理所有来自service.domain.com的请求(比如根路径/的请求,而不只是/one) - 修改Ingress后,Ingress Controller会重新加载配置,可能有几秒的流量波动,建议在低峰期操作
修改后的配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress1-legacy spec: rules: - host: service.domain.com http: paths: - path: / pathType: Prefix backend: service: name: service_new_one port: number: 80
最后再提醒几个注意点:
- 改完配置后,去Ingress Controller的日志里看看,确保配置加载成功了
- 测试下各种请求(比如POST、带参数的GET),确保重定向或后端映射都正常
- 如果用HTTPS,记得新域名的证书要包含
service.domain.com,或者用通配符证书
内容的提问来源于stack exchange,提问作者Markward Schubert
相关产品推荐
相关产品推荐

