蓝绿金丝雀部署

策略对比

策略工作方式回滚成本风险
重建停止旧版,启动新版重新部署旧版本高(停机)
滚动更新逐步替换 Podkubectl rollout undo
蓝绿两套相同环境,切换流量即时(切回蓝色)高(2 倍基础设施)
金丝雀逐步流量切换(1%→10%→100%)将 0% 路由到新版本
影子镜像流量到新版本;不影响用户不适用(非生产)极低
A/B 测试将特定用户路由到不同版本修改路由规则

Kubernetes 蓝绿部署

# blue-deployment.yaml(当前生产) apiVersion: apps/v1 kind: Deployment metadata: name: app-blue labels: version: blue spec: template: metadata: labels: app: myapp version: blue spec: containers: - image: myapp:v1.0.0 # service.yaml — 指向蓝色 apiVersion: v1 kind: Service spec: selector: app: myapp version: blue # <-- 改为 "green" 完成切换 # 步骤: # 1. 部署绿色版本(image: v2.0.0) # 2. 内部测试绿色版本 # 3. 将 service selector 改为 version: green # 4. 监控 # 5. 绿色版本稳定后删除蓝色

Nginx Ingress 金丝雀

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-canary annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" # 10% 流量 # 或基于请求头: # nginx.ingress.kubernetes.io/canary-by-header: "X-Canary" # nginx.ingress.kubernetes.io/canary-by-header-value: "true" spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: myapp-v2 port: number: 80