2. 准入策略(Admission Policy)概念
2.1 什么是准入策略
准入策略(Admission Policy)是一组在资源进入目标环境之前强制执行的规则集合。在 Kubernetes 生态中,准入策略决定了“谁、在什么条件下、可以创建或修改哪些资源”。它位于 API 请求的认证与授权之后、资源持久化存储之前,是安全管控的最后一道防线。
核心定义: 准入策略 = 条件表达式 + 决策动作(允许/拒绝/变更)。它不关心请求来源是否合法,只关心请求内容是否符合预设规范。
准入策略的典型检查项包括:
- 安全基线: 容器是否以 root 运行、是否允许特权提升、是否挂载了敏感主机路径。
- 合规约束: 镜像是否来自可信仓库、资源标签是否符合命名规范、是否包含必需的注解。
- 资源管控: 是否设置了 CPU/内存 limits、是否使用了禁止的 API 版本、是否绑定了高危 RBAC 角色。
- 架构规范: 是否强制使用 PodDisruptionBudget、是否禁止使用 hostNetwork、是否要求 readinessProbe 必须配置。
2.2 在 GitOps 工作流中的作用
在 GitOps 工作流中,准入策略扮演着“安关”与“合规守门员”的双重角色。Argo CD 从 Git 仓库同步声明式配置到目标集群,但 Git 仓库中的 YAML 文件并不天然可信——开发者可能误提交了不安全配置,或者攻击者可能篡改了仓库内容。
准入策略在 GitOps 工作流中的关键作用体现在以下三个环节:
| 环节 | 作用描述 | 典型场景 |
|---|---|---|
| 提交前校验 | 在 PR/MR 阶段通过 CI 流水线执行策略检查,阻止不合规配置进入 Git 仓库 | 使用 Conftest 或 OPA Gatekeeper 在 CI 中验证 YAML 文件 |
| 同步前拦截 | Argo CD 在 Apply 资源之前调用准入 Webhook,拒绝违反集群策略的变更 | Kubernetes ValidatingAdmissionPolicy 拒绝 privileged 容器 |
| 漂移检测与修复 | 当集群外操作导致资源偏离策略时,准入策略可触发告警或自动回滚 | Kyverno 生成策略违规事件,Argo CD 自动同步修复 |
实践建议: 在 GitOps 工作流中,建议将准入策略的检查点前移至 CI 阶段(提交前校验),而不是完全依赖集群侧的准入 Webhook。这样可以减少集群控制面的负载,同时为开发者提供更快的反馈循环。
下图展示了准入策略在 GitOps 工作流中的完整介入位置:
2.3 与 Kubernetes 准入控制器的区别
准入策略与 Kubernetes 准入控制器(Admission Controller)是两个紧密相关但层次不同的概念。理解它们的区别对于设计 Argo CD 项目级架构至关重要。
| 对比维度 | 准入策略(Admission Policy) | Kubernetes 准入控制器 |
|---|---|---|
| 定义层次 | 逻辑层面的规则集合,描述“应该允许什么” | Kubernetes API 服务器中的具体实现机制 |
| 表现形式 | OPA 策略、Kyverno 规则、ValidatingAdmissionPolicy 声明 | 内置插件(如 NamespaceLifecycle)、Webhook 配置 |
| 执行位置 | 可在 CI、Git 钩子、集群外工具中执行 | 仅在 Kubernetes API 服务器内部执行 |
| 变更能力 | 通常只做允许/拒绝决策,部分支持 Mutating 策略 | MutatingAdmissionWebhook 可修改资源内容 |
| 作用范围 | 可跨集群、跨环境统一管理 | 绑定到单个集群的 API 服务器 |
| 与 GitOps 的关系 | 可在同步前、同步中、同步后全流程介入 | 仅在资源 Apply 到集群时触发 |
常见误区: 很多团队将“准入策略”等同于“Kubernetes 准入 Webhook”,认为只要配置了 ValidatingWebhookConfiguration 就完成了策略治理。实际上,准入策略是更上层的治理概念,Webhook 只是其一种实现载体。在 GitOps 架构中,策略应该在更早的阶段(如 CI 和 Argo CD 同步前)就开始执行,而不是等到资源到达 API 服务器才拦截。
下图展示了准入策略与 Kubernetes 准入控制器的层次关系:
2.4 关键区别总结
在实际的 Argo CD 项目级架构设计中,需要明确以下三点:
- 准入策略是“做什么”,准入控制器是“怎么做”。 先定义策略规则(如“禁止特权容器”),再选择实现工具(如 Kyverno ClusterPolicy)。
- 准入策略的范围更广。 它可以在 Git 仓库、CI 流水线、Argo CD 同步钩子、集群 Webhook 等多个位置执行,而 Kubernetes 准入控制器只能在集群内部生效。
- GitOps 工作流需要多层策略防护。 仅依赖 Kubernetes 准入控制器是不够的——如果攻击者直接修改了集群中的资源(绕过 Git),准入控制器无法阻止已经存在的违规资源。准入策略需要在 Git 侧和集群侧同时部署,形成闭环。
架构决策要点: 在 Argo CD 项目级架构中,建议将准入策略分为两层:
· 外层策略(Git 侧): 在 CI 和 Argo CD PreSync 钩子中执行,使用 Conftest 或 OPA 检查 YAML 文件。
· 内层策略(集群侧): 在 Kubernetes API 服务器中执行,使用 Kyverno 或 ValidatingAdmissionPolicy 拦截运行时请求。
两层策略使用同一套规则定义,确保 Git 仓库中的配置和集群中的资源都符合相同的安全基线。
· 外层策略(Git 侧): 在 CI 和 Argo CD PreSync 钩子中执行,使用 Conftest 或 OPA 检查 YAML 文件。
· 内层策略(集群侧): 在 Kubernetes API 服务器中执行,使用 Kyverno 或 ValidatingAdmissionPolicy 拦截运行时请求。
两层策略使用同一套规则定义,确保 Git 仓库中的配置和集群中的资源都符合相同的安全基线。