必须先安装ChaosBlade Operator(v1.10.2),验证其Deployment就绪及chaosblade-tool DaemonSet在每Node运行;再通过CRD或CLI执行Pod删除、网络延迟等故障实验,并用kubectl或blade命令管理状态与销毁。

要在Kubernetes集群中真实模拟Pod崩溃、网络抖动、CPU过载等云原生典型故障,必须绕过手动干预和脚本拼凑,直接用ChaosBlade的声明式CRD机制触发可追踪、可回滚、与K8s原生生命周期对齐的混沌实验。
安装ChaosBlade Operator
这一步是所有后续实验的前提,Operator未就绪时任何blade资源创建都会被忽略。
使用kubectl一键部署最新稳定版(截至2026年9月,推荐v1.10.2):
kubectl apply -f https://raw.githubusercontent.com/chaosblade-io/chaosblade-operator/releases/v1.10.2/deploy/kubernetes/chaosblade-operator.yaml
等待chaosblade-operator Deployment就绪,并确认每个Node上都运行着chaosblade-tool DaemonSet:
kubectl wait --for=condition=available deployment/chaosblade-operator -n chaosblade-system --timeout=120s
【必须验证】执行kubectl get pod -n chaosblade-system -l app.kubernetes.io/name=chaosblade-tool,输出应至少包含与Node数量一致的Pod——少于Node数说明某些节点因权限或容器运行时不兼容而跳过部署,该节点将无法执行任何本地实验。
用YAML定义并执行Pod删除实验
适用于验证控制器(如Deployment)的自愈能力,或测试有状态应用的故障转移逻辑。
第一步:编写delete-pod-by-labels.yaml,核心字段必须包含scope、target、action和matchers中的labels+namespace:
apiVersion: chaosblade.io/v1alpha1kind: ChaosBlademetadata: name: delete-mysql-podspec: experiments: - scope: pod target: pod action: delete matchers: - name: labels value: ["app=mysql"] - name: namespace value: ["default"] - name: evict-count value: ["1"]
第二步:提交实验资源:
kubectl apply -f delete-pod-by-labels.yaml
第三步:立即观察目标Pod是否被驱逐并由控制器重建:
kubectl get pod -n default -l app=mysql -w
第四步:5秒内检查ChaosBlade资源状态,确认phase变为Running:
kubectl get blade delete-mysql-pod -o jsonpath='{.status.phase}'
注意:若phase为Error,需立刻查看kubectl describe blade delete-mysql-pod中的Events字段,常见原因是label不存在或namespace拼写错误——这两个字段一旦写错,Operator不会报错但实验静默失败。
用CLI快速注入网络延迟
当需要临时调试服务间调用超时问题,或验证Sidecar对网络异常的拦截能力时,CLI方式比写YAML更快。
方法一:对指定Pod注入3秒固定延迟(影响所有出向流量)
blade create k8s network delay --interface eth0 --time 3000 --timeout 120 --namespace default --labels "app=frontend"
方法二:仅对访问MySQL服务的流量注入延迟(精准控制)
blade create k8s network delay --interface eth0 --time 3000 --timeout 120 --namespace default --labels "app=frontend" --destination-ip 10.96.123.45 --destination-port 3306
执行后立即生效,无需重启Pod。延迟效果可通过curl -v http://backend-svc观察响应时间变化验证。
方法三:撤销所有网络类实验(全局清理)
blade destroy $(blade status --type k8s --state success | grep network | awk '{print $1}')
这一步操作起来很简单,直接把命令粘贴执行即可,但要注意:如果之前执行过多个network实验,此命令会一次性销毁全部,不可逆。
验证实验状态与自动恢复
ChaosBlade实验默认不自动终止,必须显式销毁或依赖timeout参数到期。
① 查看当前所有正在运行的实验:
kubectl get blade --all-namespaces
② 获取某次实验的详细执行日志(含实际注入的iptables规则或cgroup限制):
kubectl get blade delete-mysql-pod -o yaml | grep -A 20 "status:"
③ 销毁指定实验(释放资源、恢复网络、停止CPU占用等):
kubectl delete blade delete-mysql-pod
④ 等待Operator检测到资源删除,自动调用chaosblade-tool执行清理——整个过程通常在3秒内完成,Pod状态回归正常。

















