2. Kyverno 架构与核心概念:Policy、Rule、Match/Exclude、Mutate/Validate/Generate 引擎

Kyverno 是一个为 Kubernetes 设计的策略引擎,以 Kubernetes 原生的方式运行。理解其架构与核心概念是编写高效、安全策略的基础。本章将深入剖析 Kyverno 的策略模型、匹配机制以及三大处理引擎。

2.1 Kyverno 整体架构

Kyverno 以 Dynamic Admission Controller 的形式部署在 Kubernetes 集群中。它监听 API Server 的请求,在资源被持久化之前(Mutating 阶段)或之后(Validating 阶段)执行策略检查。其核心组件包括 Webhook 服务器、策略控制器和报告控制器。

Kyverno 架构与准入控制流程 Kyverno 架构与准入控制流程 kubectl / 客户端 Kubernetes API Server Kyverno Webhook Mutating / Validating 策略引擎 Match / Exclude 准入响应 (Admit/Deny/Patch) etcd (持久化) 关键流程说明: 1. 客户端发起资源创建/更新请求到 API Server。 2. API Server 将请求转发给 Kyverno Webhook(Mutating 先于 Validating)。 3. 策略引擎执行 Match/Exclude 过滤,然后调用 Mutate/Validate/Generate 引擎。 4. Webhook 返回准入响应,API Server 根据响应决定是否将资源写入 etcd。
关键点: Kyverno 的 Webhook 配置由 Kyverno 自身管理,它会动态生成 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,无需手动干预。

2.2 核心概念:Policy 与 Rule

Kyverno 的策略模型是 声明式 的,所有策略都定义为 Kubernetes 自定义资源(CRD)。一个 Policy 或 ClusterPolicy 资源包含一个或多个 Rule。

概念 作用域 描述
Policy 命名空间 仅对指定命名空间内的资源生效。适用于租户隔离场景。
ClusterPolicy 集群全局 对整个集群所有命名空间(或通过 exclude 排除)的资源生效。适用于集群管理员定义全局合规基线。
Rule 策略内部 策略的最小执行单元。每个 Rule 包含 Match/Exclude 声明和至少一个引擎(Mutate/Validate/Generate)。
最佳实践: 将全局安全基线(如禁止特权容器)定义为 ClusterPolicy,将租户特定的标签要求定义为 Policy。

2.3 Match 与 Exclude:资源选择器

每个 Rule 必须定义 match 条件,用于指定该规则适用于哪些资源。可选的 exclude 条件用于从匹配集中排除特定资源。匹配逻辑基于 Kubernetes 资源的通用属性。

2.3.1 匹配条件详解

匹配字段 类型 示例值 说明
resources.kind 字符串/列表 ["Pod", "Deployment"] 匹配资源类型,支持通配符 *。
resources.name 字符串 "my-pod-*" 匹配资源名称,支持 glob 模式。
resources.namespaces 字符串/列表 ["production", "staging"] 匹配命名空间,仅对 Policy 有效;ClusterPolicy 可用 namespaceSelector。
resources.selector LabelSelector matchLabels: { app: nginx } 基于标签选择器匹配资源。
resources.annotations Map owner: team-alpha 基于注解匹配资源。
subjects 列表 [{kind: User, name: admin}] 匹配发起请求的用户、组或 ServiceAccount。

2.3.2 Match/Exclude 工作流程

  1. 接收请求: Kyverno Webhook 收到准入请求。
  2. 资源解析: 提取请求中的资源类型、名称、命名空间、标签、注解以及用户信息。
  3. Exclude 优先检查: 如果资源匹配任何 exclude 条件,则跳过该 Rule,不再执行后续引擎。
  4. Match 检查: 如果资源匹配 match 条件,则进入引擎处理阶段。
  5. 默认行为: 如果只定义了 match 而未定义 exclude,则所有匹配的资源都会受规则约束。
注意: exclude 的优先级高于 match。即使资源同时匹配了 match 和 exclude,也会被排除。这在保护关键系统命名空间(如 kube-system)时非常有用。

