2. Kyverno 基础:架构、安装方式与核心概念

在深入拦截集群升级版本漂移之前,必须先建立对 Kyverno 策略引擎的扎实理解。本章将拆解 Kyverno 的组件架构、主流安装方式,并精讲 Policy、Rule、Match/Exclude 三个核心概念。这些知识是后续编写生产级准入策略的基石。

2.1 Kyverno 架构:组件与工作流

Kyverno 以 Kubernetes 原生方式运行,不引入新的自定义 API 服务器或 Webhook 框架。其架构由三个核心组件构成,协同完成策略的加载、匹配与执行。

架构要点: Kyverno 是一个运行在集群内的准入控制器,通过 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 拦截资源请求,无需重新编译 kube-apiserver。
Kyverno 核心架构与准入工作流 kubectl / CI kube-apiserver Kyverno Pod (准入控制器) AdmissionReview ClusterPolicy / Policy Rule 匹配引擎 策略缓存 (Lru) AdmissionResponse 工作流说明 1. 用户提交资源 2. API Server 转发 3. Kyverno 匹配策略 4. 返回允许/拒绝

2.2 安装方式对比

Kyverno 支持多种安装路径,生产环境推荐使用 Helm Chart 以获得版本管理与升级便利性。以下对比三种主流方式:

安装方式 命令 / 步骤 适用场景 版本管理
Helm Chart
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
生产环境、需要升级回滚 优秀,支持 values.yaml 定制
YAML 直装
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
快速验证、离线环境 手动管理,升级需替换 YAML
Operator
kubectl apply -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/operator.yaml
需要自动故障恢复 由 Operator 管理
推荐: 本课程所有实验均基于 Helm 安装的 Kyverno v1.12+。安装后使用 kubectl get pod -n kyverno 确认所有 Pod 处于 Running 状态。

2.3 核心概念:Policy、Rule、Match/Exclude

Kyverno 的策略模型围绕三个层次构建。理解它们的关系是编写策略的第一步。

2.3.1 Policy(策略)

Policy 是最高层级的资源对象,分为两种作用域:

  • ClusterPolicy:集群级别,影响所有命名空间。
  • Policy:命名空间级别,仅作用于所在命名空间。

一个 Policy 可以包含一个或多个 Rule。以下是一个完整的 ClusterPolicy 示例:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Enforce
  rules:
    - name: require-image-tag
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "Using 'latest' tag is not allowed."
        pattern:
          spec:
            containers:
              - image: "!*:latest"

2.3.2 Rule(规则)

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

Rule 组件 作用 示例
match 定义规则适用的资源条件 匹配所有 Deployment
exclude 从匹配中排除特定资源 排除 kube-system 命名空间
validate / mutate / generate 规则的动作类型 验证镜像标签、添加注解

2.3.3 Match / Exclude(匹配与排除)

Match 和 Exclude 使用相同的语法结构,支持按资源类型、标签选择器、命名空间、注解等维度进行筛选。它们支持 any 和 all 逻辑运算符。

Match / Exclude 匹配逻辑 资源请求 Match? 执行 Rule 是 跳过 / 放行 否 Exclude 在 Match 之后检查:匹配的资源若在排除列表中,则仍跳过

2.3.4 匹配语法详解

Match/Exclude 支持以下筛选维度,可组合使用:

维度 字段 示例值
资源类型 resources.kinds ["Pod", "Deployment"]
命名空间 resources.namespaces ["production"]
标签选择器 resources.selector matchLabels: { app: nginx }
注解 resources.annotations {"kyverno.io/ignore": "true"}
名称 resources.name "critical-*"
常见误区: Match 和 Exclude 中的 any 与 all 是逻辑运算符。any 表示满足任一条件即匹配,all 表示必须满足所有条件。在 Kyverno v1.8+ 中,推荐使用 any 和 all 替代旧版的 resources 直接嵌套。

2.4 策略动作类型

每个 Rule 必须指定一种动作类型,决定了策略对资源的影响:

  • validate:验证资源是否符合规范,可设置为 Enforce(拒绝)或 Audit(仅报告)。
  • mutate:在资源创建或更新时自动修改其字段(如添加标签、Sidecar)。
  • generate:基于资源创建触发自动生成其他资源(如为每个 Namespace 创建 NetworkPolicy)。
  • verifyImages:验证容器镜像的签名与来源(需配合 Cosign)。
课程关联: 在拦截集群升级版本漂移的场景中,我们将主要使用 validate 动作,配合 Enforce 模式来拒绝不符合版本要求的资源请求。

2.5 本章小结

本章建立了 Kyverno 的知识骨架:

  • 架构上,Kyverno 作为准入控制器拦截 API Server 请求,通过策略缓存提升性能。
  • 安装上,Helm 是生产首选,YAML 直装适合快速验证。
  • 核心概念上,Policy 是容器,Rule 是执行单元,Match/Exclude 是筛选器。