蓝绿部署:滚动更新与零停机架构
蓝绿部署:滚动更新与零停机架构
蓝绿部署原理
蓝绿部署维护两套完全相同的生产环境(蓝/绿),通过流量切换实现零停机发布。一套对外提供服务,另一套用于新版本部署验证。
┌─────────────┐
│ 负载均衡 │
└──────┬──────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ │ ▼
┌──────────┐ │ ┌──────────┐
│ 蓝环境 │◄─ 活跃 │ │ 绿环境 │◄─ 待发布
│ 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
零停机发布关键点
- 健康检查:配置readinessProbe确保新Pod就绪后才接流量
- 优雅关闭:处理SIGTERM信号,等待现有请求完成
- 会话保持:使用外部存储(Redis)替代本地Session
- 数据库兼容:确保Schema变更向后兼容