3、实验准入概念:为什么需要准入控制?实验准入的定义、在混沌工程中的位置(注入前校验)

3.1 为什么需要准入控制?—— 从“自由实验”到“安全实验”

在混沌工程实践中,如果没有准入控制,任何拥有实验创建权限的用户都可以随意向集群注入故障。这种“自由实验”模式在开发环境或许可行,但在预发、生产等高敏感环境中,会带来以下严重风险:

  • 误操作范围失控: 实验目标(selector)写错,导致故障注入到关键业务 Pod,引发大规模服务中断。
  • 资源过载: 同时运行过多高消耗实验(如 CPU 满载、磁盘 I/O 风暴),导致节点资源耗尽,影响同节点其他工作负载。
  • 安全合规违规: 实验可能触及包含敏感数据的命名空间或服务,违反数据保护法规(如 GDPR、等保)。
  • 缺乏审计与追溯: 没有实验创建、修改、执行的审批记录,事故发生后无法定位责任人。
核心原则: 混沌工程不是“混乱工程”。准入控制是保障实验安全的第一道防线,确保每一次故障注入都是经过校验、受控且可审计的。

3.2 实验准入的定义

实验准入(Experiment Admission) 是指在混沌实验被提交到 Kubernetes API Server 之后、实际注入故障之前,由专门的准入控制器对实验配置进行的一系列校验、修改或拒绝操作。它本质上是一个 策略执行点,位于实验生命周期中的“创建/更新”阶段。

实验准入的核心职责包括:

职责维度 具体说明 示例
语法校验 检查实验 YAML 的字段格式、必填项、类型是否正确 确保 selector.namespaces 不为空,duration 为合法时间字符串
语义校验 检查实验逻辑是否合理、是否与现有策略冲突 禁止对 kube-system 命名空间注入网络分区
权限校验 验证用户或 ServiceAccount 是否有权在目标资源上执行该实验 仅允许 SRE 团队在生产命名空间创建 Pod-Kill 实验
资源配额校验 检查当前集群资源是否足以承载该实验,避免过载 限制同时运行的 CPU 压力实验不超过 3 个
合规校验 检查实验是否违反组织安全策略或行业合规要求 禁止在标记为 compliance: pci 的命名空间执行磁盘故障实验

3.3 实验准入在混沌工程中的位置(注入前校验)

为了清晰展示实验准入在整个混沌实验生命周期中的位置,下图以 Chaos Mesh 为例,展示了从用户提交实验到故障注入完成的核心流程:

实验准入在混沌工程中的位置 实验准入在混沌工程生命周期中的位置(注入前校验) 用户提交实验 kubectl apply / API API Server 接收 Admission Webhook 触发 实验准入 (注入前校验) 语法/语义/权限/配额/合规 ❌ 拒绝实验 返回错误信息 实验存储 etcd 控制器调度 选择目标 Pod 故障注入 Chaos Daemon 执行 💡 关键说明 • 实验准入发生在 API Server 接收实验后、存储到 etcd 之前。 • 准入控制器可以 修改(Mutating)或 验证(Validating)实验配置。 • 只有通过准入校验的实验才会被持久化并调度执行。

3.4 实验准入 vs. 运行时监控:职责边界

实验准入与实验运行时的监控/熔断机制有明确的职责分工,不可混淆:

对比维度 实验准入(Admission) 运行时监控(Runtime Monitoring)
触发时机 实验创建/更新时(注入前) 实验执行过程中(注入后)
校验对象 实验配置(YAML 定义) 实验实际行为(指标、事件、日志)
主要动作 允许/拒绝/修改实验 暂停/停止/回滚实验
依赖数据 静态策略、RBAC、配额 实时指标、告警、SLO 状态
典型工具 ValidatingWebhookConfiguration, OPA/Gatekeeper Prometheus + Alertmanager, 自定义 Controller
最佳实践: 实验准入负责“防患于未然”,运行时监控负责“亡羊补牢”。两者结合才能构建完整的混沌实验安全体系。建议优先完善准入控制策略,减少运行时熔断的依赖。

3.5 实验准入的两种模式:Mutating vs. Validating

在 Kubernetes 准入控制架构中,实验准入分为两种模式,通常组合使用:

  • Mutating Admission(变更准入): 在实验存储前,允许修改实验配置。常用于注入默认值、添加标签/注解、修正不合规字段。例如:自动为所有实验添加 chaos-mesh.org/owner 标签。
  • Validating Admission(验证准入): 在实验存储前,校验实验配置是否满足策略。如果校验失败,直接拒绝实验创建/更新。例如:禁止在 production 命名空间使用 PodKill 实验。

在 Chaos Mesh 中,实验准入通常通过 Admission Webhook 实现,用户可以通过配置 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 来注册自定义的准入逻辑。