2. Kyverno 基础:Kyverno 是什么?核心概念

2.1 Kyverno 是什么?

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎。它允许平台团队和安全团队将策略定义为 Kubernetes 资源(CRD),无需编写 Webhook 或学习复杂的准入控制器语言。Kyverno 通过动态准入 Webhook 拦截对 Kubernetes API 的请求,并根据定义的策略进行验证、变更或生成资源。

关键特性: 原生 Kubernetes 资源、无需新语言、支持验证/变更/生成、策略即代码、GitOps 友好。

与 OPA/Gatekeeper 使用 Rego 不同,Kyverno 策略使用 YAML 编写,学习曲线更低,特别适合与 CI/CD 流水线集成,实现“回滚护栏”等自动化安全门禁。

Kyverno 在 Kubernetes 集群中的工作位置 用户 / CI 流水线 kubectl / API 请求 Kyverno 策略引擎 (准入 Webhook) ClusterPolicy / Policy 允许 / 拒绝 / 变更 说明: Kyverno 以 DaemonSet 或 Deployment 方式运行,监听 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration。 策略以 Kubernetes CRD 形式存储,支持实时热加载,无需重启组件。

2.2 核心概念总览

Kyverno 的策略模型由以下核心概念构成,它们共同定义了“策略如何匹配资源、执行何种操作”。

概念 说明 作用阶段
Policy / ClusterPolicy 策略的顶层容器,定义一组规则。Policy 作用于命名空间,ClusterPolicy 作用于集群全局。 定义时
Rule 策略内的具体规则单元,包含 Match、Mutate/Validate/Generate 等子字段。 定义时
Match 定义规则匹配哪些资源(按 kind、label、namespace、name 等)。 准入拦截时
Mutate 对匹配的资源进行修改(patch/overlay),常用于注入 sidecar、添加标签。 Mutating Webhook
Validate 对匹配的资源进行校验,返回 pass/fail,拒绝不符合策略的请求。 Validating Webhook
Generate 基于匹配的资源自动生成新的资源(如为每个 Namespace 创建 NetworkPolicy)。 后台控制器
提示: 在“回滚护栏”场景中,Validate 用于拒绝不安全的回滚(如跳过审批),Mutate 用于自动注入回滚审计标签,Generate 用于自动创建回滚快照策略。

2.3 Policy 与 ClusterPolicy

Policy 是 Kyverno 的顶层资源。两者的区别在于作用域:

  • Policy(命名空间级): 只能匹配和作用于同一命名空间内的资源。
  • ClusterPolicy(集群级): 可以匹配所有命名空间或特定命名空间的资源,常用于全局安全基线。

在回滚护栏场景中,通常使用 ClusterPolicy 来确保所有命名空间的回滚操作都受到统一策略约束。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: rollback-safety-gate
spec:
  rules:
  - name: require-rollback-approval
    match:
      resources:
        kinds:
        - Deployment
    validate:
      message: "回滚操作必须包含 'rollback-approved: true' 标签"
      pattern:
        metadata:
          labels:
            rollback-approved: "true"

2.4 Rule 与 Match:精准定位目标资源

每个 Rule 包含一个 Match 声明,用于定义该规则生效的资源范围。Match 支持多种匹配条件:

匹配字段 示例 说明
kinds [Deployment, StatefulSet] 按资源类型匹配
names [app-prod, app-staging] 按资源名称精确匹配
namespaces [production, staging] 按命名空间匹配
selector matchLabels: { app: myapp } 按标签选择器匹配
any / all any: [{ kinds: [Pod] }, { kinds: [Deployment] }] 逻辑或/与组合条件
注意: Match 条件写得太宽泛可能导致策略意外影响大量资源。建议在回滚护栏策略中,结合 namespaces 和 selector 精确锁定目标工作负载。

2.5 Mutate:自动注入与修复

Mutate 规则在资源创建或更新时自动修改资源内容。Kyverno 支持两种变更方式:

  • patchesJson6902: 使用 JSON Patch 操作(add/remove/replace)。
  • overlay: 使用 YAML 覆盖层,将定义的字段合并到目标资源中。

在回滚场景中,Mutate 可用于自动注入回滚审计标签或 sidecar 代理:

rules:
- name: inject-rollback-audit-label
  match:
    resources:
      kinds:
      - Deployment
  mutate:
    overlay:
      metadata:
        labels:
          rollback-audit-enabled: "true"
          last-rollback-time: "{{ time.now() }}"

2.6 Validate:安全门禁的核心

Validate 是 Kyverno 最常用的能力,用于在资源进入集群前进行校验。校验模式包括:

模式 说明 回滚护栏应用
pattern 定义期望的资源字段值,不匹配则拒绝 强制要求回滚审批标签
anyPattern 满足任意一个模式即通过 允许多种回滚审批方式
deny 定义拒绝条件,满足条件则拒绝 禁止回滚到低于某个版本的镜像
podSecurity 内置 Pod Security Standards 校验 确保回滚后的 Pod 仍符合安全基线
rules:
- name: deny-rollback-to-old-image
  match:
    resources:
      kinds:
      - Deployment
  validate:
    message: "禁止回滚到镜像标签为 'latest' 或 'old-*' 的版本"
    deny:
      conditions:
        any:
        - key: "{{ request.object.spec.template.spec.containers[0].image }}"
          operator: Equals
          value: "nginx:latest"
        - key: "{{ request.object.spec.template.spec.containers[0].image }}"
          operator: Pattern
          value: "old-*"

2.7 Generate:自动创建关联资源

Generate 规则在匹配资源创建时,自动生成另一个 Kubernetes 资源。生成方式有两种:

  • data: 直接定义要生成的资源内容。
  • clone: 从指定命名空间克隆一个已有资源。

在回滚护栏中,Generate 可用于自动创建回滚快照或备份 ConfigMap:

rules:
- name: generate-rollback-snapshot
  match:
    resources:
      kinds:
      - Deployment
      namespaces:
      - production
  generate:
    kind: ConfigMap
    name: "rollback-snapshot-{{ request.object.metadata.name }}"
    namespace: "{{ request.object.metadata.namespace }}"
    synchronize: true
    data:
      spec: "{{ request.object.spec }}"
最佳实践: 在回滚护栏流水线中,Validate 作为第一道门禁拒绝非法回滚,Mutate 自动注入审计标签,Generate 创建备份资源。三者组合形成完整的“回滚安全三角”。

2.8 核心概念关系图

下图展示了 Policy、Rule、Match、Mutate、Validate、Generate 之间的逻辑关系与执行顺序:

Kyverno 核心概念关系与执行流程 ClusterPolicy / Policy Rule(规则单元) Match(资源匹配) Mutate (变更/注入) Validate (校验/拒绝) Generate (生成资源) 执行顺序:Mutate 先于 Validate 执行(MutatingWebhook → ValidatingWebhook),Generate 由后台控制器异步执行。

2.9 本章小结

  • Kyverno 是 Kubernetes 原生的策略引擎,使用 YAML 定义策略,无需学习新语言。
  • Policy / ClusterPolicy 是策略顶层容器,决定作用范围。
  • Rule + Match 精准定位目标资源,支持多种匹配条件。
  • Mutate、Validate、Generate 分别对应变更、校验、生成三种操作,是回滚护栏的核心构建块。
  • 在流水线集成中,Validate 作为门禁拒绝非法回滚,Mutate 自动注入审计信息,Generate 创建备份资源,三者协同实现自动化安全管控。