Kyverno策略管理实战:云原生安全运行基线自动化核验 - 第2节

2.1 Kyverno 的起源与发展

Kyverno 由 Nirmata 公司于 2019 年发起,并于 2020 年正式开源。其名称源自希腊语“κυβερνάω”(kybernáo),意为“掌舵”或“治理”,直接反映了项目的核心使命——为 Kubernetes 集群提供声明式的策略治理能力。2021 年,Kyverno 成为 CNCF(云原生计算基金会)的沙箱项目,并在 2022 年晋升为孵化项目,社区贡献者与生产部署案例快速增长。

与早期策略引擎不同,Kyverno 的设计哲学是“Kubernetes 原生”:

  • 无专用策略语言:策略使用 Kubernetes 资源(CustomResourceDefinition, CRD)定义,无需学习 OPA 的 Rego 或 Gatekeeper 的模板语言。
  • 动态准入控制:通过 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 拦截资源请求,实现变更与验证。
  • 资源状态审计:支持对集群中已有资源进行后台扫描,生成策略违规报告,无需重新提交请求。
关键里程碑:Kyverno 1.6 版本引入了 PolicyException 和 PolicyReport 标准化,1.8 版本支持了背景扫描(Background Scan)与生成规则(Generate Rules),使其从单纯的准入控制演进为完整的策略生命周期管理工具。

2.2 与 OPA/Gatekeeper 的对比

OPA(Open Policy Agent)与 Gatekeeper 是 Kubernetes 生态中另一套主流的策略引擎组合。OPA 提供通用策略引擎,Gatekeeper 则是 OPA 在 Kubernetes 上的集成层。两者与 Kyverno 在架构、语言、运维复杂度上存在显著差异。下表从多个维度进行对比:

对比维度 Kyverno OPA + Gatekeeper
策略定义语言 YAML(Kubernetes CRD) Rego(声明式查询语言)
学习曲线 低(熟悉 K8s YAML 即可上手) 中高(需学习 Rego 语法与逻辑)
策略类型 验证(Validate)、变更(Mutate)、生成(Generate) 验证为主,变更需额外开发
资源审计 内置背景扫描与报告 需额外部署审计组件
策略复用 通过 ClusterPolicy/Policy 与规则组合 通过 ConstraintTemplate 与 Constraint
社区生态 CNCF 孵化,策略市场(Policy Library)丰富 CNCF 毕业,企业级生态成熟
适用场景 Kubernetes 原生策略、安全基线、合规自动化 通用策略引擎、跨平台策略、复杂逻辑
选型建议:如果你的团队以 Kubernetes 运维和开发为主,希望快速落地安全基线与合规策略,Kyverno 的 YAML 原生体验能显著降低门槛。如果已有 OPA 投资或需要跨 Kubernetes、API 网关、CI/CD 的统一策略引擎,OPA + Gatekeeper 仍是成熟选择。

2.3 策略引擎架构

Kyverno 的策略引擎以 Kubernetes 控制器模式运行,核心组件包括 Webhook Server、Controller Manager 和 Report Manager。下图展示了请求处理与审计扫描的完整流程:

Kyverno 策略引擎架构图 Kyverno 策略引擎架构 kubectl / API K8s API Server Webhook Server Controller Manager Report Manager etcd(策略存储) 流程说明 ① 用户请求 → API Server → Webhook Server(准入控制)→ ② Controller Manager 加载策略 → ③ Report Manager 审计扫描 → ④ 结果写入 etcd

架构中的三个核心组件职责如下:

  • Webhook Server:接收 API Server 的准入请求,根据匹配的策略规则执行变更(Mutate)或验证(Validate)操作,返回准入响应。
  • Controller Manager:负责策略的同步、缓存与状态管理,驱动生成规则(Generate)和后台扫描任务。
  • Report Manager:收集策略执行结果,生成标准化的 PolicyReport 资源,支持集群范围的合规可视化。

2.4 策略(Policy)与规则(Rule)的概念

Kyverno 的策略模型围绕 Policy 和 Rule 两个核心抽象构建。理解两者的关系是编写策略的基础。

2.4.1 策略(Policy)

策略是最高级别的资源对象,定义了一组规则的集合及其作用范围。Kyverno 提供两种策略类型:

  • Policy:命名空间级别的策略,仅对指定命名空间内的资源生效。
  • ClusterPolicy:集群级别的策略,对所有命名空间或通过资源选择器匹配的资源生效。

一个策略对象包含以下关键字段:

字段 说明 示例值
spec.rules 规则列表,定义具体的匹配与执行逻辑 —
spec.validationFailureAction 验证失败时的行为:enforce(拒绝)或 audit(仅报告) audit
spec.background 是否启用后台扫描(默认 true) true
spec.schemaValidation 是否对策略本身进行 schema 校验 true

2.4.2 规则(Rule)

规则是策略的执行单元,每个规则包含三个核心部分:

  • 匹配条件(Match):定义规则适用的资源类型、标签、命名空间等。支持 any 和 all 逻辑组合。
  • 排除条件(Exclude):定义规则不适用的情况,优先级高于匹配条件。
  • 执行动作(Mutate / Validate / Generate):定义对匹配资源的具体操作。
常见误区:一个策略可以包含多条规则,但规则之间是“或”关系——只要有一条规则匹配,策略就会执行。如果需要“与”逻辑(所有规则必须同时满足),应使用单独的 ClusterPolicy 并通过标签或命名空间隔离。

以下是一个完整的 ClusterPolicy 示例,展示策略与规则的组合:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: enforce
  background: true
  rules:
    - name: check-app-label
      match:
        any:
          - resources:
              kinds:
                - Pod
                - Deployment
      validate:
        message: "标签 'app' 是必需的"
        pattern:
          metadata:
            labels:
              app: "?*"
    - name: check-team-label
      match:
        any:
          - resources:
              kinds:
                - Namespace
      validate:
        message: "命名空间必须包含 'team' 标签"
        pattern:
          metadata:
            labels:
              team: "?*"

上述策略包含两条规则:第一条要求所有 Pod 和 Deployment 必须包含 app 标签;第二条要求所有命名空间必须包含 team 标签。两条规则独立匹配,互不影响。

最佳实践:建议将不同维度的策略拆分为独立的 ClusterPolicy,例如“安全基线策略”、“资源配额策略”、“合规标签策略”。这样便于按需启用、禁用和审计,避免单策略规则过多导致维护困难。