【云原生实战】微服务试错成本极高?基于 Nginx Ingress 流量权重的灰度发布解法
在传统的应用更新模式中,发版往往是“一刀切”的覆盖。一旦新版本(v2)存在严重的内存泄漏或逻辑 Bug,所有线上用户都会受到影响,紧急回滚也会造成长达数分钟的业务中断。
标准的云原生工程解法是:拒绝全量发布,利用网关层的金丝雀发布(Canary Deployment)进行小流量“试毒”。
1. 部署并行的新版本后端(Deployment)
不要直接修改线上原有 v1 版本的 Deployment。在同一个 Namespace 下,独立部署一个全新的 v2 版本 Deployment,并为其创建一个独立的 Service(如 app-svc-v2)。此时,v2 版本已经运行在云端,但没有任何外部流量进入。
2. 注入 Ingress Canary 注解(Annotations)
K8s 官方的 Nginx Ingress 原生支持流量分割。我们需要新建一个同域名、同路径的 Ingress 路由规则,并在 annotations 中开启灰度标记。 以下 YAML 演示了如何将线上 10% 的真实流量悄悄导入 v2 版本:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress-canary-v2
annotations:
kubernetes.io/ingress.class: nginx
# 💡 核心:开启金丝雀发布引擎
nginx.ingress.kubernetes.io/canary: "true"
# 💡 核心:强制分配 10% 的流量到当前后端
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
rules:
- host: api.myhuaweicloud.com
http:
paths:
- path: /user
pathType: Prefix
backend:
service:
name: app-svc-v2 # 指向新版本的 Service
port:
number: 8080
3. 基于请求头的定向流量路由
除了按随机比例引流,你还可以针对特定的测试账号或内部员工进行定向灰度。只需修改 annotations,通过 HTTP Header 进行精准拦截:
nginx.ingress.kubernetes.io/canary: "true"
# 只要 HTTP 请求头包含 X-Env: beta,流量全部打入 v2
nginx.ingress.kubernetes.io/canary-by-header: "X-Env"
nginx.ingress.kubernetes.io/canary-by-header-value: "beta"
总结: 灰度发布是将“研发风险”与“用户体验”彻底解耦的关键技术。通过将流量路由策略下沉至 Ingress 代理层,我们无需在业务代码中植入任何丑陋的 if/else 开关,即可用极低的运维成本实现平滑的版本迭代,将发版事故的爆炸半径控制在最小范围。
- 点赞
- 收藏
- 关注作者
评论(0)