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 负载和策略评估延迟。
4.2 安装与部署
Kyverno 支持多种部署方式,推荐使用 Helm Chart 进行生产环境安装,便于版本管理和参数调优。以下是标准部署步骤:
- 添加 Helm 仓库:
helm repo add kyverno https://kyverno.github.io/kyverno/ - 更新仓库:
helm repo update - 安装 Kyverno:
helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace - 验证安装:
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"
4.4 策略执行模式与性能考量
Kyverno 支持两种执行模式,直接影响资源配额策略的性能表现:
| 模式 | 说明 | 性能影响 | 推荐场景 |
|---|---|---|---|
| Enforce | 违反策略时直接拒绝请求 | 低延迟,实时阻断 | 生产环境强制配额、安全基线 |
| Audit | 违反策略时仅记录报告,不拒绝 | 无阻塞,适合灰度验证 | 策略开发测试、合规审计 |
性能调优警告: 在资源配额校准场景中,建议对核心配额策略使用 Enforce 模式,避免超限资源进入集群;对实验性策略使用 Audit 模式,防止误拒绝影响业务。同时,避免在单个策略中编写过多规则(建议不超过 10 条),以减少 Webhook 超时风险。