4. Kyverno 策略引擎基础:Policy 与 Rule 结构、match/exclude 规则、背景上下文(context)与变量

Kyverno 是专为 Kubernetes 设计的策略引擎,其核心抽象是 Policy(策略)与 Rule(规则)。理解 Policy/Rule 的声明式结构、匹配/排除逻辑、以及上下文变量机制,是编写生产级安全门禁策略的前提。本章将拆解这些基础概念,并展示它们如何协同工作。

4.1 Policy 与 Rule 的层级结构

一个 Kyverno Policy 资源(ClusterPolicy 或 Policy)包含一个或多个 Rule。每个 Rule 定义了一个独立的“条件-动作”单元:当 match 条件满足且 exclude 条件不满足时,执行 validate、mutate、generate 或 verifyImages 动作。

层级 字段 说明
Policy spec.rules[] 规则列表,每个规则独立评估
Rule match 选择目标资源(必须匹配)
Rule exclude 排除特定资源(可选)
Rule context 声明外部数据源(API 调用、ConfigMap、变量)
Rule validate/mutate/generate/verifyImages 动作定义
关键区别: ClusterPolicy 作用于集群范围,Policy 作用于特定命名空间。在镜像安全水位场景中,通常使用 ClusterPolicy 以覆盖所有工作负载。

4.2 match 与 exclude 规则:精准选择目标

match 和 exclude 使用相同的资源描述结构,支持按 资源类型、标签、注解、命名空间选择器 等维度进行筛选。规则之间是 AND 逻辑:所有条件必须同时满足。

4.2.1 match 示例:选择高风险命名空间中的 Pod

match:
  any:
  - resources:
      kinds:
      - Pod
      namespaces:
      - "production"
      - "staging"
      selector:
        matchLabels:
          security-tier: "critical"

4.2.2 exclude 示例:排除系统组件

exclude:
  any:
  - resources:
      namespaces:
      - kube-system
      - kyverno
  - resources:
      kinds:
      - DaemonSet
      name: "node-exporter*"
最佳实践: 在镜像水位策略中,始终排除 kube-system、kyverno 等系统命名空间,避免误拦截基础设施组件。

4.3 背景上下文(context)与变量

context 是 Kyverno 策略的“数据注入层”。它允许规则在执行时动态获取集群内外的信息,并将结果绑定为变量,供 validate/mutate 表达式引用。常见的 context 类型包括:

  • ConfigMap:从指定命名空间的 ConfigMap 中读取键值对。
  • APICall:调用 Kubernetes API 或其他 HTTP 服务,获取 JSON 响应。
  • ImageRegistry:查询容器镜像仓库的元数据(如摘要、标签列表)。
  • Variable:引用其他规则或预定义变量。

4.3.1 context 声明示例:从 ConfigMap 读取安全水位阈值

context:
- name: securityThreshold
  configMap:
    name: image-security-config
    namespace: kyverno-policies

4.3.2 变量引用语法

在 validate/mutate 表达式中,使用 {{ context.变量名.字段路径 }} 引用 context 数据。Kyverno 还提供内置变量:

变量 说明
{{ request.object }} 被评估资源的完整对象
{{ request.operation }} 操作类型:CREATE、UPDATE、DELETE
{{ images.containers.*.name }} 工作负载中所有容器名称列表
{{ images.containers.*.reference }} 容器镜像完整引用(含标签/摘要)
注意: 变量引用区分大小写,且 context 数据必须在规则执行前完成加载。如果 context 调用失败(如 ConfigMap 不存在),规则将默认拒绝请求(fail-on-error 行为)。

4.4 策略执行流程与上下文数据流

下图展示了 Kyverno 在处理一个 AdmissionReview 请求时,Policy、Rule、match/exclude、context 与变量之间的完整数据流:

Kyverno 策略执行与上下文数据流 Kyverno 策略执行与上下文数据流 AdmissionReview 请求 Policy 匹配 Rule 评估 match 条件 exclude 条件 context 加载 validate/mutate 动作 说明: 1. 请求先匹配 Policy 类型 2. 进入 Rule 后检查 match/exclude 3. 通过后加载 context 数据 4. 最终执行动作(引用变量)

4.5 综合示例:基于安全水位的镜像验证策略

以下是一个完整的 ClusterPolicy,它结合了 match/exclude、context 和变量,实现“仅允许安全水位达标的镜像通过变更”:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-image-security-watermark
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-image-watermark
    match:
      any:
      - resources:
          kinds:
          - Pod
          namespaces:
          - "production"
          - "staging"
    exclude:
      any:
      - resources:
          namespaces:
          - kube-system
          - kyverno
    context:
    - name: watermarkConfig
      configMap:
        name: image-watermark
        namespace: kyverno-policies
    - name: imageScanResult
      apiCall:
        urlPath: "/apis/scanning.example.com/v1/imagescans"
        jmesPath: "items[?image == '{{ request.object.spec.containers[0].image }}'].status.watermark | [0]"
    validate:
      message: "镜像 {{ request.object.spec.containers[0].image }} 的安全水位 {{ imageScanResult }} 低于阈值 {{ watermarkConfig.data.minWatermark }}"
      deny:
        conditions:
          any:
          - key: "{{ imageScanResult }}"
            operator: LessThan
            value: "{{ watermarkConfig.data.minWatermark }}"
策略解读: 该策略通过 context 从 ConfigMap 读取最低水位阈值,同时调用外部 API 获取镜像的扫描结果。如果扫描水位低于阈值,则拒绝 Pod 创建/更新请求。exclude 规则确保系统组件不受影响。

4.6 本章小结

  • Policy/Rule 结构:ClusterPolicy 包含多个 Rule,每个 Rule 独立执行 match→exclude→context→action 流程。
  • match/exclude:支持按资源类型、标签、命名空间等维度精准筛选,规则间为 AND 逻辑。
  • context 与变量:context 是动态数据源,变量通过 {{ }} 语法引用,是策略灵活性的核心。
  • 安全水位场景:通过 context 加载外部扫描结果和配置阈值,实现基于数据驱动的变更门禁。