本节摘要:CDP 无人 approve,生产健康依赖监控告警与自动回滚。本节配置 Prometheus 告警规则、部署后 smoke test、kubectl rollout undo 与 Spinnaker automated rollback——合并原 4.4 故障恢复要点。
阅读完本节,你应当能够:
CDP pipeline 最后一步不是「deploy 完就绿」,而是验证 prod:
#!/bin/bash # scripts/smoke-prod.sh set -e BASE=https://api.example.com for i in 1 2 3 4 5; do code=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/health") [ "$code" = "200" ] || exit 1 sleep 2 done curl -sf "$BASE/v1/users/me" -H "Authorization: Bearer $SMOKE_TOKEN" echo "Smoke OK"
失败则触发 rollback job——GitHub Actions:
- run: ./scripts/smoke-prod.sh - if: failure() run: kubectl rollout undo deployment/myapp
# alert rules groups: - name: deploy-guard rules: - alert: HighErrorRateAfterDeploy expr: | sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05 for: 2m labels: { severity: critical } annotations: summary: "5xx rate > 5% for 2m"
Alertmanager webhook 调 Jenkins job 或 Argo Rollouts abort——2 分钟窗口避免瞬时 spike 误 rollback。
| 方式 | 命令/操作 | 速度 | 适用 |
|---|---|---|---|
| kubectl rollout undo | kubectl rollout undo deploy/app |
秒~分 | K8s Deployment |
| Helm rollback | helm rollback app 42 |
分 | Helm release |
| 蓝绿切回 | patch Service selector | 秒 | 蓝绿架构 |
| Git revert + CDP | revert commit 触发 pipeline | 分~十分 | 代码级回滚 |
| DB restore | 备份恢复 | 十分~小时 | 最后手段 |
⚠️ 常见坑:只 rollback 应用不 rollback DB migration——expand 阶段加了列,rollback 代码读旧 schema 仍挂。migration 须 backward compatible。
💡 关键直觉:MTTR 目标 < 15 min 意味着 rollback 必须一键,不能 runbook 里写「联系 DBA 恢复备份」作为首选。
| 支柱 | 工具 | 部署后看什么 |
|---|---|---|
| Metrics | Prometheus, Grafana | 5xx rate, P99 latency |
| Logs | ELK, Loki | 新 error stack trace |
| Traces | Jaeger, Tempo | 慢 span 是否新版本引入 |
CI 在 deploy 时写 annotation:
curl -X POST "https://grafana/api/annotations" \ -d '{"text":"Deploy '"$GIT_SHA"'","tags":["deploy"]}'
事故时间线与 deploy 点对齐——postmortem 必备。
Spinnaker Kayenta 对比 canary 与 baseline 的 metrics——Nginx 5xx、latency P95 劣化超阈值自动 halt promotion。适合已用 Spinnaker 的多云团队。
kubectl rollout undo 或 Argo promote --full abort{ "query": { "bool": { "must": [{ "match": { "level": "ERROR" }}], "filter": [{ "range": { "@timestamp": { "gte": "now-15m" }}}] }}}
deploy 后 ERROR 条数突增 10 倍——即使 metrics 未告警也应人工介入。
| 问题 | 对策 |
|---|---|
| 告警太多 | 合并 related alerts |
| 狼来了 | 仅 SLO burn rate 告警 pager |
| 无 runbook | 每条 alert 链 runbook URL |
Google SRE:「Every page should be actionable」——若 on-call 只需「观察」,不应 pager。
OpenTelemetry 在 deploy 时 bump service.version resource attribute——Jaeger 按 version 对比 trace latency,快速确认新版本是否引入慢 span。
Netflix Chaos Monkey 随机杀 prod 实例——验证 CDP 频繁 deploy 下系统韧性。中小团队轻量版:staging 定期 kubectl delete pod 随机演练。
| 层级 | RTO | 操作 |
|---|---|---|
| App rollback | 分钟 | kubectl rollout undo |
| DB point-in-time | 小时 | RDS restore |
| Region failover | 小时~天 | DNS + DR region |
App rollback 是 CDP 默认;DB restore 需 break-glass 流程,不应日常依赖。
{"level":"ERROR","msg":"payment failed","trace_id":"abc","deploy_version":"sha123"}
ELK/Loki 按 deploy_version 过滤——postmortem 对比 deploy 前后 ERROR 率。
第5章 DevSecOps:容器、IaC 与 Pipeline 安全扫描。
回滚体系的成熟度可以用 MTTR 衡量:目标小于 15 分钟,意味着从发现异常到恢复,全部步骤必须自动化。一个实用的分层是:第一层 smoke test(秒级,部署后立即验证基本可用),第二层错误率告警(分钟级,观察真实流量),第三层 SLO burn rate(小时级,发现慢性劣化)。每层都能触发回滚,但触发条件要分级——不能所有异常都一键回滚,否则会掩盖真实问题。
回滚动作要与监控联动:Prometheus 告警触发 Argo Rollouts abort 或 Jenkins 回滚 job,回滚后自动跑 smoke 确认恢复。告警设计的关键是「可行动」——每条告警都要有对应的 runbook 与负责人,避免狼来了。日志与 trace 要在部署前后可对比(deploy annotation),这样排查时能快速判断问题是否由本次部署引入。