4. Kyverno 策略引擎基础

4.1 什么是 Kyverno

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,它通过声明式的方式管理集群资源的准入控制与变更。与传统的策略工具(如 OPA/Gatekeeper)不同,Kyverno 使用 Kubernetes 原生的自定义资源定义(CRD)来定义策略,无需学习专用的策略语言(如 Rego)。

核心定位:Kyverno 运行在 Kubernetes 集群内部,以 Admission Webhook 的形式拦截资源请求,并根据用户定义的策略规则执行验证(Validate)、变更(Mutate)或生成(Generate)操作。

Kyverno 的策略规则直接使用 YAML 编写,与 Kubernetes 资源清单风格一致,大幅降低了运维人员的学习成本。在集群升级前容量水位检查场景中,Kyverno 可以自动校验节点资源、Pod 配额、PVC 使用率等关键指标,确保升级操作不会因资源不足而失败。

Kyverno 策略引擎架构 管理员/运维 ClusterPolicy Kyverno Controller Admission Webhook Kubernetes API Server 资源请求 策略引擎处理 Validate / Mutate / Generate 允许 / 拒绝 / 变更 说明 Kyverno 以 Admission Webhook 方式拦截资源请求,执行策略

4.2 策略类型:Validate / Mutate / Generate

Kyverno 提供三种核心策略类型,分别对应不同的资源处理场景。在集群升级前容量水位检查中,Validate 和 Mutate 是最常用的策略类型。

策略类型 作用时机 核心行为 升级检查场景
Validate 资源创建/更新时 验证资源是否符合规则,不符合则拒绝 检查节点内存/CPU 是否满足升级最低水位
Mutate 资源创建/更新时 自动修改资源字段,注入或覆盖配置 自动为 Pod 注入资源限制或节点亲和性
Generate 资源创建/更新时 根据规则自动生成新的资源对象 自动创建升级所需的临时命名空间或 ConfigMap
最佳实践:在升级前检查场景中,优先使用 Validate 策略进行硬性水位校验;对于需要自动修复的配置项(如缺少资源限制),使用 Mutate 策略进行自动注入。

4.2.1 Validate(验证)

Validate 策略是 Kyverno 最常用的策略类型,用于确保资源符合预定义的规则。当资源请求不满足规则时,Kyverno 会拒绝该请求并返回错误信息。Validate 支持两种模式:

  • deny(拒绝模式):直接拒绝不符合规则的资源请求。
  • warn(警告模式):允许资源创建,但记录警告日志。

4.2.2 Mutate(变更)

Mutate 策略在资源被创建或更新时自动修改其字段。这在升级前检查中非常有用,例如自动为所有 Pod 添加资源请求和限制,确保升级过程中不会出现资源争抢。

4.2.3 Generate(生成)

Generate 策略根据源资源自动创建新的资源对象。例如,当创建一个命名空间时,自动生成对应的 NetworkPolicy 或 ResourceQuota。在升级场景中,可用于自动创建升级所需的临时资源。

Kyverno 三种策略类型对比 Validate(验证) 作用: 检查资源是否符合规则 不符合则拒绝或警告 升级场景: • 节点内存 > 80% 拒绝 • PVC 使用率 > 90% 警告 • Pod 副本数 < 2 拒绝 模式:deny / warn Mutate(变更) 作用: 自动修改资源字段 注入或覆盖配置 升级场景: • 注入资源 limits • 添加节点亲和性 • 设置 Pod 优先级 模式:patch / overlay Generate(生成) 作用: 自动创建新资源对象 基于源资源生成 升级场景: • 创建临时命名空间 • 生成 ResourceQuota • 创建备份 ConfigMap 模式:synchronize / clone 三种策略类型可以组合使用,在升级前检查中实现完整的资源水位管控

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:命名空间级别策略,仅作用于指定命名空间。
注意:在集群升级前容量水位检查场景中,通常使用 ClusterPolicy 来覆盖所有节点和命名空间资源,确保全局检查的一致性。

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(审计模式):违反策略的资源请求会被允许,但会在事件和日志中记录违规信息。
推荐做法:在升级前检查的初期阶段,使用 Audit 模式进行验证,观察策略效果;确认无误后切换为 Enforce 模式,确保升级操作的安全性。

4.4 本章小结

Kyverno 作为云原生的策略引擎,通过 Validate、Mutate、Generate 三种策略类型,为 Kubernetes 集群提供了灵活的资源管控能力。其策略结构清晰,使用标准的 YAML 格式定义,与 Kubernetes 生态无缝集成。在集群升级前容量水位检查场景中,Validate 策略用于硬性水位校验,Mutate 策略用于自动修复配置,Generate 策略用于自动创建临时资源。掌握 Kyverno 的基础概念和策略结构,是后续实现自动化升级检查的前提。