3. Kyverno 基础:策略引擎原理、策略类型与匹配规则
Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,以 Kubernetes 自定义资源(CRD)的形式运行,无需编写 Webhook 或使用 Admission Controller 模板。它通过监听资源的创建、更新、删除操作,在 Admission Review 阶段对资源进行校验、修改或生成,从而实现安全合规、配置治理与自动化运维。
3.1 策略引擎原理
Kyverno 的核心工作流程基于 Kubernetes 的动态准入控制(Dynamic Admission Control)机制。当用户通过 kubectl 或 API 提交资源请求时,请求会经过 Kyverno 注册的 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration,触发策略引擎执行。
Kyverno 策略引擎内部包含三个关键组件:
- 策略控制器(Policy Controller):负责监听策略资源(ClusterPolicy / Policy)的变化,将策略编译为可执行的规则集。
- Webhook 处理器(Webhook Handler):接收 AdmissionReview 请求,提取资源对象,匹配策略规则。
- 规则引擎(Rule Engine):根据策略类型(Validate / Mutate / Generate)执行对应的逻辑,返回 AdmissionResponse。
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 的支持。
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:是否保持生成资源与源资源同步(删除源资源时是否删除生成资源)。
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)的优先级高于匹配规则。
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 快照,用于快速回滚。
- 故障注入与验证:通过临时调整策略规则,模拟安全护栏失效场景,验证回滚机制是否正常。