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 故障注入完成的完整调用链:

LitmusChaos 核心组件交互架构图 LitmusChaos 核心组件交互架构 用户 (kubectl apply) ChaosEngine (CRD 实例) 定义目标、实验、监控、回滚 ChaosOperator (Controller) 监听、校验、协调、创建 Runner ChaosRunner (Job) 执行实验、注入故障、健康检查 ChaosExperiment 实验步骤/镜像/权限 目标 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 工作流程

  1. Operator 监听到 ChaosEngine 创建/更新事件。
  2. 读取 spec.experiments[].name,查找对应的 ChaosExperiment。
  3. 合并 ChaosEngine 传入的环境变量与 ChaosExperiment 默认值。
  4. 创建 ChaosRunner Job(名称格式:<engine-name>-runner)。
  5. 持续监控 Runner Job 状态,直到完成或超时。
  6. 更新 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 集群中的位置与依赖关系:

LitmusChaos 组件分层关系图 组件分层与依赖关系 用户操作层:kubectl apply -f chaosengine.yaml CRD 定义层:ChaosEngine + ChaosExperiment 控制层:ChaosOperator (Controller) 执行层:ChaosRunner (Job) → 目标 Pod
最佳实践: 在生产环境中,建议将 ChaosExperiment 视为“只读”资源,由平台团队统一管理;开发/测试团队只通过 ChaosEngine 配置实验参数。这符合 GitOps 和权限最小化原则。