4. Kyverno 策略引擎入门:架构、部署与策略类型

Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,它通过动态准入控制 Webhook 拦截资源请求,并根据用户定义的策略规则对资源进行校验、变更或自动生成。本章将深入解析 Kyverno 的核心架构、部署方式以及三种基础策略类型,为后续基于性能调优的资源配额校准打下坚实基础。

4.1 Kyverno 架构与核心组件

Kyverno 以 Pod 形式运行在集群内,通过 Kubernetes 的 动态准入控制(Dynamic Admission Control) 机制工作。其架构主要由以下组件构成:

  • Webhook 服务器:接收 API Server 发送的准入请求(AdmissionReview),是策略执行的入口。
  • 策略控制器:负责加载、缓存和评估用户定义的 ClusterPolicy / Policy 资源。
  • 缓存层:缓存集群资源(如 Namespace、Pod、Deployment)以减少对 API Server 的重复查询,提升策略评估性能。
  • 报告控制器:生成策略执行报告(PolicyReport / ClusterPolicyReport),用于审计和合规性检查。
  • 后台控制器:处理 Generate 策略的异步资源生成任务,以及清理过期报告。
性能要点: Kyverno 的缓存层和异步报告机制是性能调优的关键。在高并发场景下,合理配置缓存大小和报告聚合周期,能显著降低 API Server 负载和策略评估延迟。
Kyverno 架构组件与数据流 Kyverno 架构组件与数据流 Kubernetes API Server AdmissionReview Webhook 服务器 准入请求入口 策略控制器 加载 / 缓存 / 评估策略 缓存层 减少 API Server 查询 报告控制器 生成 PolicyReport 后台控制器 异步 Generate 任务 说明:API Server 将准入请求发送至 Webhook 服务器,策略控制器评估后返回允许/拒绝/变更结果,同时异步生成报告和后台资源。

4.2 安装与部署

Kyverno 支持多种部署方式,推荐使用 Helm Chart 进行生产环境安装,便于版本管理和参数调优。以下是标准部署步骤:

  1. 添加 Helm 仓库:helm repo add kyverno https://kyverno.github.io/kyverno/
  2. 更新仓库:helm repo update
  3. 安装 Kyverno:helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace
  4. 验证安装:kubectl get pods -n kyverno
性能调优部署参数: 在 Helm values 中,可以调整 replicaCount(建议 2-3 副本)、webhookTimeoutSeconds(默认 10s,可根据策略复杂度调整)、cacheSize(默认 1000,高并发集群建议提升至 5000)等参数。

安装完成后,Kyverno 会自动创建以下关键资源:

资源名称 类型 作用
kyverno-svc Service 暴露 Webhook 服务给 API Server
kyverno-webhook ValidatingWebhookConfiguration 注册校验/变更准入 Webhook
kyverno-cm ConfigMap 存储 Kyverno 配置(如排除的 Namespace)
kyverno-background-controller Deployment 处理 Generate 策略和报告清理

4.3 策略类型概览

Kyverno 提供三种核心策略类型,分别对应不同的准入控制阶段和自动化场景。理解它们的差异是编写高效策略的前提。

4.3.1 Validate(校验策略)

Validate 策略在资源创建或更新时进行校验,如果违反规则则拒绝请求。适用于强制安全基线、资源配额上限、命名规范等场景。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-container-limits
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "所有容器必须设置 CPU 和内存 limits"
      pattern:
        spec:
          containers:
          - resources:
              limits:
                cpu: "?*"
                memory: "?*"

4.3.2 Mutate(变更策略)

Mutate 策略在资源创建或更新时自动修改资源字段,无需用户手动操作。适用于注入 Sidecar、添加标签/注解、设置默认资源配额等场景。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-default-resources
spec:
  rules:
  - name: set-default-limits
    match:
      resources:
        kinds:
        - Pod
    mutate:
      patchStrategicMerge:
        spec:
          containers:
          - (name): "*"
            resources:
              limits:
                cpu: "500m"
                memory: "512Mi"

4.3.3 Generate(生成策略)

Generate 策略在满足触发条件时自动创建新的 Kubernetes 资源。适用于为每个 Namespace 自动创建 ResourceQuota、NetworkPolicy、RoleBinding 等。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: generate-ns-quota
spec:
  rules:
  - name: generate-resourcequota
    match:
      resources:
        kinds:
        - Namespace
    generate:
      kind: ResourceQuota
      name: default-quota
      namespace: "{{request.object.metadata.name}}"
      synchronize: true
      data:
        spec:
          hard:
            requests.cpu: "4"
            requests.memory: "8Gi"
            limits.cpu: "8"
            limits.memory: "16Gi"
Kyverno 三种策略类型工作流程 Kyverno 三种策略类型工作流程 Validate 校验策略 检查资源字段 违反则拒绝请求 强制合规 Mutate 变更策略 自动修改资源字段 注入默认值/标签 用户无感知 Generate 生成策略 触发后创建新资源 自动生成 Quota/Policy 异步后台执行 策略类型对比总结 Validate:拒绝不合规资源,适用于安全基线、配额上限强制 Mutate:自动注入默认值,适用于资源配额默认值、Sidecar 注入 Generate:自动创建关联资源,适用于为每个 Namespace 生成 ResourceQuota

4.4 策略执行模式与性能考量

Kyverno 支持两种执行模式,直接影响资源配额策略的性能表现:

模式 说明 性能影响 推荐场景
Enforce 违反策略时直接拒绝请求 低延迟,实时阻断 生产环境强制配额、安全基线
Audit 违反策略时仅记录报告,不拒绝 无阻塞,适合灰度验证 策略开发测试、合规审计
性能调优警告: 在资源配额校准场景中,建议对核心配额策略使用 Enforce 模式,避免超限资源进入集群;对实验性策略使用 Audit 模式,防止误拒绝影响业务。同时,避免在单个策略中编写过多规则(建议不超过 10 条),以减少 Webhook 超时风险。

4.5 本章小结