Kyverno集群升级配额校验与策略故障修复 - 第1节
1.1 Kyverno 是什么
Kyverno 是一个为 Kubernetes 设计的云原生策略引擎,由 Nirmata 开源,后捐献给 CNCF 成为孵化项目。它允许集群管理员以 Kubernetes 资源(Policy 和 ClusterPolicy)的形式声明策略,无需编写 Webhook 或 Admission Controller 代码。
核心能力:Kyverno 通过动态 Admission Webhook 拦截资源创建/更新请求,对资源进行验证、变更、生成或清理,同时支持对已有资源进行审计扫描。
1.1.1 策略类型
| 策略类型 | 作用域 | 典型用途 |
|---|---|---|
| Validate | 验证资源是否符合规则 | 强制 Pod 必须设置资源 limits/requests |
| Mutate | 修改资源字段 | 自动注入 Sidecar、添加标签、设置默认资源配额 |
| Generate | 创建关联资源 | 为每个 Namespace 自动生成 ResourceQuota 和 LimitRange |
| VerifyImages | 验证容器镜像签名 | 只允许经过签名的镜像部署 |
| Cleanup | 清理过期资源 | 删除超过 TTL 的 Job 或 Pod |
1.1.2 Kyverno 架构概览
1.2 Kyverno 与 OPA/Gatekeeper 的区别
OPA/Gatekeeper 和 Kyverno 都是 Kubernetes 策略引擎,但设计哲学和实现方式有显著差异。下表从多个维度进行对比:
| 对比维度 | Kyverno | OPA / Gatekeeper |
|---|---|---|
| 策略语言 | YAML 声明式(无学习曲线) | Rego 声明式查询语言(需专门学习) |
| 策略定义方式 | Kubernetes CRD(Policy / ClusterPolicy) | ConstraintTemplate + Constraint(CRD) |
| 变更能力 | 原生支持 Mutate(修改资源字段) | 需额外编写 Mutation Webhook 或使用 OPA 数据 |
| 生成能力 | 原生支持 Generate(创建关联资源) | 不支持,需外部工具配合 |
| 镜像验证 | 内置 VerifyImages 支持(Cosign/Sigstore) | 需自定义 Rego 规则调用外部 API |
| 审计模式 | 内置后台扫描,生成 PolicyReport | 通过 Constraint 状态和 Audit 功能实现 |
| 性能开销 | 轻量,每个策略一个 Webhook 配置 | 较重,所有策略通过单一 Gatekeeper Webhook |
| 社区生态 | 官方提供 200+ 预置策略(Policy Library) | 社区提供 Gatekeeper Library,但需 Rego 适配 |
选型建议:如果团队以 YAML 为主、希望快速上手策略治理,Kyverno 是更自然的选择;如果已有 OPA 投资或需要高度自定义的复杂策略逻辑,Gatekeeper 更灵活。
1.3 Kyverno 的安装与部署
1.3.1 环境要求
- Kubernetes 集群版本 ≥ 1.23(推荐 1.27+)
- 集群已启用 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 准入控制器
- 具备
cluster-admin权限或至少能创建 CRD、Webhook 配置 - Helm 3.8+(推荐使用 Helm 安装)
1.3.2 使用 Helm 安装(推荐)
# 添加 Kyverno Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
# 创建命名空间
kubectl create namespace kyverno
# 安装 Kyverno(v1.12+ 推荐使用 charts/kyverno)
helm install kyverno kyverno/kyverno \
--namespace kyverno \
--create-namespace \
--set admissionController.replicas=2 \
--set backgroundController.replicas=1 \
--set cleanupController.replicas=1 \
--set reportsController.replicas=1
1.3.3 验证安装
# 检查 Pod 状态
kubectl get pods -n kyverno
# 预期输出(4 个控制器 Pod 均 Running)
NAME READY STATUS RESTARTS AGE
kyverno-admission-controller-6f8d9c7b9c-abc12 1/1 Running 0 2m
kyverno-background-controller-5d4f6b7c8d-def34 1/1 Running 0 2m
kyverno-cleanup-controller-7e5f8a9b0c-ghi56 1/1 Running 0 2m
kyverno-reports-controller-4c3d2e1f0a-jkl78 1/1 Running 0 2m
# 检查 Webhook 配置
kubectl get mutatingwebhookconfigurations
kubectl get validatingwebhookconfigurations
# 检查 CRD 是否就绪
kubectl get crd | grep kyverno
1.3.4 部署第一个策略:强制 Pod 设置资源限制
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-pod-resources
spec:
validationFailureAction: Enforce
rules:
- name: check-resources
match:
any:
- resources:
kinds:
- Pod
validate:
message: "所有容器必须设置 resources.limits 和 resources.requests"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
requests:
memory: "?*"
cpu: "?*"
EOF
注意:
validationFailureAction: Enforce 表示违反策略时直接拒绝请求;若设为 Audit 则仅记录违规,不阻断操作。生产环境建议先使用 Audit 模式观察影响。
1.3.5 测试策略效果
# 尝试创建没有资源限制的 Pod(应被拒绝)
kubectl run test-pod --image=nginx
# 预期输出
Error from server: admission webhook "validate.kyverno.svc" denied the request:
resource Pod/default/test-pod was blocked due to the following policies:
require-pod-resources:
check-resources: '所有容器必须设置 resources.limits 和 resources.requests'
# 创建合规 Pod(应成功)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: compliant-pod
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "256Mi"
cpu: "500m"
requests:
memory: "128Mi"
cpu: "250m"
EOF
1.3.6 安装后关键检查清单
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 控制器 Pod 状态 | kubectl get pods -n kyverno |
4 个 Pod 均为 Running |
| Webhook 配置 | kubectl get mutatingwebhookconfigurations |
至少 1 个 kyverno 前缀的 Webhook |
| CRD 注册 | kubectl get crd | grep kyverno |
包含 policies、clusterpolicies、policyreports 等 |
| 策略执行 | 创建测试资源触发策略 | 合规/违规行为符合预期 |
| 日志检查 | kubectl logs -n kyverno deployment/kyverno-admission-controller |
无 ERROR 级别日志 |
生产部署建议:
- 将
admissionController.replicas设置为 ≥2 保证高可用 - 配置 PodDisruptionBudget 防止 Webhook 中断
- 启用
--set features.reports.enabled=true获取审计报告 - 使用
--set admissionController.resources为控制器设置资源限制