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 为例,展示了从用户提交实验到故障注入完成的核心流程:
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 来注册自定义的准入逻辑。