部署策略对比与适用场景
软件部署策略直接影响系统的可用性和发布风险。滚动更新(Rolling Update)逐步替换旧实例,资源占用低但新旧版本共存期间可能产生兼容性问题。蓝绿部署(Blue-Green Deployment)维护两套完整环境,切换瞬间完成,回退迅速但需要双倍资源。金丝雀发布(Canary Release)按比例灰度引流到新版本,风险可控但配置复杂。选择策略需权衡资源成本、发布速度和风险容忍度。
蓝绿部署适用场景包括重大版本升级、数据库Schema变更前的切换、需要快速回退的关键发布。金丝雀发布适用于A/B测试、灰度验证和渐进式迁移。两者可组合使用:先金丝雀验证新版本稳定性,再蓝绿切换完成全量发布。
Nginx实现蓝绿部署流量切换
Nginx upstream配置两组后端服务器,通过修改upstream权重或切换server实现蓝绿切换。这种方式零停机,回退仅需切换upstream配置并reload:
# /etc/nginx/conf.d/app.conf
# 蓝环境 - 当前生产版本
upstream blue_backend {
server 10.0.1.11:8080 weight=10;
server 10.0.1.12:8080 weight=10;
}
# 绿环境 - 新版本(初始权重为0)
upstream green_backend {
server 10.0.1.21:8080 weight=0;
server 10.0.1.22:8080 weight=0;
}
# 主upstream - 通过变量控制切换
upstream active_backend {
server 10.0.1.11:8080;
server 10.0.1.12:8080;
}
server {
listen 80;
server_name app.yunthe.com;
location / {
proxy_pass http://active_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 蓝绿切换时无感知转发
proxy_next_upstream error timeout http_500;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
}
切换到绿环境的脚本:
#!/bin/bash
# blue_green_switch.sh - 蓝绿部署切换脚本
# 用法: ./blue_green_switch.sh green|blue
TARGET=$1
NGINX_CONF="/etc/nginx/conf.d/app.conf"
BACKUP_DIR="/etc/nginx/conf.d/backup"
# 备份当前配置
cp $NGINX_CONF $BACKUP_DIR/app.conf.$(date +%Y%m%d%H%M%S)
if [ "$TARGET" = "green" ]; then
# 切换到绿环境
sed -i 's/server 10.0.1.11:8080;/server 10.0.1.21:8080;/g' $NGINX_CONF
sed -i 's/server 10.0.1.12:8080;/server 10.0.1.22:8080;/g' $NGINX_CONF
echo "切换到绿环境 (10.0.1.21-22)"
elif [ "$TARGET" = "blue" ]; then
# 切换回蓝环境
sed -i 's/server 10.0.1.21:8080;/server 10.0.1.11:8080;/g' $NGINX_CONF
sed -i 's/server 10.0.1.22:8080;/server 10.0.1.12:8080;/g' $NGINX_CONF
echo "切换到蓝环境 (10.0.1.11-12)"
fi
# 测试配置并热加载
nginx -t && nginx -s reload
echo "Nginx配置已重新加载"
金丝雀发布的灰度比例控制
金丝雀发布通过Nginx的split_clients模块或upstream权重实现灰度比例控制。split_clients基于请求哈希分配流量,保证同一用户始终路由到同一版本:
# 金丝雀发布 - 10%流量到新版本
server {
listen 80;
server_name app.yunthe.com;
# 按比例分配流量
split_clients "${remote_addr}${http_user_agent}" $canary_backend {
10% canary; # 10%流量到金丝雀版本
* stable; # 90%流量到稳定版本
}
location / {
proxy_pass http://$canary_backend;
proxy_set_header X-Canary-Flag $canary_backend;
}
}
upstream stable {
server 10.0.1.11:8080;
server 10.0.1.12:8080;
}
upstream canary {
server 10.0.1.21:8080;
}
灰度比例递增策略:1%到5%到10%到25%到50%到100%。每个阶段持续观察15-30分钟,监控错误率、响应时间和业务指标。若异常率超过阈值自动回退到上一比例。
Kubernetes蓝绿部署与金丝雀配置
Kubernetes环境下使用Deployment和Service实现蓝绿部署。创建两个Deployment分别对应蓝绿环境,通过修改Service selector实现切换:
# 蓝环境Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-blue
labels:
app: webapp
version: blue
spec:
replicas: 3
selector:
matchLabels:
app: webapp
version: blue
template:
metadata:
labels:
app: webapp
version: blue
spec:
containers:
- name: app
image: registry.yunthe.com/webapp:v2.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
# Service - 当前指向蓝环境
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
version: blue # 切换时改为green
ports:
- port: 80
targetPort: 8080
Kubernetes金丝雀发布使用Istio或Argo Rollouts实现精细流量控制。Istio VirtualService支持基于权重的流量分配:
# Istio VirtualService - 10%金丝雀流量
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: webapp-canary
spec:
hosts:
- app.yunthe.com
http:
- route:
- destination:
host: webapp-stable
port:
number: 80
weight: 90
- destination:
host: webapp-canary
port:
number: 80
weight: 10
retries:
attempts: 3
perTryTimeout: 5s
自动回滚机制与健康检查
发布过程中自动健康检查和回滚机制是保障系统稳定的关键。部署后自动验证HTTP状态码、响应内容和关键业务指标,异常时触发回滚:
#!/bin/bash
# deploy_with_healthcheck.sh
# 部署后自动健康检查,失败则回滚
HEALTH_URL="http://10.0.1.21:8080/health"
MAX_RETRIES=10
RETRY_INTERVAL=3
# 健康检查
check_health() {
for i in $(seq 1 $MAX_RETRIES); do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_URL)
if [ "$HTTP_CODE" = "200" ]; then
echo "健康检查通过 (尝试 $i/$MAX_RETRIES)"
return 0
fi
echo "健康检查失败: HTTP $HTTP_CODE (尝试 $i/$MAX_RETRIES)"
sleep $RETRY_INTERVAL
done
return 1
}
# 部署前指标基线
BASELINE_ERROR_RATE=$(curl -s http://prometheus:9090/api/v1/query -d query='rate(http_requests_total{status=~"5.."}[5m])' | jq -r '.data.result[0].value[1]')
# 执行蓝绿切换
./blue_green_switch.sh green
# 健康检查
if check_health; then
echo "部署成功"
# 持续监控5分钟
sleep 300
CURRENT_ERROR_RATE=$(curl -s http://prometheus:9090/api/v1/query -d query='rate(http_requests_total{status=~"5.."}[5m])' | jq -r '.data.result[0].value[1]')
# 错误率翻倍则回滚
if (( $(echo "$CURRENT_ERROR_RATE > $BASELINE_ERROR_RATE * 2" | bc -l) )); then
echo "错误率异常: $CURRENT_ERROR_RATE vs 基线 $BASELINE_ERROR_RATE"
echo "自动回滚到蓝环境"
./blue_green_switch.sh blue
fi
else
echo "健康检查失败,自动回滚"
./blue_green_switch.sh blue
exit 1
fi
部署监控应集成告警系统,关键指标包括HTTP 5xx错误率、P99响应延迟、请求成功率和业务核心指标(如订单量、支付成功率)。Prometheus AlertManager配置部署窗口专用告警规则,任何指标异常触发告警通知,确保发布过程全程可观测。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/lan-lyu-bu-shu-yu-jin-si-que-fa-bu-shi-jian-ling-ting-ji/