4. Kyverno 策略引擎基础
4.1 什么是 Kyverno
Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,它通过声明式的方式管理集群资源的准入控制与变更。与传统的策略工具(如 OPA/Gatekeeper)不同,Kyverno 使用 Kubernetes 原生的自定义资源定义(CRD)来定义策略,无需学习专用的策略语言(如 Rego)。
Kyverno 的策略规则直接使用 YAML 编写,与 Kubernetes 资源清单风格一致,大幅降低了运维人员的学习成本。在集群升级前容量水位检查场景中,Kyverno 可以自动校验节点资源、Pod 配额、PVC 使用率等关键指标,确保升级操作不会因资源不足而失败。
4.2 策略类型:Validate / Mutate / Generate
Kyverno 提供三种核心策略类型,分别对应不同的资源处理场景。在集群升级前容量水位检查中,Validate 和 Mutate 是最常用的策略类型。
| 策略类型 | 作用时机 | 核心行为 | 升级检查场景 |
|---|---|---|---|
| Validate | 资源创建/更新时 | 验证资源是否符合规则,不符合则拒绝 | 检查节点内存/CPU 是否满足升级最低水位 |
| Mutate | 资源创建/更新时 | 自动修改资源字段,注入或覆盖配置 | 自动为 Pod 注入资源限制或节点亲和性 |
| Generate | 资源创建/更新时 | 根据规则自动生成新的资源对象 | 自动创建升级所需的临时命名空间或 ConfigMap |
4.2.1 Validate(验证)
Validate 策略是 Kyverno 最常用的策略类型,用于确保资源符合预定义的规则。当资源请求不满足规则时,Kyverno 会拒绝该请求并返回错误信息。Validate 支持两种模式:
- deny(拒绝模式):直接拒绝不符合规则的资源请求。
- warn(警告模式):允许资源创建,但记录警告日志。
4.2.2 Mutate(变更)
Mutate 策略在资源被创建或更新时自动修改其字段。这在升级前检查中非常有用,例如自动为所有 Pod 添加资源请求和限制,确保升级过程中不会出现资源争抢。
4.2.3 Generate(生成)
Generate 策略根据源资源自动创建新的资源对象。例如,当创建一个命名空间时,自动生成对应的 NetworkPolicy 或 ResourceQuota。在升级场景中,可用于自动创建升级所需的临时资源。
4.3 策略结构
Kyverno 策略由标准的 Kubernetes 资源清单定义,主要包含 metadata、spec 和 rules 三个核心部分。以下是一个典型的 Validate 策略结构示例:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-node-memory
annotations:
policies.kyverno.io/title: "节点内存水位检查"
policies.kyverno.io/description: "检查节点内存使用率是否超过80%"
spec:
validationFailureAction: Enforce # Enforce 或 Audit
background: true # 是否对已有资源进行扫描
rules:
- name: memory-usage-check
match:
resources:
kinds:
- Node
validate:
message: "节点内存使用率超过80%,禁止升级操作"
pattern:
spec:
(status):
(allocatable):
memory: "?*"
(capacity):
memory: "?*"
4.3.1 策略结构核心字段
| 字段 | 类型 | 说明 | 示例值 |
|---|---|---|---|
apiVersion |
string | Kyverno API 版本 | kyverno.io/v1 |
kind |
string | 策略类型,ClusterPolicy 或 Policy | ClusterPolicy |
spec.validationFailureAction |
string | 验证失败时的行为:Enforce(拒绝)或 Audit(仅记录) | Enforce |
spec.background |
boolean | 是否对集群中已有资源进行扫描 | true |
spec.rules[].match |
object | 定义策略匹配的资源类型和条件 | kinds: [Node] |
spec.rules[].validate |
object | 验证规则的具体定义 | message: "..." |
spec.rules[].mutate |
object | 变更规则的具体定义 | patchStrategicMerge: ... |
spec.rules[].generate |
object | 生成规则的具体定义 | kind: ConfigMap |
4.3.2 策略作用范围:ClusterPolicy vs Policy
Kyverno 提供两种策略作用范围:
- ClusterPolicy:集群级别策略,作用于整个集群的所有命名空间。
- Policy:命名空间级别策略,仅作用于指定命名空间。
4.3.3 规则匹配与条件
每条规则通过 match 字段定义匹配条件,支持按资源类型、标签、命名空间、名称等多种维度进行匹配。同时,exclude 字段用于排除不需要检查的资源。
rules:
- name: exclude-system-namespaces
match:
resources:
kinds:
- Pod
namespaces:
- "*" # 匹配所有命名空间
exclude:
resources:
namespaces:
- kube-system
- kyverno-system
validate:
message: "Pod 资源限制检查"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
4.3.4 策略执行模式
Kyverno 支持两种执行模式,通过 validationFailureAction 字段控制:
- Enforce(强制模式):违反策略的资源请求将被直接拒绝,无法创建或更新。
- Audit(审计模式):违反策略的资源请求会被允许,但会在事件和日志中记录违规信息。
4.4 本章小结
Kyverno 作为云原生的策略引擎,通过 Validate、Mutate、Generate 三种策略类型,为 Kubernetes 集群提供了灵活的资源管控能力。其策略结构清晰,使用标准的 YAML 格式定义,与 Kubernetes 生态无缝集成。在集群升级前容量水位检查场景中,Validate 策略用于硬性水位校验,Mutate 策略用于自动修复配置,Generate 策略用于自动创建临时资源。掌握 Kyverno 的基础概念和策略结构,是后续实现自动化升级检查的前提。