混沌工程解决什么问题
SRE团队面临的核心矛盾是:生产环境的复杂度远超测试覆盖范围。微服务架构下,一个请求链路可能穿越十几层服务调用、多个中间件和跨可用区网络。传统测试验证的是”正常路径是否工作”,混沌工程验证的是”异常条件下系统是否仍能维持SLA”。这两者的区别决定了生产环境的真实可靠性上限。
稳态假设:混沌实验的设计起点
每个混沌实验必须从一个可量化的稳态假设出发。假设的格式是:”在正常条件下,指标X维持在范围Y内”。如果注入故障后该指标仍在Y范围内,说明系统对该故障具有韧性;如果偏离,就找到了需要修复的薄弱点。
# 稳态假设示例
# 假设1: API P99延迟 < 500ms
# 假设2: 订单服务错误率 < 0.1%
# 假设3: 数据库连接池使用率 < 70%
# 假设4: 消息队列积压 < 1000条
# 用PromQL验证稳态
# P99延迟
histogram_quantile(0.99,
rate(http_request_duration_seconds_bucket[5m])
) < 0.5
# 错误率
rate(http_requests_total{code=~"5.."}[5m])
/ rate(http_requests_total[5m]) < 0.001
Chaos Mesh:Kubernetes混沌实验平台部署
Chaos Mesh是CNCF孵化项目,原生支持Kubernetes环境的多种故障注入。部署流程:
# Helm安装Chaos Mesh
helm repo add chaos-mesh https://charts.chaos-mesh.org
helm repo update
helm install chaos-mesh chaos-mesh/chaos-mesh --namespace chaos-testing --create-namespace --set chaosDaemon.runtime=containerd --set dashboard.create=true --set dashboard.securityMode=false
# 验证安装
kubectl get pods -n chaos-testing
kubectl port-forward -n chaos-testing svc/chaos-dashboard 2333:2333
# 访问Dashboard: http://localhost:2333
Pod故障注入实验:验证服务降级策略
Pod Kill是最基本的混沌实验,验证服务在实例意外消失时的恢复能力和流量调度策略:
# pod-kill-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: order-service-pod-kill
namespace: chaos-testing
spec:
action: pod-kill
mode: one
selector:
namespaces:
- production
labelSelectors:
app: order-service
scheduler:
cron: "@every 300s" # 每5分钟杀一个Pod
duration: "30s"
# 执行实验
kubectl apply -f pod-kill-experiment.yaml
# 监控指标变化
kubectl port-forward -n monitoring svc/prometheus 9090:9090
# 观察Order服务的QPS、延迟、错误率
实验过程中需要关注的指标变化:
- Pod重建时间:从Killed到Ready的时间,反映健康检查和启动流程的效率
- 请求错误率:Pod消失瞬间是否有5xx错误,反映负载均衡摘除速度
- 下游服务影响:上游调用方的超时和重试是否正常触发
网络延迟与分区故障注入
网络问题是生产环境最高频的故障来源。Chaos Mesh支持精确控制延迟、丢包和分区:
# network-delay-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: db-access-delay
namespace: chaos-testing
spec:
action: delay
mode: all
selector:
namespaces:
- production
labelSelectors:
app: api-gateway
delay:
latency: "500ms" # 注入500ms延迟
jitter: "100ms" # 抖动±100ms
correlation: "50" # 50%相关性
direction: to # 影响出站流量
target:
selector:
namespaces:
- production
labelSelectors:
app: mysql-primary
duration: "10m"
---
# network-partition-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: cross-az-partition
namespace: chaos-testing
spec:
action: partition
mode: all
selector:
namespaces:
- production
labelSelectors:
topology.kubernetes.io/zone: cn-east-1a
direction: both
target:
selector:
namespaces:
- production
labelSelectors:
topology.kubernetes.io/zone: cn-east-1b
duration: "5m"
跨可用区分区实验需要验证的关键行为:Redis哨兵是否正确触发故障转移、数据库只读副本是否被正确提升、客户端是否有可用区亲和性导致的请求堆积。
IO故障注入:验证存储韧性
磁盘IO故障往往比网络故障更隐蔽,表现为性能缓慢劣化而非硬性错误:
# io-fault-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: IOChaos
metadata:
name: mysql-io-delay
namespace: chaos-testing
spec:
action: latency
mode: one
selector:
namespaces:
- production
labelSelectors:
app: mysql-primary
delay: "200ms"
path: "/var/lib/mysql"
percent: 50 # 50%的IO操作被延迟
duration: "10m"
IO延迟注入暴露的问题通常是连接池耗尽——数据库响应变慢导致应用侧连接池积压,最终触发级联故障。修复方向是确保连接池配置合理(最大连接数、超时时间、空闲回收),并配合断路器在下游响应慢时快速失败。
实验安全控制与自动回滚
混沌实验必须在可控范围内执行,否则就是制造故障而非验证韧性。安全控制策略:
# 1. 时间窗口限制:仅在低峰期执行
# 2. 范围限制:先在staging环境验证,再到production
# 3. 自动终止条件:稳态假设被打破时立即回滚
# 使用Chaos Mesh的Workflow编排
apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
name: resilience-test
namespace: chaos-testing
spec:
entry: entry
templates:
- name: entry
templateType: Serial
children:
- check-baseline
- inject-fault
- verify-recovery
- name: inject-fault
templateType: PodChaos
deadline: 5m
podChaos:
selector:
namespaces: [production]
labelSelectors:
app: order-service
action: pod-kill
mode: one
- name: verify-recovery
templateType: HTTP
http:
url: "http://prometheus:9090/api/v1/query"
method: GET
# 验证延迟恢复到基线水平
每次混沌实验结束后,记录实验条件、系统行为和发现的问题,形成韧性测试知识库。这些数据是SRE团队持续改进系统可靠性的核心依据,也是新成员快速理解系统薄弱点的最佳参考。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/hun-dun-gong-cheng-luo-di-shi-zhan-cong-gu-zhang-zhu-ru-dao/