蓝绿金丝雀部署
策略对比
| 策略 | 工作方式 | 回滚 | 成本 | 风险 |
|---|---|---|---|---|
| 重建 | 停止旧版,启动新版 | 重新部署旧版本 | 低 | 高(停机) |
| 滚动更新 | 逐步替换 Pod | kubectl 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