3. LitmusChaos 核心组件解析:CRD 驱动的混沌工程
LitmusChaos 基于 Kubernetes CRD(Custom Resource Definition)扩展机制,将混沌实验定义为声明式资源。理解其四大核心组件——ChaosOperator、ChaosRunner、ChaosEngine 和 ChaosExperiment——是掌握 Pod 故障注入的关键。它们共同构成了“定义-调度-执行-监控”的闭环。
核心要点: ChaosEngine 是用户入口,ChaosExperiment 是实验蓝图,ChaosOperator 是调度大脑,ChaosRunner 是执行代理。四者通过 CRD 和控制器模式协作,无需手动操作 Pod。
3.1 组件总览与职责划分
下表从作用层级、生命周期和用户交互三个维度对比四个核心组件:
| 组件 | K8s 资源类型 | 核心职责 | 用户操作 | 生命周期 |
|---|---|---|---|---|
| ChaosOperator | Deployment + Controller | 监听 ChaosEngine,协调实验流程 | 无需直接操作 | 常驻集群 |
| ChaosRunner | Job(一次性) | 执行具体故障注入与恢复 | 自动创建/销毁 | 实验期间存活 |
| ChaosEngine | CRD 实例 | 定义实验目标、参数、监控 | 用户创建/更新 | 持久化 |
| ChaosExperiment | CRD 实例 | 定义实验步骤、镜像、权限 | 用户创建(通常预置) | 持久化 |
设计哲学: ChaosEngine 与 ChaosExperiment 分离,使得“实验配置”与“实验定义”解耦。同一份 ChaosExperiment(如 pod-delete)可以被多个 ChaosEngine 以不同参数复用。
3.2 组件交互流程与架构
下图展示了从用户提交 ChaosEngine 到 Pod 故障注入完成的完整调用链:
流程说明: 用户创建 ChaosEngine → Operator 监听到事件 → 校验并实例化 ChaosRunner(Job)→ Runner 读取 ChaosExperiment 定义 → 执行故障注入到目标 Pod → 更新 ChaosEngine 状态。整个过程无需 SSH 进入节点或手动执行脚本。
3.3 ChaosExperiment CRD:实验蓝图
ChaosExperiment 是不可变的实验定义模板,通常由 LitmusChaos 社区预置或用户自定义。它描述了“做什么”和“怎么做”。
3.3.1 关键字段
| 字段路径 | 类型 | 说明 | 示例值 |
|---|---|---|---|
spec.definition.image |
string | 实验执行容器镜像 | litmuschaos/go-runner:latest |
spec.definition.scope |
string | 实验作用域(Namespaced/Cluster) | Namespaced |
spec.definition.permissions |
array | RBAC 规则,定义实验所需权限 | [{"apiGroups":[""],"resources":["pods"],"verbs":["list","delete"]}] |
spec.definition.experiments |
array | 实验步骤列表(probe、action、recovery) | [{"name":"pod-delete","steps":[...]}] |
3.3.2 预置实验示例(pod-delete)
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosExperiment
metadata:
name: pod-delete
namespace: litmus
spec:
definition:
scope: Namespaced
image: "litmuschaos/go-runner:latest"
permissions:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list", "get", "delete"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "patch"]
experiments:
- name: pod-delete
steps:
- name: inject-pod-delete
action: delete
target: pod
filters:
- key: app
value: nginx
注意: ChaosExperiment 通常由集群管理员安装,普通用户只创建 ChaosEngine。不要随意修改预置实验定义,除非你清楚 RBAC 和镜像兼容性。
3.4 ChaosEngine CRD:实验配置单
ChaosEngine 是用户直接操作的 CRD,它引用一个 ChaosExperiment,并填充具体参数:目标应用、注入持续时间、探针、回滚策略等。
3.4.1 核心字段解析
| 字段 | 必填 | 说明 |
|---|---|---|
spec.engineState |
是 | 引擎状态:active 或 stop |
spec.experiments[].name |
是 | 引用的 ChaosExperiment 名称 |
spec.experiments[].spec.components |
否 | 实验参数覆盖(如 duration、target pod) |
spec.appinfo |
是 | 目标应用信息(applabel、namespace) |
spec.monitoring |
否 | 监控配置(prometheus 端点等) |
3.4.2 典型 ChaosEngine YAML
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: nginx-pod-delete-engine
namespace: default
spec:
engineState: "active"
appinfo:
appns: "default"
applabel: "app=nginx"
appkind: "deployment"
experiments:
- name: pod-delete
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: "60"
- name: CHAOS_INTERVAL
value: "10"
- name: TARGET_PODS
value: "1"
关键设计:
spec.appinfo 通过 label selector 动态匹配目标 Pod,无需硬编码 Pod 名称。这使得 ChaosEngine 可以适应扩缩容场景。
3.5 ChaosOperator:调度与协调中枢
ChaosOperator 是一个标准的 Kubernetes Controller,运行在 litmus 命名空间中。它通过 Informer 机制监听 ChaosEngine 资源的变化。
3.5.1 核心职责
- 校验:验证 ChaosEngine 引用的 ChaosExperiment 是否存在、参数是否合法。
- 实例化:为每个活跃的 ChaosEngine 创建对应的 ChaosRunner(Job)。
- 生命周期管理:当 ChaosEngine 被删除或状态变为
stop时,终止 Runner Job。 - 状态同步:将实验执行结果写回 ChaosEngine 的
status字段。
3.5.2 工作流程
- Operator 监听到
ChaosEngine创建/更新事件。 - 读取
spec.experiments[].name,查找对应的ChaosExperiment。 - 合并 ChaosEngine 传入的环境变量与 ChaosExperiment 默认值。
- 创建
ChaosRunnerJob(名称格式:<engine-name>-runner)。 - 持续监控 Runner Job 状态,直到完成或超时。
- 更新 ChaosEngine
status为completed或failed。
3.6 ChaosRunner:故障注入执行者
ChaosRunner 是一个一次性 Job,由 ChaosOperator 自动创建。它运行在目标应用所在的命名空间中,直接与 Kubernetes API 交互以执行故障注入。
3.6.1 执行流程
- 初始化:读取 ChaosEngine 和 ChaosExperiment 的合并配置。
- 前置探针:检查目标 Pod 是否就绪、服务是否正常。
- 注入故障:根据实验类型执行操作(如
kubectl delete pod、网络延迟注入)。 - 等待恢复:等待
TOTAL_CHAOS_DURATION秒后自动恢复。 - 后置探针:验证应用是否恢复正常。
- 清理:删除临时资源,上报结果。
3.6.2 Runner 日志查看
# 查看 Runner Job
kubectl get jobs -n default -l "app.kubernetes.io/component=chaos-runner"
# 查看 Runner Pod 日志
kubectl logs -n default -l "job-name=nginx-pod-delete-engine-runner" --tail=50
调试技巧: 如果实验失败,首先检查 ChaosRunner Pod 的日志。常见错误包括:RBAC 权限不足、目标 Pod label 不匹配、ChaosExperiment 镜像拉取失败。
3.7 组件关系总结
下图以分层视角展示四个组件在 Kubernetes 集群中的位置与依赖关系:
最佳实践: 在生产环境中,建议将 ChaosExperiment 视为“只读”资源,由平台团队统一管理;开发/测试团队只通过 ChaosEngine 配置实验参数。这符合 GitOps 和权限最小化原则。