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 服务器、策略控制器和报告控制器。
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 工作流程
- 接收请求: Kyverno Webhook 收到准入请求。
- 资源解析: 提取请求中的资源类型、名称、命名空间、标签、注解以及用户信息。
- Exclude 优先检查: 如果资源匹配任何
exclude条件,则跳过该 Rule,不再执行后续引擎。 - Match 检查: 如果资源匹配
match条件,则进入引擎处理阶段。 - 默认行为: 如果只定义了
match而未定义exclude,则所有匹配的资源都会受规则约束。
exclude 的优先级高于 match。即使资源同时匹配了 match 和 exclude,也会被排除。这在保护关键系统命名空间(如 kube-system)时非常有用。
2.4 三大引擎:Mutate、Validate、Generate
这是 Kyverno 策略的核心处理能力。每个 Rule 必须包含至少一个引擎块,用于定义对匹配资源执行的具体操作。
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
synchronize: true 选项,当策略更新时,已生成的资源也会自动更新。这对于维护集群基线状态非常有用。
2.5 引擎执行顺序与组合
在一个 Rule 中,可以同时定义多个引擎。Kyverno 按照 Mutate → Validate → Generate 的顺序执行。如果 Mutate 引擎修改了资源,Validate 引擎将基于修改后的资源进行检查。这种组合能力使得策略编写非常灵活。
| 组合场景 | 引擎顺序 | 典型用途 |
|---|---|---|
| 注入 + 验证 | Mutate → Validate | 先注入 Sidecar,再验证最终 Pod 的镜像来源。 |
| 生成 + 验证 | Validate → Generate | 验证 Namespace 标签合规后,再生成对应的 RBAC 资源。 |
| 纯验证 | Validate | 禁止使用 latest 镜像标签。 |
| 纯生成 | Generate | 为每个新 Service 自动创建对应的 DNS 记录。 |
2.6 本章小结
Kyverno 的架构设计遵循 Kubernetes 原生的准入控制模式。通过 Policy/ClusterPolicy 定义规则,利用 Match/Exclude 精确控制策略作用范围,再通过 Mutate、Validate、Generate 三大引擎实现资源的自动化变更、合规性验证和资源生成。掌握这些核心概念,是后续编写复杂策略和保障集群安全的基础。