2.4 三大引擎:Mutate、Validate、Generate

这是 Kyverno 策略的核心处理能力。每个 Rule 必须包含至少一个引擎块,用于定义对匹配资源执行的具体操作。

Kyverno 三大引擎决策流程 Kyverno 三大引擎决策流程 准入请求到达 Match? 否 跳过规则 是 Mutate 引擎 Validate 引擎 Generate 引擎 Mutate 和 Validate 在准入阶段执行;Generate 在资源创建后异步执行。

2.4.1 Mutate 引擎(变更)

在资源被创建或更新时,自动修改资源的字段。常用于注入 Sidecar、添加标签/注解、设置默认安全上下文等。Mutate 引擎在 MutatingAdmissionWebhook 阶段执行,返回 JSON Patch 给 API Server。

# 示例:自动为 Pod 添加标签 "managed-by: kyverno"
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-label
spec:
  rules:
  - name: add-env-label
    match:
      resources:
        kinds:
        - Pod
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            managed-by: kyverno

2.4.2 Validate 引擎(验证)

在资源被持久化之前,检查其字段是否符合预期。如果验证失败,可以配置为 enforce(拒绝请求)或 audit(仅记录告警)。这是实现合规性检查的核心引擎。

# 示例:验证容器镜像必须来自私有仓库
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: validate-registry
spec:
  validationFailureAction: Enforce  # 拒绝不符合规则的请求
  rules:
  - name: check-registry
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "镜像必须来自 myregistry.example.com"
      pattern:
        spec:
          containers:
          - image: "myregistry.example.com/*"

2.4.3 Generate 引擎(生成)

当匹配的资源被创建时,自动生成新的 Kubernetes 资源。常用于为每个 Namespace 自动创建 NetworkPolicy、ResourceQuota 或 Secret。Generate 引擎是 异步 的,在准入请求完成后由控制器执行。

# 示例:为每个新 Namespace 自动生成默认的 NetworkPolicy
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: generate-default-networkpolicy
spec:
  rules:
  - name: generate-ns-policy
    match:
      resources:
        kinds:
        - Namespace
    generate:
      kind: NetworkPolicy
      name: default-deny-all
      namespace: "{{request.object.metadata.name}}"
      synchronize: true  # 保持生成的资源与策略同步
      data:
        spec:
          podSelector: {}
          policyTypes:
          - Ingress
          - Egress
提示: Generate 引擎支持 synchronize: true 选项,当策略更新时,已生成的资源也会自动更新。这对于维护集群基线状态非常有用。

2.5 引擎执行顺序与组合

在一个 Rule 中,可以同时定义多个引擎。Kyverno 按照 Mutate → Validate → Generate 的顺序执行。如果 Mutate 引擎修改了资源,Validate 引擎将基于修改后的资源进行检查。这种组合能力使得策略编写非常灵活。

组合场景 引擎顺序 典型用途
注入 + 验证 Mutate → Validate 先注入 Sidecar,再验证最终 Pod 的镜像来源。
生成 + 验证 Validate → Generate 验证 Namespace 标签合规后,再生成对应的 RBAC 资源。
纯验证 Validate 禁止使用 latest 镜像标签。
纯生成 Generate 为每个新 Service 自动创建对应的 DNS 记录。
注意: 如果 Mutate 引擎修改了资源,但 Validate 引擎验证失败,API Server 会拒绝整个请求。Mutate 的修改不会生效。因此,在组合使用时,确保 Validate 规则与 Mutate 规则不冲突。

2.6 本章小结

Kyverno 的架构设计遵循 Kubernetes 原生的准入控制模式。通过 Policy/ClusterPolicy 定义规则,利用 Match/Exclude 精确控制策略作用范围,再通过 Mutate、Validate、Generate 三大引擎实现资源的自动化变更、合规性验证和资源生成。掌握这些核心概念,是后续编写复杂策略和保障集群安全的基础。