i007.cc

i007.cc

优先队列-降维打击

05.价值资料

结合一个实例,讲讲蓝绿发布

还是用 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 先只跑少量副本)
回滚速度 秒级 秒级
适合场景 变更大、测试充分、想快速切换 变更有风险、需要真实流量验证

发表回复