结合一个实例,讲讲蓝绿发布
还是用 fleet-api 举例。蓝绿发布的核心思路和金丝雀不同——不是逐步切流量,而是一次性全切,但切换前新版本已经完全就绪。
概念先理解清楚
蓝(Blue)= 当前线上版本 v1,承载全部流量 绿(Green)= 新版本 v2,在后台完全准备好,但不接流量 切换时:Service 的 selector 从蓝切到绿,流量瞬间 100% 转移
第一步:当前蓝色环境正在运行
yaml
# deployment-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fleet-api-blue
namespace: fleet
spec:
replicas: 3
selector:
matchLabels:
app: fleet-api
slot: blue
template:
metadata:
labels:
app: fleet-api
slot: blue
spec:
containers:
- name: fleet-api
image: fleet-api:v1
Service 指向蓝:
yaml
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: fleet-api
namespace: fleet
spec:
selector:
app: fleet-api
slot: blue # ← 关键,当前指向蓝
ports:
- port: 80
targetPort: 8080
此时状态:
流量 → Service(slot=blue) → fleet-api-blue Pod Pod Pod
fleet-api-green(不存在)
第二步:部署绿色环境,但不接流量
yaml
# deployment-green.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: fleet-api-green
namespace: fleet
spec:
replicas: 3
selector:
matchLabels:
app: fleet-api
slot: green
template:
metadata:
labels:
app: fleet-api
slot: green # ← slot=green,Service 现在选不到它
spec:
containers:
- name: fleet-api
image: fleet-api:v2
bash
kubectl apply -f deployment-green.yaml -n fleet # 等绿色 Pod 全部就绪 kubectl rollout status deployment/fleet-api-green -n fleet
此时状态:
流量 → Service(slot=blue) → fleet-api-blue Pod Pod Pod
fleet-api-green Pod Pod Pod(就绪但没流量)
第三步:对绿色环境做测试
在切换之前,可以直接访问绿色 Pod 验证,完全不影响线上:
bash
# 临时 port-forward 绕过 Service,直接打绿色 Pod kubectl port-forward -n fleet deployment/fleet-api-green 8080:8080 curl http://localhost:8080/health curl http://localhost:8080/vehicles curl http://localhost:8080/stats # 验证新接口
确认完全没问题再继续。
第四步:一键切换,流量瞬间全部转到绿色
bash
kubectl patch service fleet-api -n fleet \
-p '{"spec":{"selector":{"app":"fleet-api","slot":"green"}}}'
切换前后对比:
切换前:Service(slot=blue) → 蓝色 Pod Pod Pod 切换后:Service(slot=green) → 绿色 Pod Pod Pod
这一步是原子操作,没有中间状态,用户感知不到切换过程。
第五步:观察绿色环境稳定运行
bash
# 看日志 kubectl logs -n fleet -l slot=green -f # 看有没有报错 kubectl get pods -n fleet -w
如果发现问题,回滚只需一条命令:
bash
kubectl patch service fleet-api -n fleet \
-p '{"spec":{"selector":{"app":"fleet-api","slot":"blue"}}}'
流量瞬间切回蓝色,蓝色环境一直在,v1 代码从未下线。
蓝绿 vs 金丝雀的本质区别:
| 蓝绿发布 | 金丝雀发布 | |
|---|---|---|
| 切换方式 | 一次性全切 | 逐步增加比例 |
| 新旧共存时间 | 短(切换瞬间完成) | 长(需要观察期) |
| 资源消耗 | 双倍(蓝绿同时跑满) | 少(v2 先只跑少量副本) |
| 回滚速度 | 秒级 | 秒级 |
| 适合场景 | 变更大、测试充分、想快速切换 | 变更有风险、需要真实流量验证 |
