混沌工程通过主动注入故障来验证系统韧性,Chaos Mesh是Kubernetes生态中功能最完整的混沌工程平台。在微服务架构下,网络分区、延迟抖动、DNS解析失败等故障难以在测试环境自然触发,Chaos Mesh提供了声明式故障注入能力,能在不修改应用代码的情况下模拟真实故障场景。
Chaos Mesh架构与安装
Chaos Mesh基于Kubernetes CRD(Custom Resource Definition)实现,通过控制器模式管理故障注入的生命周期:
# Helm安装Chaos Mesh
helm repo add chaos-mesh https://charts.chaos-mesh.org
helm install chaos-mesh chaos-mesh/chaos-mesh \
-n chaos-testing --create-namespace \
--set chaosDaemon.runtime=containerd \
--set dashboard.securityMode=false
# 验证安装
kubectl get pods -n chaos-testing
# chaos-controller-manager-xxx 1/1 Running
# chaos-daemon-xxx 1/1 Running
# chaos-dashboard-xxx 1/1 Running
# 确认CRD已注册
kubectl get crd | grep chaos
# networkchaos.chaos-mesh.org
# podchaos.chaos-mesh.org
# iochaos.chaos-mesh.org
# stresschaos.chaos-mesh.org
# dnschaos.chaos-mesh.org
Chaos Mesh的核心组件包括chaos-controller-manager(调度和CRD管理)、chaos-daemon(在每个节点执行故障注入)、chaos-dashboard(Web可视化界面)。故障注入通过Linux tc(traffic control)、iptables、ebpf等内核机制实现。
网络延迟故障注入
NetworkChaos是最常用的故障类型,模拟网络延迟、丢包、重复包、带宽限制等场景。以下实验模拟订单服务调用支付服务时50%的请求延迟2000ms:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-latency-injection
namespace: chaos-testing
spec:
action: delay
mode: all
selector:
namespaces:
- production
labelSelectors:
"app.kubernetes.io/name": "payment-service"
direction: to
target:
mode: all
selector:
namespaces:
- production
labelSelectors:
"app.kubernetes.io/name": "order-service"
delay:
latency: "2000ms"
correlation: "50"
jitter: "500ms"
duration: "5m"
scheduler:
cron: "@every 1h"
部署并观察效果:
kubectl apply -f payment-latency-injection.yaml
kubectl get networkchaos -n chaos-testing
# NAME AGE STATUS
# payment-latency-injection 10s Injected
# 从order-service容器内验证延迟
kubectl exec -it deploy/order-service -- sh -c \
"time curl -o /dev/null -s http://payment-service:8080/api/health"
# 正常: real 0.05s
# 故障注入后: real 2.03s
# 在tc层面验证故障注入
kubectl exec -it deploy/payment-service -- tc qdisc show dev eth0
# qdisc netem 1: root refcnt 2 limit 1000 delay 2.0s 500ms 50%
网络丢包与分区故障模拟
模拟服务间30%丢包,验证重试机制和熔断器是否生效:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-packet-loss
namespace: chaos-testing
spec:
action: loss
mode: all
selector:
namespaces: [production]
labelSelectors:
app: payment-service
direction: to
target:
mode: all
selector:
namespaces: [production]
labelSelectors:
app: order-service
loss:
loss: "30"
correlation: "25"
duration: "3m"
网络分区故障模拟更极端——完全隔离两个服务之间的通信:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-network-partition
namespace: chaos-testing
spec:
action: partition
mode: all
selector:
namespaces: [production]
labelSelectors:
app: payment-service
direction: to
target:
mode: all
selector:
namespaces: [production]
labelSelectors:
app: gateway
duration: "2m"
scheduler:
cron: "0 14 * * 1-5"
分区故障下,gateway完全无法访问payment-service。此时需要验证:网关的fallback降级逻辑是否生效、熔断器是否在阈值触发后open、消息队列是否接住了未能即时处理请求、监控告警是否在30秒内发出通知。
Pod级故障注入
PodChaos模拟容器级别的故障,包括Pod Kill、Container Kill、Pod OOM等:
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: payment-pod-kill
namespace: chaos-testing
spec:
action: pod-kill
mode: one
selector:
namespaces: [production]
labelSelectors:
app: payment-service
scheduler:
cron: "@every 10m"
---
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: payment-memory-stress
namespace: chaos-testing
spec:
mode: all
selector:
namespaces: [production]
labelSelectors:
app: payment-service
stressors:
memory:
workers: 2
size: "512MB"
duration: "5m"
Pod Kill实验验证Kubernetes的自动恢复能力:HPA是否自动扩容新Pod、就绪探针是否阻止流量打到未就绪的Pod、session保持是否会话中断。
DNS故障注入
DNS解析故障在微服务环境中影响面广但难以复现。DNSChaos模拟DNS服务器返回错误或延迟:
apiVersion: chaos-mesh.org/v1alpha1
kind: DNSChaos
metadata:
name: dns-random-error
namespace: chaos-testing
spec:
action: error
mode: all
selector:
namespaces: [production]
labelSelectors:
app: order-service
patterns:
- "payment-service.production.svc.cluster.local"
- "redis-cluster.production.svc.cluster.local"
duration: "3m"
DNSChaos通过修改Pod的DNS配置,只影响目标Pod,不干扰集群其他服务。order-service在故障期间无法解析payment-service,需要在本地配置兜底IP或服务网格的DNS缓存。
编排式自动化实验
单次故障注入测试价值有限,生产级混沌工程需要编排式实验——按顺序执行多步骤故障场景。Chaos Mesh支持Workflow:
apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
name: payment-resilience-test
namespace: chaos-testing
spec:
entry: main
templates:
- name: main
templateType: Serial
children: [baseline-check, inject-latency, verify-slo, cleanup]
- name: baseline-check
templateType: Task
task:
container:
image: busybox
command: ["sh", "-c", "curl -sf http://gateway/api/health"]
- name: inject-latency
templateType: NetworkChaos
networkChaos:
action: delay
mode: all
selector:
labelSelectors:
app: payment-service
delay:
latency: "3000ms"
duration: "5m"
- name: verify-slo
templateType: Task
task:
container:
image: curlimages/curl
command: ["sh", "-c"]
args:
- |
FAIL=0
for i in $(seq 1 60); do
CODE=$(curl -o /dev/null -s -w "%{http_code}" http://gateway/api/order)
if [ "$CODE" != "200" ] && [ "$CODE" != "503" ]; then
FAIL=1; break
fi
sleep 5
done
exit $FAIL
- name: cleanup
templateType: Task
task:
container:
image: bitnami/kubectl
command: ["kubectl", "delete", "networkchaos", "-n", "chaos-testing", "--all"]
Workflow按照baseline-check -> inject-latency -> verify-slo -> cleanup的顺序执行。verify-slo步骤在故障注入期间持续验证SLO(可用性99%+、错误率<1%),只有全部通过才判定实验成功。
实验结果分析与告警联动
Chaos Mesh原生集成Prometheus,实验期间的关键指标可通过Grafana对比分析:
# Chaos Mesh暴露的Prometheus指标
# chaos_mesh_experiments: 当前活跃的实验数
# chaos_mesh_experiments_phase: 实验阶段(Running/Finished/Paused)
# Grafana面板叠加业务指标与故障时间轴
# Panel 1: HTTP请求成功率(叠加NetworkChaos时间轴)
# Panel 2: P99响应延迟(叠加PodKill时间轴)
# 自动化判定脚本
python3 << 'EOF'
import requests
PROMQL = {
"success_rate": 'sum(rate(http_requests_total{status=~"2.."}[1m])) / sum(rate(http_requests_total[1m]))',
"p99_latency": 'histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[1m])) by (le))',
}
def query(promql):
r = requests.get("http://prometheus:9090/api/v1/query", params={"query": promql})
return float(r.json()["data"]["result"][0]["value"][1])
experiment_sr = query(PROMQL["success_rate"])
experiment_p99 = query(PROMQL["p99_latency"])
assert experiment_sr >= 0.99, f"成功率低于SLO: {experiment_sr}"
assert experiment_p99 <= 1.0, f"P99超SLO: {experiment_p99}s"
print(f"实验期: 成功率={experiment_sr:.4f}, P99={experiment_p99:.3f}s - PASS")
EOF
混沌工程不是制造混乱,而是在受控条件下发现系统脆弱点。每次实验的产出应该是一个明确的结论:系统在X故障下表现如何、SLO是否达成、需要改进什么。将实验纳入CI/CD流水线,在每次发版前自动执行回归实验,才能真正建立系统韧性的信心。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/hun-dun-gong-cheng-shi-zhan-chaosmesh-zhu-ru-wang-luo-yan/