基于 K8s 的蓝绿部署:Ingress 流量切换与版本回滚的自动化实现
·
基于 Kubernetes 的蓝绿部署:Ingress 流量切换与版本回滚自动化实现
1. 核心概念
蓝绿部署通过维护两个独立环境(蓝/当前版,绿/新版)实现零停机发布:
- 蓝环境:运行稳定版本,处理生产流量
- 绿环境:部署新版本,待验证后接收流量
- 流量切换:通过 Ingress 控制器动态路由流量
- 自动化回滚:异常时自动切回蓝环境
2. 架构组件
graph LR
A[用户请求] --> B(Ingress Controller)
B -->|正常流量| C[蓝环境-Service]
B -->|切换流量| D[绿环境-Service]
C --> E[蓝-Pod v1.0]
D --> F[绿-Pod v2.0]
3. 自动化实现步骤
步骤 1:环境初始化
# 蓝环境部署 (v1.0)
apiVersion: apps/v1
kind: Deployment
metadata:
name: blue-app
labels:
version: v1.0
spec:
replicas: 3
selector:
matchLabels:
app: myapp
env: blue
template:
metadata:
labels:
app: myapp
env: blue
version: v1.0
spec:
containers:
- name: app
image: myapp:v1.0
---
# 绿环境部署 (初始为空)
apiVersion: apps/v1
kind: Deployment
metadata:
name: green-app
labels:
version: staging
spec:
replicas: 0 # 初始无实例
selector:
matchLabels:
app: myapp
env: green
步骤 2:Service 配置
# 蓝环境Service
apiVersion: v1
kind: Service
metadata:
name: blue-svc
spec:
selector:
app: myapp
env: blue
ports:
- protocol: TCP
port: 80
---
# 绿环境Service
apiVersion: v1
kind: Service
metadata:
name: green-svc
spec:
selector:
app: myapp
env: green
ports:
- protocol: TCP
port: 80
步骤 3:Ingress 流量控制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "0" # 初始100%蓝环境
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blue-svc
port:
number: 80
步骤 4:自动化部署流程
#!/bin/bash
# 1. 部署新版本到绿环境
kubectl apply -f green-deployment-v2.yaml
# 2. 等待绿环境就绪
kubectl rollout status deployment/green-app --timeout=300s
# 3. 流量切换(100%到绿环境)
kubectl patch ingress app-ingress -p '{
"metadata": {
"annotations": {
"nginx.ingress.kubernetes.io/canary-weight": "100"
}
}
}'
# 4. 监控验证(自动回滚触发条件)
MONITOR_RESULT=$(curl -sS http://monitor-service/health)
if [[ $MONITOR_RESULT != *"OK"* ]]; then
echo "检测到异常,触发回滚"
# 流量切回蓝环境
kubectl patch ingress app-ingress -p '{
"metadata": {
"annotations": {
"nginx.ingress.kubernetes.io/canary-weight": "0"
}
}
}'
# 清理失败版本
kubectl scale deployment/green-app --replicas=0
exit 1
fi
5. 版本回滚机制
自动回滚触发条件:
- HTTP 错误率 > 5%(Prometheus 监控)
- 服务响应延迟 > 500ms
- 就绪探针连续失败
- 自定义业务指标异常
回滚操作:
- Ingress 权重立即切回蓝环境
- 绿环境缩容至 0 副本
- 通知系统记录事件:
kubectl annotate deployment/green-app rollback=$(date +%s)
6. 优化实践
-
渐进式流量切换:
# 金丝雀发布式权重调整 canary-weight: "10" -> "50" -> "100" -
自动验证脚本:
def validate_release(): if error_rate > 0.05 or latency > 1.0: trigger_rollback() elif business_metrics_failure(): trigger_rollback() -
版本元数据追踪:
-- 数据库记录部署历史 INSERT INTO deploy_history (version, timestamp, status) VALUES ('v2.1', NOW(), 'rolled_back');
7. 典型工作流
sequenceDiagram
participant CICD as CI/CD 系统
participant K8s as Kubernetes
participant Monitor as 监控系统
CICD->>K8s: 部署绿环境(v2.0)
K8s-->>CICD: 部署完成
CICD->>K8s: 切换100%流量到绿
K8s->>Monitor: 实时指标流
Monitor-->>K8s: 检测到异常(>5%错误率)
K8s->>K8s: 自动切回蓝环境
K8s->>CICD: 回滚事件通知
8. 关键技术优势
- 零停机更新:流量切换在毫秒级完成
- 安全回滚:5 秒内恢复稳定版本
- 版本对比测试:支持 A/B 测试
- 资源优化:非活动环境可缩容
- 审计追踪:所有操作记录在 etcd
实现提示:结合 Argo Rollouts 或 Flagger 可增强自动化能力,建议在预发布环境验证回滚流程至少 3 次后再上生产。
更多推荐
所有评论(0)