3. Kyverno 策略引擎入门:架构、安装部署与策略生命周期管理

Kyverno 是专为 Kubernetes 设计的云原生策略引擎,以 动态准入控制 Webhook 为核心,将策略定义为 Kubernetes 资源(CRD),无需编写 Webhook 或 Admission Controller 代码。本章从架构原理、生产级部署到策略全生命周期管理,建立对 Kyverno 的完整认知。

3.1 Kyverno 架构与核心组件

Kyverno 采用 控制面-数据面 分离设计,控制面负责策略管理与决策,数据面通过 Webhook 拦截资源请求并执行策略。

架构要点: Kyverno 不修改 kube-apiserver 代码,以标准 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 注册,完全兼容原生 Kubernetes 生态。
Kyverno 核心架构组件与数据流 用户 / CI 系统 kube-apiserver Webhook 配置 Kyverno Pod(控制面) Webhook 服务 策略引擎 报告控制器 缓存/存储 etcd(策略存储) 策略 CRD 对象 数据流:用户提交资源 → kube-apiserver 拦截 → Webhook 转发至 Kyverno → 策略引擎评估 → 返回准入响应

3.2 生产级安装部署

Kyverno 支持 Helm Chart、静态 YAML 和 Operator 三种部署方式。生产环境推荐 Helm Chart,便于版本管理和参数定制。

3.2.1 部署方式对比

部署方式 适用场景 复杂度 版本管理 自定义能力
Helm Chart 生产环境、CI/CD 集成 低 强(Chart 版本锁定) 高(values.yaml 覆盖)
静态 YAML 测试环境、快速验证 最低 弱(手动管理) 中(直接修改 YAML)
Operator 大规模集群、自动化运维 中 强(Operator 生命周期) 高(CRD 驱动配置)

3.2.2 Helm 部署步骤

  1. 添加 Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
  1. 创建命名空间并部署
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set admissionController.replicas=2 \
  --set backgroundController.enabled=true \
  --set reportsController.enabled=true
  1. 验证部署状态
kubectl get pods -n kyverno
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations
生产建议: 至少部署 2 个 admissionController 副本保证高可用;启用 backgroundController 和 reportsController 以支持后台扫描和策略报告功能。

3.3 策略生命周期管理

Kyverno 策略遵循 定义 → 验证 → 部署 → 审计 → 更新 → 废弃 的完整生命周期。策略本身作为 Kubernetes CRD 对象,天然支持 GitOps 和版本控制。

3.3.1 策略类型与作用域

策略类型 作用域 匹配方式 典型用途
ClusterPolicy 集群级别 match / exclude 规则 全局安全基线、合规要求
Policy 命名空间级别 match / exclude 规则 团队级资源约束

3.3.2 策略规则结构

每条策略包含 match(匹配条件)、exclude(排除条件)、validate/mutate/generate(执行动作)三部分。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-pod-resources
spec:
  validationFailureAction: Enforce   # Enforce | Audit
  rules:
  - name: check-resources
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "Pod 必须设置 resources.requests 和 resources.limits"
      pattern:
        spec:
          containers:
          - resources:
              requests:
                memory: "?*"
                cpu: "?*"
              limits:
                memory: "?*"
                cpu: "?*"

3.3.3 策略执行模式

  • Enforce(强制模式):违反策略的资源请求被直接拒绝,无法创建或更新。
  • Audit(审计模式):违反策略的资源允许创建,但生成策略报告(PolicyReport)用于事后审计。
安全实践: 新策略上线前先在 Audit 模式运行至少 1 个观察周期,确认无意外拦截后再切换为 Enforce 模式。

3.3.4 策略版本与更新

Kyverno 策略更新遵循 声明式覆盖 原则:直接修改 CRD 对象的 spec 字段,控制器自动重新加载。推荐通过 GitOps 工作流管理策略变更。

阶段 操作 验证方式
开发 编写策略 YAML,本地测试 kyverno apply / test 命令
预发布 部署到预发集群,Audit 模式 检查 PolicyReport 对象
生产 切换为 Enforce 模式 监控准入拒绝事件
废弃 删除策略 CRD 对象 确认 Webhook 不再触发

3.4 策略测试与调试

Kyverno 提供 kyverno CLI 工具,支持离线测试策略效果,无需真实集群。

# 安装 CLI
curl -sLO https://github.com/kyverno/kyverno/releases/latest/download/kyverno-cli.tar.gz
tar -xzf kyverno-cli.tar.gz
sudo mv kyverno /usr/local/bin/

# 测试策略
kyverno apply /path/to/policy.yaml --resource /path/to/resource.yaml

# 查看测试结果
kyverno test /path/to/test/folder/
调试技巧: 使用 kyverno apply --detailed-results 查看每条规则的详细匹配结果;结合 kubectl describe policyreport 查看集群中已执行的策略审计结果。
策略生命周期管理流程 定义 验证 部署 审计 更新 持续迭代(GitOps 驱动) 生命周期关键动作 定义:编写策略 YAML → 验证:CLI 离线测试 → 部署:kubectl apply / Helm → 审计:检查 PolicyReport → 更新:修改 CRD 并重新 apply 废弃:删除策略 CRD 对象,确认 Webhook 不再触发

3.5 本章小结

  • Kyverno 以 CRD + Webhook 架构实现策略即代码,无需额外开发 Admission Controller。
  • 生产部署推荐 Helm Chart,配置多副本和后台控制器确保高可用与审计能力。
  • 策略生命周期包含 定义、验证、部署、审计、更新、废弃 六个阶段,Audit 模式是安全上线的关键缓冲。
  • CLI 工具支持离线测试,降低策略错误对生产集群的影响。