3. Kyverno 基础:策略引擎原理、策略类型与匹配规则

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,以 Kubernetes 自定义资源(CRD)的形式运行,无需编写 Webhook 或使用 Admission Controller 模板。它通过监听资源的创建、更新、删除操作,在 Admission Review 阶段对资源进行校验、修改或生成,从而实现安全合规、配置治理与自动化运维。

3.1 策略引擎原理

Kyverno 的核心工作流程基于 Kubernetes 的动态准入控制(Dynamic Admission Control)机制。当用户通过 kubectl 或 API 提交资源请求时,请求会经过 Kyverno 注册的 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,触发策略引擎执行。

核心流程: 资源请求 → API Server → MutatingWebhook(变更) → ValidatingWebhook(校验) → 持久化到 etcd。

Kyverno 策略引擎内部包含三个关键组件:

  • 策略控制器(Policy Controller):负责监听策略资源(ClusterPolicy / Policy)的变化,将策略编译为可执行的规则集。
  • Webhook 处理器(Webhook Handler):接收 AdmissionReview 请求,提取资源对象,匹配策略规则。
  • 规则引擎(Rule Engine):根据策略类型(Validate / Mutate / Generate)执行对应的逻辑,返回 AdmissionResponse。
Kyverno 策略引擎架构图 Kyverno 策略引擎架构图 kubectl / API 请求 API Server Webhook 处理器 规则引擎(Validate / Mutate / Generate) 策略控制器 AdmissionResponse 返回 API Server

3.2 策略类型:Validate / Mutate / Generate

Kyverno 定义了三种核心策略类型,分别对应不同的准入控制阶段和操作意图。下表对比了三种策略类型的核心差异:

策略类型 触发阶段 核心行为 典型场景 失败行为
Validate ValidatingWebhook 检查资源是否符合规则,拒绝不符合的请求 强制镜像必须来自私有仓库;禁止特权容器 拒绝请求(Deny)
Mutate MutatingWebhook 在资源持久化前修改其配置 自动注入 Sidecar;添加默认标签/注解 修改失败则请求继续(不拒绝)
Generate ValidatingWebhook(创建时触发) 根据源资源创建新的 Kubernetes 资源 为每个 Namespace 自动创建 NetworkPolicy;生成 Secret 生成失败记录事件,不阻塞源资源

3.3 Validate 策略详解

Validate 策略是安全护栏的核心。它通过 rules[].validate 字段定义校验逻辑,支持多种校验模式:

  • pattern(模式匹配):声明期望的资源字段值,Kyverno 检查实际值是否匹配。
  • anyPattern(任意匹配):提供多个模式,满足任意一个即通过。
  • deny(拒绝规则):基于表达式或条件直接拒绝请求。
  • podSecurity(Pod 安全标准):内置对 Pod Security Standards 的支持。
最佳实践: 在流水线集成回滚护栏时,Validate 策略用于在部署前拦截不符合安全基线的镜像或配置,避免有缺陷的版本进入生产环境。

3.4 Mutate 策略详解

Mutate 策略在资源被 API Server 持久化之前修改其内容。它通过 rules[].mutate 字段定义修改逻辑,支持:

  • patchStrategicMerge:使用 Kubernetes 战略合并补丁修改资源。
  • patchesJson6902:使用 JSON Patch 操作(add / remove / replace)。
  • foreach:遍历列表字段(如 containers)进行批量修改。

Mutate 策略在回滚护栏中的典型用途是自动注入回滚相关的标签或注解,例如记录部署版本号、添加回滚触发标记。

3.5 Generate 策略详解

Generate 策略在源资源创建时自动生成新的 Kubernetes 资源。它通过 rules[].generate 字段定义生成规则,支持:

  • clone:从指定的源资源克隆生成。
  • data:直接定义生成资源的 YAML 内容。
  • synchronize:是否保持生成资源与源资源同步(删除源资源时是否删除生成资源)。
注意: Generate 策略仅在资源创建时触发,不会对已有资源生效。在故障演练中,Generate 策略可用于自动创建回滚所需的备份资源(如 ConfigMap 快照)。

3.6 策略匹配规则

策略匹配规则决定了策略作用于哪些资源。Kyverno 使用 rules[].match 和 rules[].exclude 字段定义匹配条件,支持丰富的选择器:

匹配字段 描述 示例
resources.kind 匹配资源类型(支持通配符 *) Pod, Deployment, Namespace
resources.name 匹配资源名称(支持通配符 *) my-app-*
resources.namespaces 匹配资源所在的命名空间列表 ["production", "staging"]
resources.selector 基于标签选择器匹配资源 matchLabels: { app: frontend }
resources.annotations 基于注解匹配资源 rollback-enabled: "true"
subjects 匹配请求的用户或 ServiceAccount kind: User, name: ci-bot
context 基于集群上下文(如集群名称)匹配 clusterName: prod-cluster

匹配规则支持 AND(同一规则内多个条件同时满足)和 OR(通过多个规则实现)逻辑。排除规则(exclude)的优先级高于匹配规则。

Kyverno 策略匹配规则流程图 Kyverno 策略匹配规则流程图 收到 AdmissionReview 匹配 match 规则? 匹配 exclude 规则? 执行策略规则 跳过策略 跳过策略

3.7 策略匹配规则示例

以下是一个完整的 Kyverno ClusterPolicy 示例,展示了 Validate 策略与匹配规则的组合使用:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-prod-image-registry
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-image-registry
    match:
      resources:
        kinds:
        - Pod
        namespaces:
        - production
        selector:
          matchLabels:
            app: frontend
    exclude:
      resources:
        namespaces:
        - kube-system
    validate:
      message: "镜像必须来自私有仓库 registry.example.com"
      pattern:
        spec:
          containers:
          - image: "registry.example.com/*"
关键点:
  • validationFailureAction: Enforce 表示违反策略时拒绝请求;Audit 模式仅记录告警。
  • match 定义了策略作用于 production 命名空间下、标签为 app: frontend 的 Pod。
  • exclude 排除了 kube-system 命名空间,避免影响系统组件。
  • validate.pattern 使用通配符 * 匹配镜像路径前缀。

3.8 策略引擎在回滚护栏中的角色

在流水线集成回滚护栏的故障演练中,Kyverno 策略引擎承担以下职责:

  • 部署前校验:Validate 策略拦截不符合回滚安全基线的镜像或配置。
  • 自动注入回滚标记:Mutate 策略为部署资源自动添加回滚版本标签和注解。
  • 生成备份资源:Generate 策略在部署时自动创建 ConfigMap 或 Secret 快照,用于快速回滚。
  • 故障注入与验证:通过临时调整策略规则,模拟安全护栏失效场景,验证回滚机制是否正常。