← 返回首页
🚀

蓝绿部署:滚动更新与零停机架构

📂 architecture ⏱ 2 min 221 words

蓝绿部署:滚动更新与零停机架构

蓝绿部署原理

蓝绿部署维护两套完全相同的生产环境(蓝/绿),通过流量切换实现零停机发布。一套对外提供服务,另一套用于新版本部署验证。

                    ┌─────────────┐
                    │   负载均衡   │
                    └──────┬──────┘
                           │
          ┌────────────────┼────────────────┐
          │                │                │
          ▼                │                ▼
    ┌──────────┐           │          ┌──────────┐
    │  蓝环境   │◄─ 活跃   │          │  绿环境   │◄─ 待发布
    │ v1.0.0   │          │          │ v1.1.0   │
    └──────────┘           │          └──────────┘
                           │
                    验证通过后切换
                           │
          ┌────────────────┴────────────────┐
          │                │                │
          ▼                │                ▼
    ┌──────────┐           │          ┌──────────┐
    │  蓝环境   │          │          │  绿环境   │◄─ 活跃
    │ v1.0.0   │◄─ 备份   │          │ v1.1.0   │
    └──────────┘           │          └──────────┘

Kubernetes蓝绿部署实现

# blue-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-blue
  labels:
    app: myapp
    version: blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: blue
  template:
    metadata:
      labels:
        app: myapp
        version: blue
    spec:
      containers:
      - name: myapp
        image: myapp:v1.0.0
        ports:
        - containerPort: 8080
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp
    version: blue  # 切换到green实现蓝绿切换
  ports:
  - port: 80
    targetPort: 8080

流量切换脚本

#!/bin/bash
# blue-green-switch.sh
NEW_VERSION=$1

if [ "$NEW_VERSION" == "blue" ]; then
  NEW_COLOR="blue"
  OLD_COLOR="green"
else
  NEW_COLOR="green"
  OLD_COLOR="blue"
fi

# 部署新版本
kubectl apply -f ${NEW_COLOR}-deployment.yaml

# 等待新版本就绪
kubectl rollout status deployment/myapp-${NEW_COLOR}

# 切换Service指向
kubectl patch service myapp -p "{\"spec\":{\"selector\":{\"version\":\"${NEW_COLOR}\"}}}"

echo "流量已切换到 ${NEW_COLOR} 环境"

# 保留旧版本用于快速回滚
echo "旧版本 ${OLD_COLOR} 保留30分钟供回滚"

滚动更新策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 6
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2        # 最多多出2个Pod
      maxUnavailable: 1  # 最多不可用1个Pod
  template:
    spec:
      containers:
      - name: myapp
        image: myapp:v1.1.0
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5

零停机发布关键点

  1. 健康检查:配置readinessProbe确保新Pod就绪后才接流量
  2. 优雅关闭:处理SIGTERM信号,等待现有请求完成
  3. 会话保持:使用外部存储(Redis)替代本地Session
  4. 数据库兼容:确保Schema变更向后兼容