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 架构概览

Kyverno 核心架构 Kubernetes API Server Kyverno Admission Controller MutatingWebhook + ValidatingWebhook 策略引擎 (Policy Engine) Policy / ClusterPolicy PolicyReport / ClusterPolicyReport 后台扫描 (Background Scan) 策略以 Kubernetes CRD 形式存储,Kyverno 通过 Webhook 和后台扫描两种方式执行策略

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 为控制器设置资源限制