网站运维体系中,混沌工程是验证系统稳定性的主动手段。通过在Kubernetes容器编排环境中注入Pod故障、网络延迟、资源竞争等异常,提前暴露系统脆弱点。Chaos Mesh是CNCF毕业的混沌工程平台,原生集成Kubernetes,支持多种故障注入类型。本文以Chaos Mesh实战配置为例,介绍混沌实验设计与稳定性验证方法。
Chaos Mesh架构原理与安装部署
Chaos Mesh以Kubernetes Custom Resource Definition(CRD)方式运行,通过定义ChaosExperiment资源对象来描述故障注入行为。控制器监听这些CRD对象,在目标Pod上执行具体的故障操作。
安装Chaos Mesh:
# 添加Helm仓库
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 chaosDaemon.runtime=containerd \
--set chaosDaemon.socketPath=/run/containerd/containerd.sock
# 验证安装
kubectl get pods -n chaos-testing
kubectl get crd | grep chaos
安装完成后,系统会注册PodChaos、NetworkChaos、IOChaos、StressChaos、TimeChaos、DNSChaos等CRD。每种CRD对应一类故障注入能力。
Pod故障注入实验设计
PodKill和PodFailure是最常用的两类Pod级故障注入。PodKill直接删除目标Pod,模拟容器崩溃;PodFailure修改Pod的image为不可用镜像,模拟持续故障。
PodKill实验配置——随机杀死指定标签的Pod:
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-kill-experiment
namespace: chaos-testing
spec:
action: pod-kill
mode: one
selector:
namespaces:
- production
labelSelectors:
app: order-service
scheduler:
cron: "@every 10m"
duration: "30s"
关键参数说明:
- mode:one(随机选一个Pod)、all(所有匹配Pod)、fixed-percent(按比例)、fixed(固定数量)
- selector:通过namespace、labelSelector、annotationSelector、podPhaseSelector过滤目标
- scheduler.cron:定时执行,支持Cron表达式
- duration:实验持续时间(对pod-kill不生效,该动作瞬时完成)
验证高可用集群的自愈能力,观察Pod被杀死后是否在预期时间内重新调度,Service端点是否自动更新。
网络延迟与分区故障模拟
微服务间网络异常是生产环境高频故障。NetworkChaos支持注入网络延迟、丢包、重复、乱序、带宽限制和分区。
注入200ms网络延迟,10%丢包率:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-delay-experiment
namespace: chaos-testing
spec:
action: delay
mode: all
selector:
namespaces:
- production
labelSelectors:
app: payment-service
delay:
latency: "200ms"
correlation: "100"
jitter: "50ms"
loss:
loss: "10"
correlation: "50"
duration: "5m"
scheduler:
cron: "@every 30m"
网络分区模拟,切断order-service与inventory-service之间的通信:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-partition
namespace: chaos-testing
spec:
action: partition
mode: all
selector:
namespaces:
- production
labelSelectors:
app: order-service
direction: to
target:
selector:
namespaces:
- production
labelSelectors:
app: inventory-service
mode: all
duration: "3m"
分区实验验证服务降级逻辑是否正确触发,熔断器是否在预期时间内打开,以及分区恢复后服务是否能自动恢复。
稳定性验证指标与自动化流水线集成
混沌实验的价值在于发现系统在异常条件下的行为。实验执行期间需要监控核心SLI指标,对比正常基线和故障状态下的表现。
关键监控指标:
- 请求成功率(Success Rate):低于99.9%触发告警
- P99延迟:超过基线2倍需分析根因
- 错误率:按HTTP状态码分类统计
- Pod重启次数:异常重启表明应用未正确处理故障
将混沌实验集成到CI/CD流水线,实现自动化稳定性验证:
# chaos-pipeline.yaml - GitLab CI配置
chaos_test:
stage: validation
image: bitnami/kubectl:latest
script:
- kubectl apply -f experiments/pod-kill.yaml -n chaos-testing
- sleep 60
- |
STATUS=$(kubectl get podchaos pod-kill-experiment \
-n chaos-testing -o jsonpath='{.status.experiment.desiredPhase}')
if [ "$STATUS" != "Running" ]; then
echo "Chaos experiment not running"
exit 1
fi
- |
SUCCESS_RATE=$(curl -s "http://prometheus:9090/api/v1/query?query=rate(http_requests_total{status!~\"5..\"}[1m])/rate(http_requests_total[1m])" | jq -r '.data.result[0].value[1]')
if (( $(echo "$SUCCESS_RATE < 0.999" | bc -l) )); then
echo "Success rate below 99.9%"
kubectl delete podchaos pod-kill-experiment -n chaos-testing
exit 1
fi
- kubectl delete podchaos pod-kill-experiment -n chaos-testing
only:
- main
实验记录应包含实验名称、注入故障类型、影响范围、持续时间、SLI变化曲线、异常行为描述和改进措施。持续运行的混沌实验计划能够系统性提升系统韧性,将故障应急响应从被动救火转为主动预防。Docker自动化部署场景下,Chaos Mesh还可注入IO延迟和磁盘错误,验证存储层的容错能力。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-hun-dun-gong-cheng-shi-zhan-chaosmesh-gu-zhang/