混沌工程不是搞破坏而是验证系统韧性
生产环境里数据库连接池耗尽、Pod被驱逐、节点宕机——这些故障不是会不会发生的问题,而是什么时候发生的问题。混沌工程的核心思路是:在故障真正发生之前,用受控的故障注入来发现系统的脆弱点。与其等着凌晨3点被电话叫醒,不如在白天用Chaos Mesh主动把Pod杀掉,看看服务能不能自动恢复。
SRE稳定性工程实践里,混沌工程是验证层面不可或缺的一环。监控告警能告诉你系统出了问题,但只有故障注入能告诉你系统在故障发生时的真实表现。
Chaos Mesh部署与架构
Chaos Mesh是CNCF孵化项目,原生支持Kubernetes环境,通过CRD(Custom Resource Definition)定义故障注入规则。支持四大类故障:PodChaos(Pod级别)、NetworkChaos(网络级别)、StressChaos(资源压力)、IOChaos(磁盘IO)。
部署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 \
--namespace chaos-testing \
--set chaosDaemon.runtime=containerd \
--set chaosDaemon.socketPath=/run/containerd/containerd.sock \
--set dashboard.create=true
# 验证安装
kubectl get pods -n chaos-testing
Dashboard默认通过NodePort暴露:kubectl port-forward -n chaos-testing svc/chaos-dashboard 2333:2333
PodChaos:验证Pod自动恢复能力
最基础的故障注入是PodKill——随机杀掉指定范围内的Pod,验证Kubernetes的自动重建和流量切换。
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: order-service-pod-kill
namespace: chaos-testing
spec:
action: pod-kill
mode: one
duration: "30s"
selector:
namespaces:
- production
labelSelectors:
app: order-service
scheduler:
cron: "@every 5m"
mode: one每次随机杀一个Pod。cron: @every 5m每5分钟执行一次。执行期间观察:
1. 被杀Pod是否在30秒内完成重建
2. 上下游服务是否出现5xx错误
3. 监控告警是否按预期触发
4. 客户端重试是否生效
PodFailure是另一种模式——不是杀掉Pod,而是把Pod标记为失败状态,模拟应用层面崩溃但进程不退出的场景。这类故障更难检测,因为健康检查可能依然通过。
NetworkChaos:验证网络分区与延迟容错
微服务架构下,网络延迟和分区是最常见的故障类型。NetworkChaos支持延迟注入、丢包注入、分区注入。
模拟订单服务到支付服务之间200ms延迟:
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: order-service
delay:
latency: "200ms"
jitter: "50ms"
direction: to
target:
selector:
namespaces:
- production
labelSelectors:
app: payment-service
mode: all
duration: "10m"
200ms基础延迟加50ms抖动,持续10分钟。这个场景要验证的核心问题:
1. 订单服务的超时设置是否合理(如果连接池超时也是200ms,那就是灾难)
2. 重试机制是否会导致雪崩(下游延迟时重试反而加重负载)
3. 熔断器是否在延迟累积时及时打开
网络分区注入——模拟两个服务之间完全断联:
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: cache-partition
namespace: chaos-testing
spec:
action: partition
mode: all
selector:
namespaces:
- production
labelSelectors:
app: api-gateway
direction: to
target:
selector:
namespaces:
- production
labelSelectors:
app: redis-cluster
mode: all
duration: "5m"
网关到Redis完全断联5分钟。这是验证缓存降级策略的黄金场景——Redis不可用时,服务应该fallback到本地缓存或直接返回降级数据,而不是直接500。
StressChaos:验证资源竞争下的服务表现
CPU和内存压力测试模拟节点上资源竞争的场景。当某个邻居Pod占用大量CPU时,你的服务延迟会怎么变?
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: cpu-stress-test
namespace: chaos-testing
spec:
mode: one
selector:
namespaces:
- production
labelSelectors:
app: data-processor
stressors:
cpu:
workers: 4
load: 80
duration: "15m"
4个worker线程各占80% CPU,持续15分钟。观察被注入Pod的请求延迟分布P99是否抖动、是否触发CPU throttle、HPA是否按预期扩容。
混沌工程实验流程与安全围栏
混沌工程不是随意破坏,必须遵循受控实验流程:
1. 定义稳态假设:系统在正常状态下的核心指标(P99延迟小于100ms,错误率小于0.1%)
2. 设计故障场景:选择与业务风险最相关的故障类型
3. 在生产或预生产环境执行:推荐先在预生产环境验证,再逐步引入生产
4. 观察系统行为:对比稳态假设,记录偏差
5. 修复发现的问题:修改超时配置、增加重试、调整熔断阈值
安全围栏配置——Chaos Mesh支持设置全局暂停和自动回滚:
# 紧急暂停所有混沌实验
kubectl annotate networkchaos payment-latency-injection \
chaos-mesh.org/pause=true \
--overwrite
# 查看所有运行中的实验
kubectl get chaos -n chaos-testing
自动化围栏建议:在Prometheus中配置规则,当错误率超过阈值时自动暂停混沌实验。Chaos Mesh的Webhook机制可以与告警系统联动,实现故障注入与安全边界的自动管理。
混沌工程的价值不在注入故障本身,而在于你从故障暴露的脆弱点中学到什么。每次实验都应有明确的稳态假设、可观测的结果、可执行的改进动作。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-hun-dun-gong-cheng-shi-zhan-chaosmesh-gu-zhang/