KubernetesSRECI/CD发布工程
场景
某团队通过 CI/CD 流水线向 Kubernetes 集群部署一个配置错误的服务,导致生产环境 5xx 错误率飙升,用户投诉激增。由于没有护栏,错误版本直接扩散到所有实例,回滚缓慢,故障时间长达 45 分钟。
症状
- 应用错误率突然从 0.1% 上升到 15%
- 新版本 Pod 频繁 CrashLoopBackOff
- 监控报警(如 P99 延迟陡增)
- 用户明显体验下降
诊断
- 检查最近部署:
kubectl rollout history deployment/my-app - 查看 Pod 事件:
kubectl describe pod <pod-name> - 对比新旧版本配置:
kubectl diff -f prod-deployment.yaml - 根本原因:缺少预部署检查(如配置验证、冒烟测试)和灰度发布策略。
命令与护栏实施
1. 自动配置验证
在 CI 中添加静态检查:
job: validate
script:
- kubectl kustomize . | kubeconform --strict
- trivy config .
2. 安全部署策略
使用 ArgoCD 的渐进式交付或 Kubernetes 原生滚动更新 + readinessGate:
spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
readinessGates:
- conditionType: "com.example/health-check"
3. 自动门控
结合 GitOps 和审批流: - 沙箱环境自动部署 + 冒烟测试 - 预发环境需人工 approve - 生产环境自动 canary(10% 流量,5 分钟观察)
风险控制
- 强制代码扫描(SAST/DAST)
- 镜像签名验证(Cosign)
- 策略引擎(如 OPA/Gatekeeper)禁止特权容器或 hostNetwork
- 设置自动回滚阈值:错误率 > 5% 或健康Pod < 80% 立即回滚
自动回滚脚本示例
#!/bin/bash
# 监测部署后的错误率,超过阈值回滚
rollback_if_unhealthy() {
local target=$1
local threshold=$2
local error_rate=$(kubectl exec -it health-check -- curl -s /metrics | grep errors_total | awk '{print $2}')
if (( $(echo "$error_rate > $threshold" | bc -l) )); then
kubectl rollout undo deployment/$target
echo "Rollback triggered due to error rate $error_rate > $threshold"
exit 1
fi
}
回滚流程
- 自动回滚:由监控系统(如 Prometheus + Alertmanager)触发 webhook 执行
kubectl rollout undo - 手动回滚:通过 Git revert + ArgoCD 自动同步
- 确保数据库兼容性(如有 schema 变更需有回滚方案)
验证
- 部署后运行 smoke test:
kubectl run smoke-test --image=busybox -- wget -q -O- http://my-app/health - 观察监控面板:错误率、延迟、饱和度
- 检查告警是否有新触发
何时提交 OpsGlobal 工单
- 多服务级联回滚失败
- 底层基础设施(如 Ingress Controller、DNS)问题
- 需要安全专家分析配置漏洞
- 自定义灰度策略需要 SRE 审核
适用场景
适合正在处理 CI/CD、Kubernetes, SRE, CI/CD, 发布工程 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
了解如何在 CI/CD 流水线中实施安全检查、审批门和自动回滚,防止不良部署导致故障。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。