16.9.9 故障演练与应急预案
本节聚焦生产环境中 Kubernetes 故障演练与应急预案建设,目标是通过常态化演练提升团队对集群级、节点级与应用级故障的快速识别与处置能力,确保业务连续性与可恢复性。
故障演练目标与范围#
- 目标定义:验证高可用架构有效性、RTO/RPO 达成情况、自动化修复能力与人工处置流程。
- 演练范围:控制平面组件(apiserver/etcd/scheduler/controller-manager)、节点故障、网络分区、存储故障、应用级异常、镜像/制品异常、配置/密钥误改。
- 演练原则:最小影响、可回滚、全链路观察、可复盘、可改进。
演练类型与典型场景#
- 节点级故障:节点宕机、资源耗尽、kubelet 异常、时钟漂移。
- 控制面故障:etcd 节点失联、apiserver 异常、证书过期。
- 网络故障:CNI 异常、网络分区、DNS 解析失败、服务发现故障。
- 存储故障:PV 失联、CSI 异常、卷只读、存储延迟飙升。
- 应用故障:容器崩溃循环、镜像拉取失败、配置错误导致服务不可用。
- 安全事件:密钥泄露、误操作删除关键资源、异常流量攻击。
演练流程与执行规范#
- 演练准备:明确演练目标、影响范围、回滚策略、负责人与沟通机制。
- 演练实施:按场景注入故障并实时监控指标、日志、事件与追踪。
- 应急处置:执行预案操作,记录操作时间线与关键决策。
- 验证恢复:验证业务功能、性能指标、数据一致性与 SLA。
- 复盘改进:输出复盘报告,固化改进项与自动化能力。
应急预案关键内容#
- 分级响应机制:按影响范围划分 P1/P2/P3,明确升级与通知链路。
- 关键系统清单:核心命名空间、关键服务、依赖中间件与外部系统。
- 回滚策略:镜像回滚、配置回滚、版本回退、流量切换。
- 快速处置手册:常见故障定位与修复步骤,包含命令与验证检查。
- 数据保护策略:etcd 备份与恢复流程、PV 快照策略与恢复演练。
监控与告警联动#
- 告警触发:节点不可达、Pod 异常重启、API 请求失败率上升、etcd 延迟升高。
- 自动化响应:结合自动化脚本/Runbook 执行,缩短 MTTR。
- 指标验证:恢复后关键指标(延迟、错误率、吞吐)恢复到基线。
持续改进与演练制度化#
- 演练频率:关键场景季度演练,基础场景月度演练。
- 演练覆盖率:按系统与业务重要性评估覆盖情况。
- 知识库沉淀:将演练结果纳入运维知识库与标准化流程。
- 指标量化:以 RTO/RPO、MTTR、告警命中率为衡量指标持续优化。
演练工具与安装示例(可选)#
建议在测试或预发环境引入轻量故障注入工具,避免直接在生产环境“裸注入”。
安装 Chaos Mesh(示例)#
# 1) 安装 Helm(若已安装可跳过)
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 2) 添加仓库并安装到 chaos-testing 命名空间
helm repo add chaos-mesh https://charts.chaos-mesh.org
helm repo update
kubectl create ns chaos-testing
helm install chaos-mesh chaos-mesh/chaos-mesh -n chaos-testing \
--set dashboard.create=true
# 3) 验证安装
kubectl -n chaos-testing get pods
# 预期:chaos-controller-manager/chaos-daemon/chaos-dashboard 正常 Running
典型演练一:节点不可达(节点级故障)#
目标#
验证节点宕机后 Pod 迁移、服务恢复与告警链路。
故障注入(在测试节点执行)#
# 模拟节点不可达:停止 kubelet
sudo systemctl stop kubelet
# 观察节点状态
kubectl get nodes
# 预期:该节点变为 NotReady
排错与恢复步骤#
# 1) 查看节点事件
kubectl describe node <node-name> | tail -n +1
# 2) 查看该节点上的 Pod 迁移情况
kubectl get pods -A -o wide | grep <node-name>
# 3) 恢复 kubelet
sudo systemctl start kubelet
# 4) 验证节点恢复
kubectl get nodes
# 预期:节点恢复 Ready,Pod 重建完成
练习#
- 在不同节点分别执行一次,记录 Pod 迁移耗时(RTO)。
- 比较有 PDB 与无 PDB 的迁移差异。
典型演练二:etcd 延迟与不可用(控制面故障)#
原理草图(组件关系)#
故障注入(示例:阻断 API Server 访问 ETCD 端口)#
仅建议在测试环境执行;生产请用变更窗口与回滚预案。
# 1) 找到 etcd 监听端口(常见 2379)
ss -lntp | grep etcd
# 2) 临时阻断访问(iptables 示例)
sudo iptables -I INPUT -p tcp --dport 2379 -j DROP
# 3) 观察 apiserver 请求失败
kubectl get --raw /healthz
# 预期:healthz 非 ok 或超时
恢复#
# 移除阻断规则
sudo iptables -D INPUT -p tcp --dport 2379 -j DROP
# 验证恢复
kubectl get --raw /healthz
# 预期:返回 ok
排错命令解释#
kubectl get --raw /healthz:直接访问 API Server 健康检查端点。iptables -I/D:插入/删除规则,模拟网络分区。
典型演练三:配置误改导致服务不可用(应用级故障)#
故障注入与回滚(示例)#
# 1) 查看 Deployment 与 ConfigMap
kubectl -n prod get deploy web -o wide
kubectl -n prod get cm web-config -o yaml > /tmp/web-config.bak.yaml
# 2) 故障注入:写入错误配置
kubectl -n prod patch cm web-config --type merge -p \
'{"data":{"UPSTREAM_URL":"http://127.0.0.1:1"}}'
# 3) 触发滚动更新(若应用依赖配置重启)
kubectl -n prod rollout restart deploy web
# 4) 观察服务异常
kubectl -n prod logs deploy/web --tail=50
回滚恢复#
# 使用备份恢复 ConfigMap
kubectl apply -f /tmp/web-config.bak.yaml
# 再次滚动更新
kubectl -n prod rollout restart deploy web
# 验证恢复
kubectl -n prod rollout status deploy web
快速处置手册(Runbook 示例)#
# 1) 定位故障范围
kubectl get nodes
kubectl get pods -A | grep -E 'CrashLoopBackOff|ImagePullBackOff|Pending'
# 2) 关键组件状态
kubectl -n kube-system get pods | grep -E 'apiserver|etcd|scheduler|controller'
# 3) 关键事件
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -n 20
# 4) 回滚部署
kubectl -n prod rollout history deploy web
kubectl -n prod rollout undo deploy web --to-revision=2
应急预案模板(可直接落地)#
- P1 触发条件:核心业务不可用、全局 API 不可用、etcd 多数不可达。
- 联系人:值班 SRE、平台负责人、业务负责人、网络/存储负责人。
- 执行路径:
1. 冻结变更、停止自动发布;
2. 执行 Runbook,优先恢复控制面;
3. 业务侧验证关键路径;
4. 复盘与问题单闭环。
实战练习与验收标准#
- 练习 1:模拟 1 个节点 NotReady,记录 Pod 重建耗时与告警时间。
- 练习 2:模拟 ConfigMap 误改并回滚,验证服务 5 分钟内恢复。
- 验收标准:
- P1 事件 RTO ≤ 10 分钟;
- 告警命中率 ≥ 95%;
- 复盘报告 24 小时内完成。