Chaos Engineering:系统的可持续性
Chaos Engineering: 系统的可持续性
1)为什么溷沌工程
目的是通过实验而不是单词和图表来证明原型体系结构的稳定性。我们故意制造受控故障,以便:- 检验有关系统行为的假设并验证SLO;
- 发现隐藏的SPOF,不正确的taymout/retrai,级联效应;
- 训练团队:游戏日,运行手册,通讯;
- 形成"默认可持续性"而不是"希望更好"的文化。
重要的是:Chaos Engineering ≠"打破一切"。这是一种科学方法:steady-state →假设→实验→结论→改进。
2)实验的基本周期
1.Steady-state(基线): 哪个SLI稳定?(例如,99岁的≤500 ms的成功。95%).
2.假设: 如果失去一个AZ,p95将增加<10%,并且≥99可用性。9%.
3.实验:有计划的folt,带有有限的blast radius和停止标准。
4.观察:度量/跟踪器/logi,burn-rate SLO,商业SLI(例如成功存款)。
5.改进:捕获发现,更改时间限制/路由,更新运行手册。
6.自动化/倒退:我们在时间表中重复,我们在CI/CD和游戏日日历中添加。
3)安全栏杆(安全第一)
Blast radius:从狭窄开始-单个pod/实例/路线/namespace。
Guardrails:在SLO燃烧率(快速/缓慢),后退限制,QPS限制,事件预算上。
停止条件: "如果error-rate> X%或p99> Y ms N分钟-立即停止和滚回。"
窗口:通话工作时间,通知的摊牌,冷冻版本。
通讯:IC/Tech lead/Comms,清晰的渠道(战争室),消息模板。
4)失败类别和假设思想
网络:延迟/jitter/损失,部分端口下降,服务/PSP之间的"翻转"通信。
编译器/节点:进程杀死、CPU过热、文件描述符用尽、连接池狭窄。
存储和DB: 光盘后端的增长,lag复制,停止一个阴影/领导,分裂脑.
依赖性:外部API降级,提供商限制,5xx/429激增。
变更管理: 发行失败,幻灯片不好,部分滚动.
外围:CDN降级,DNS/Anycast漂移,WAF/机器人保护失败。
区域/AZ:完全损失或"部分"事件(稍微更糟且不可预测)。
5)工具和技术
Kubernetes: Chaos Mesh, Litmus, PowerfulSeal, kube-monkey.
云:AWS Fault Injection Simulator (FIS),云端的Fault Domains。
网络/代理:Toxiproxy (TCP毒药),tc/netem, iptables, Envoy fault (delay/abort), Istio fault injection。
过程/节点:"stress-ng",cgroups/CPU-throttle,disk fill。
流量路由:GSLB/DNS重量,用于假冒检查的金丝雀/蓝绿色切换。
6)脚本示例(Kubernetes)
6.1 路线上延迟/abort (Istio VirtualService)
yaml apiVersion: networking. istio. io/v1alpha3 kind: VirtualService metadata: { name: api-chaos }
spec:
hosts: ["api. internal"]
http:
- route: [{ destination: { host: api-svc } }]
fault:
delay: { percentage: { value: 5 }, fixedDelay: 500ms }
abort: { percentage: { value: 1 }, httpStatus: 503 }
假设: 客户端taymauts/retrai和CB将保持p95 <300 ms和error-rate <0。5%.
6.2 Pod Kill (Chaos Mesh)
yaml apiVersion: chaos-mesh. org/v1alpha1 kind: PodChaos metadata: { name: kill-one-api }
spec:
action: pod-kill mode: one selector:
namespaces: ["prod"]
labelSelectors: { "app": "api" }
duration: "2m"
假设:平衡器和HPA可补偿单个实例的损失,而不需要p99> 20%的增长。
6.3网络溷乱(延迟到数据库)
yaml apiVersion: chaos-mesh. org/v1alpha1 kind: NetworkChaos metadata: { name: db-latency }
spec:
action: delay mode: all selector: { namespaces: ["prod"], labelSelectors: {"app":"payments"} }
delay: { latency: "120ms", jitter: "30ms", correlation: "25" }
direction: to target:
selector: { namespaces: ["prod"], labelSelectors: {"role":"db"} }
mode: all duration: "5m"
假设:池/taymout/缓存将减少影响;p95付款将保留≤ SLO。
6.4磁盘填充
yaml apiVersion: chaos-mesh. org/v1alpha1 kind: IOChaos metadata: { name: disk-fill-logs }
spec:
action: fill mode: one selector: { labelSelectors: {"app":"ingest"} }
volumePath: /var/log size: "2Gi"
duration: "10m"
假设:在路线退化之前,定位/配额/异位数的轮换将起作用。
7)K8s外实验
7.1 Toxiproxy(本地/集成)
bash toxiproxy-cli create psp --listen 127. 0. 0. 1:9999 --upstream psp. prod:443 toxiproxy-cli toxic add psp -t latency -a latency=200 -a jitter=50 toxiproxy-cli toxic add psp -t timeout -a timeout=1000
7.2 Envoy HTTP故障(周长/mesh)
yaml fault:
delay: { fixed_delay: 0. 3s, percentage: { numerator: 10, denominator: HUNDRED } }
abort: { http_status: 503, percentage: { numerator: 1, denominator: HUNDRED } }
7.3 AWS FIS(想法示例)
Auto Scaling Group的"杀死"N% EC2实验,人为地提高EBS-latency,并在单个AZ中禁用NAT-GW。
根据CloudWatch SLO度量标准的内置停止标准。
8)混乱期间的观察度量
SLO/SLI: fraction of good requests, p95/p99, burn-rate.
RED模型沿着关键路线(Rate, Errors, Duration)。
池:等待p95连接,utilization。
DB:lag复制品,锁定,漂移p95查询。
网络:retransmits,RTT,dscp/ecn行为。
业务SLI:交易成功(存款/支票),回报/错误百分比。
跟踪:选择性跟踪(exemplars),发布注释的相关性。
9)与SLO/Error-budget的集成
在错误预算内规划实验:溷乱不应"扰乱"季度目标。
Burn-rate alerta作为自动杀手开关。
报告:"多少预算被烧毁","steady-state的哪些缺点"。
10)游戏日(练习)
剧本:简短的传说(例如"东地区丢失"),注射步骤,SLO目标,角色,时间。
评分:RTO/RPO实际,通信质量,运行簿正确性。
复古:有所有者和时间表的改进列表,更新文档/dashbords。
11)自动化和CI/CD
Smoke-chaos:每次发布时都会进行短暂的堆迭测试(例如,每条路线1 pod-kill+200毫秒延迟)。
每晚/每周:报告较重的场景(5-15分钟)。
促销门:如果p95/错误>金丝雀的阈值是自动回滚。
实验目录存储库(YAML+runbook+SLO-thresholds)。
12)反模式
"打破无栏杆":没有停止标准,没有呼叫→真正事件的风险。
一次性促销而不是过程。
没有脚步状态的混乱:目前尚不清楚什么可以算作成功/失败。
注射延迟时,多余的回火→ DDoS。
忽略业务SLI:付款/订单失败时的"technar"成功。
缺乏后期分析和改进的所有者。
13)实施清单(0-45天)
0-10天
定义steady-state SLI(定制+业务)。
选择工具(Chaos Mesh/Litmus/Toxiproxy/FIS)。
描述栏杆:爆炸射线,停止标准,窗口,角色。
11-25天
启动第一个实验:pod-kill, 100-200毫秒延迟至关键的apstream, drop 1%数据包。
自定义burn-rate alerta,将kill-switch与停止条件相关联。
举办第一个游戏日,收集复古和小说。
26-45天
添加AZ/依赖级别脚本(外部PSP, DD-lag)。
自动化舞台上的夜间混乱;准备"季节性"脚本。
实验目录和指导/SRE的定期报告。
14)成熟度量
≥80%的关键路线具有描述的实验和步进状态度量。
自动杀手开关在超过p99/error-rate阈值时触发。
每季度-AZ/区域级别的游戏日;≥1次/多月-目标依赖情景。
MTTR在改进周期后下降,"释放↔事件"相关性降低。
实际故障中"意外"跌落的比例→趋于零。
Dashbords以KPI(burn-rate,恢复时间,成功的DR活动比例)的形式显示"弹性"。
15) guardrails和stop触发器的示例
停止: 'http_req_failed> 1%'3分钟,'p99> 1000 ms' 3窗口,'deposit_success <99。5%`.
降低爆炸射线:自动回滚清单,恢复GSLB重量,禁用故障注射。
停止命令:单个按钮/脚本,并设置原因。
16)文化和过程
混乱是SRE节奏的一部分,不是"极端"。
透明的报告、漏洞识别、纠正措施。
呼叫培训,与客户/合作伙伴进行通信模拟。
与SLA/SLO和预算挂钩:溷乱应该增加而不是破坏可靠性。
17)结论
Chaos Engineering将"九号希望"转变为可证明的可持续性。制定步进状态,放下栏杆,打破小而可控的栏杆,观察SLO和商业SLI,捕捉并自动化改进。然后,真正的失败将成为事件驱动的:可预测的RTO,受保护的错误预算以及团队在不惊慌的情况下行动的意愿。