3. Kyverno 策略引擎入门:架构、安装部署与策略生命周期管理
Kyverno 是专为 Kubernetes 设计的云原生策略引擎,以 动态准入控制 Webhook 为核心,将策略定义为 Kubernetes 资源(CRD),无需编写 Webhook 或 Admission Controller 代码。本章从架构原理、生产级部署到策略全生命周期管理,建立对 Kyverno 的完整认知。
3.1 Kyverno 架构与核心组件
Kyverno 采用 控制面-数据面 分离设计,控制面负责策略管理与决策,数据面通过 Webhook 拦截资源请求并执行策略。
架构要点: Kyverno 不修改 kube-apiserver 代码,以标准 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 注册,完全兼容原生 Kubernetes 生态。
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 部署步骤
- 添加 Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
- 创建命名空间并部署
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno \
--namespace kyverno \
--set admissionController.replicas=2 \
--set backgroundController.enabled=true \
--set reportsController.enabled=true
- 验证部署状态
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 查看集群中已执行的策略审计结果。
3.5 本章小结
- Kyverno 以 CRD + Webhook 架构实现策略即代码,无需额外开发 Admission Controller。
- 生产部署推荐 Helm Chart,配置多副本和后台控制器确保高可用与审计能力。
- 策略生命周期包含 定义、验证、部署、审计、更新、废弃 六个阶段,Audit 模式是安全上线的关键缓冲。
- CLI 工具支持离线测试,降低策略错误对生产集群的影响。