深色模式
生产环境混沌
摘要:生产混沌是最高阶的实践,前提是可观测、可中止、可回滚三者齐备。本文给出准入检查清单、从小到大的灰度路径与必须遵守的时间窗口规则。
适用环境
bash
# 生产准入硬条件检查
kubectl -n prod get deploy -o custom-columns='NAME:.metadata.name,REPLICAS:.spec.replicas' | head
kubectl -n prod get pdb | head
kubectl auth can-i create podchaos -n prod1
2
3
4
2
3
4
操作步骤
第 1 步:准入自检(有一项不过就停)
bash
cat > prod-gate.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
fail=0
chk(){ if eval "$2"; then echo "OK $1"; else echo "FAIL $1"; fail=1; fi; }
chk "副本冗余>=3" '[ "$(kubectl -n prod get deploy demo -o jsonpath="{.spec.replicas}")" -ge 3 ]'
chk "存在 PDB" '[ "$(kubectl -n prod get pdb -o name | wc -l)" -ge 1 ]'
chk "监控指标可查" 'curl -sf http://127.0.0.1:9090/-/healthy >/dev/null'
chk "存在 Runbook" '[ -f runbooks/demo.md ]'
chk "一键中止脚本存在" '[ -x ./abort.sh ]'
chk "当前无进行中事故" '[ "$(curl -s http://127.0.0.1:9093/api/v2/alerts | jq "length")" -eq 0 ]'
exit $fail
EOF
chmod +x prod-gate.sh && ./prod-gate.sh1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
第 2 步:按从小到大的路径推进
bash
cat > prod-ladder.md <<'EOF'
1. 只读实验:只注入监控可观测的轻微延迟(50ms),不中断功能
2. 单实例实验:mode=one,只影响一个 Pod
3. 单可用区实验:限定 zone,验证跨区容灾
4. 全链路实验:仅在业务低峰 + 全员在线时执行
EOF1
2
3
4
5
6
2
3
4
5
6
第 3 步:限定时间与人员
bash
# 只允许在业务低峰 + 值班与负责人均在线时执行
cat > window.md <<'EOF'
允许窗口:工作日 14:00-16:00(业务低峰)
必须到场:值班 Primary、服务负责人、能执行中止的人
禁止窗口:大促、发布日、节假日、已发生事故期间
EOF1
2
3
4
5
6
2
3
4
5
6
第 4 步:生产实验的最小配置
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: prod-canary-delay
namespace: prod
spec:
action: delay
mode: one # 只影响一个 Pod
selector:
namespaces: [prod]
labelSelectors: { app: demo }
delay:
latency: '50ms' # 从最轻的强度开始
duration: '60s' # 短时长,自动结束1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
bash
kubectl -n prod apply -f prod-canary-delay.yaml
kubectl -n prod get networkchaos prod-canary-delay -o jsonpath='{.status.phase}{"\n"}'1
2
2
第 5 步:全程盯指标,异常即中止
bash
# 观察窗口内持续检查,越线立刻中止
for i in $(seq 1 8); do
./abort-watch.sh prod-canary-delay prod 0.01 || break
sleep 15
done
kubectl -n prod delete -f prod-canary-delay.yaml1
2
3
4
5
6
2
3
4
5
6
验证
bash
# 1. 准入脚本全部 OK
./prod-gate.sh && echo "准入通过"
# 2. 实验中业务指标守住
curl -sS --data-urlencode 'query=sum(rate(http_requests_total{job="demo",code=~"5.."}[1m]))/sum(rate(http_requests_total{job="demo"}[1m]))' \
http://127.0.0.1:9090/api/v1/query | jq -r '.data.result[].value[1]'
# 3. 实验对象已清除
kubectl -n prod get networkchaos | wc -l1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
常见坑
把生产混沌当作一次性活动
一次性生产实验的价值有限,只有常态化(如每周固定一次小实验)才能持续暴露问题。
实验与发布叠加
发布期间系统本就不稳定,叠加实验后无法归因。实验窗口必须与发布窗口互斥。
未通知客服与业务方就做生产实验
用户投诉会被当成新故障处理,造成重复投入。生产实验必须提前通知全部相关方并注明演练标识。