kubernetes蓝绿发布需用独立ingressclass与ingress资源隔离蓝绿环境,通过dns或负载均衡切换流量,配合标签、监控和秒级回滚保障零停机。

用 Kubernetes Ingress 实现蓝绿发布,核心是让新旧两个版本的应用同时在线、彼此隔离,再通过 Ingress 规则控制流量走向,做到秒级切换、零停机、可回滚。
关键依赖:IngressClass 与独立 Ingress 资源
蓝绿发布不能只靠一个 Ingress 对象来回改规则——那样容易出错、难审计、无法并行验证。正确做法是为蓝、绿环境分别定义独立的 IngressClass 和对应的 Ingress 资源:
- 蓝环境使用
ingressclass nginx-blue,绑定蓝版 Service(如myapp-blue-svc) - 绿环境使用
ingressclass nginx-green,绑定绿版 Service(如myapp-green-svc) - 两个 Ingress 可共用同一 Host 或 Path,但必须指向不同后端;也可用子域名区分(如
blue.example.com/green.example.com),便于灰度验证
流量切换:不改 Ingress,改入口网关或 DNS
Ingress 本身不直接承载流量,它只是路由声明。真正决定用户访问哪个版本的,是前端的流量入口。常见切换方式有:
- 云厂商负载均衡器(如 AWS ALB、Azure Application Gateway):将后端目标组从蓝集群节点池切换到绿集群节点池(适用于多集群蓝绿)
-
Ingress Controller 的 Service 类型为 LoadBalancer:蓝/绿各部署一套 ingress-nginx 控制器,各自暴露独立公网 IP;切换时只需把 DNS A 记录(如
app.example.com)从蓝 IP 改为绿 IP - 借助外部 API 网关或 CDN:在网关层配置路由策略,将 100% 流量转发至绿版 Ingress 的 host/path
配套保障:标签、监控与回滚准备
光切流量不够,还得确保能快速响应异常:
- 蓝/绿 Deployment 必须带明确环境标签(如
env: blue/env: green),方便 Service 选择和 Prometheus 按环境打点 - 绿环境上线后,立即用真实请求验证健康端点(
curl http://green-ip/healthz)、关键接口、日志链路和监控指标(QPS、错误率、延迟) - 回滚不是“重跑脚本”,而是“切回原 DNS 或负载均衡后端”——整个过程应在 30 秒内完成,无需重建 Pod 或等待滚动更新
进阶提示:避免常见陷阱
实际落地中容易踩坑的地方:
- 不要复用同一个 IngressClass 名称部署两套控制器——会导致资源冲突和路由混乱
- 蓝绿环境的 ConfigMap/Secret 必须完全一致(除非版本本身需要变更),否则行为差异会掩盖真实问题
- 如果用了 cert-manager,确保蓝/绿 Ingress 都能正常申请或复用 TLS 证书;建议用通配符证书或提前签发双份
- Session 亲和性(sticky session)需关闭或统一由 Ingress Controller 层处理,避免用户在切换瞬间被踢出登录态











