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 工作流中的完整介入位置:

准入策略在 GitOps 工作流中的介入位置 Git 仓库 声明式配置 CI 流水线 策略检查 Argo CD 同步引擎 目标集群 Pod/Service push/PR merge apply ① 提交前策略 ② 同步前拦截 ③ 漂移检测 说明: ① 提交前策略:在 CI 阶段使用 Conftest/OPA 检查 YAML 文件,阻止不合规配置进入 Git 仓库。 ② 同步前拦截:Argo CD 在 Apply 资源时,Kubernetes 准入 Webhook 对请求进行实时校验。 ③ 漂移检测:集群外操作导致资源偏离策略时,准入策略触发告警,Argo CD 自动修复。 三个环节形成“提交→同步→运行时”的全链路策略防护。

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 准入控制器的层次关系:

准入策略 vs Kubernetes 准入控制器:层次关系 准入策略(Admission Policy) 逻辑规则集合:安全基线、合规约束、资源管控、架构规范 策略引擎(Policy Engine) OPA Gatekeeper · Kyverno · ValidatingAdmissionPolicy · Conftest Kubernetes 准入控制器 MutatingAdmissionWebhook · ValidatingAdmissionWebhook · 内置插件 实现 载体 集群 执行

2.4 关键区别总结

在实际的 Argo CD 项目级架构设计中,需要明确以下三点:

  1. 准入策略是“做什么”,准入控制器是“怎么做”。 先定义策略规则(如“禁止特权容器”),再选择实现工具(如 Kyverno ClusterPolicy)。
  2. 准入策略的范围更广。 它可以在 Git 仓库、CI 流水线、Argo CD 同步钩子、集群 Webhook 等多个位置执行,而 Kubernetes 准入控制器只能在集群内部生效。
  3. GitOps 工作流需要多层策略防护。 仅依赖 Kubernetes 准入控制器是不够的——如果攻击者直接修改了集群中的资源(绕过 Git),准入控制器无法阻止已经存在的违规资源。准入策略需要在 Git 侧和集群侧同时部署,形成闭环。
架构决策要点: 在 Argo CD 项目级架构中,建议将准入策略分为两层:
· 外层策略(Git 侧): 在 CI 和 Argo CD PreSync 钩子中执行,使用 Conftest 或 OPA 检查 YAML 文件。
· 内层策略(集群侧): 在 Kubernetes API 服务器中执行,使用 Kyverno 或 ValidatingAdmissionPolicy 拦截运行时请求。
两层策略使用同一套规则定义,确保 Git 仓库中的配置和集群中的资源都符合相同的安全基线。