2. Kyverno 基础:架构、安装方式与核心概念
在深入拦截集群升级版本漂移之前,必须先建立对 Kyverno 策略引擎的扎实理解。本章将拆解 Kyverno 的组件架构、主流安装方式,并精讲 Policy、Rule、Match/Exclude 三个核心概念。这些知识是后续编写生产级准入策略的基石。
2.1 Kyverno 架构:组件与工作流
Kyverno 以 Kubernetes 原生方式运行,不引入新的自定义 API 服务器或 Webhook 框架。其架构由三个核心组件构成,协同完成策略的加载、匹配与执行。
架构要点: Kyverno 是一个运行在集群内的准入控制器,通过 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 拦截资源请求,无需重新编译 kube-apiserver。
2.2 安装方式对比
Kyverno 支持多种安装路径,生产环境推荐使用 Helm Chart 以获得版本管理与升级便利性。以下对比三种主流方式:
| 安装方式 | 命令 / 步骤 | 适用场景 | 版本管理 |
|---|---|---|---|
| Helm Chart | |
生产环境、需要升级回滚 | 优秀,支持 values.yaml 定制 |
| YAML 直装 | |
快速验证、离线环境 | 手动管理,升级需替换 YAML |
| Operator | |
需要自动故障恢复 | 由 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 逻辑运算符。
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 是筛选器。