3. Kyverno安装与部署

3.1 部署方式概览与选型对比

Kyverno 作为 Kubernetes 原生的策略引擎,支持多种部署方式。在生产环境中,选择正确的部署策略直接影响到集群的稳定性、策略生效延迟以及运维复杂度。下表对比了三种主流部署方式的核心差异:

部署方式 复杂度 版本管理 自定义能力 生产推荐度
Helm Chart 低 原生支持 values 覆盖 高(通过 values.yaml) ★★★★★
Kustomize 中 需配合 GitOps 工具 极高(支持 overlay) ★★★★☆
静态 YAML 低 手动管理 低 ★★☆☆☆
选型建议: 对于大多数生产集群,推荐使用 Helm 方式部署,配合 ArgoCD 或 Flux 进行 GitOps 管理。Kustomize 更适合需要深度定制资源名称、命名空间或标签的复杂多环境场景。

3.2 Helm 安装:标准生产流程

Helm 是部署 Kyverno 最推荐的方式。以下步骤适用于 Kubernetes v1.23+ 集群,并已配置好 Helm v3。

3.2.1 添加 Helm 仓库与版本锁定

# 添加 Kyverno 官方 Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# 查询可用版本,锁定生产版本
helm search repo kyverno/kyverno --versions --devel | head -5

3.2.2 生产级 values 配置

创建一个专用的 values-production.yaml 文件,覆盖关键参数:

# values-production.yaml
replicaCount: 3
podDisruptionBudget:
  enabled: true
  minAvailable: 2

resources:
  limits:
    cpu: 1000m
    memory: 1Gi
  requests:
    cpu: 500m
    memory: 512Mi

config:
  webhookTimeout: 10
  generateSuccessEvents: false

features:
  reports:
    enabled: true
  policyException:
    enabled: true

serviceMonitor:
  enabled: true
  namespace: monitoring

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app.kubernetes.io/name
            operator: In
            values:
            - kyverno
        topologyKey: kubernetes.io/hostname

3.2.3 执行安装

helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --values values-production.yaml \
  --version 3.2.6 \
  --wait
关键检查点: 安装完成后,务必检查 kyverno-svc 的 webhook 配置是否成功注入。使用 kubectl get validatingwebhookconfigurations 和 kubectl get mutatingwebhookconfigurations 确认 Kyverno 的 webhook 处于 ACTIVE 状态。

3.3 Kustomize 部署:GitOps 原生集成

对于已经采用 Kustomize 进行资源管理的团队,可以直接从 Kyverno 官方发布的 Kustomize 资源部署。这种方式更易于与 ArgoCD 等 GitOps 工具集成。

3.3.1 基础部署结构

# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: kyverno

resources:
- https://github.com/kyverno/kyverno/releases/download/v3.2.6/install.yaml

patches:
# 调整副本数为 3
- target:
    kind: Deployment
    name: kyverno
  patch: |-
    - op: replace
      path: /spec/replicas
      value: 3

# 添加资源限制
- target:
    kind: Deployment
    name: kyverno
  patch: |-
    - op: add
      path: /spec/template/spec/containers/0/resources
      value:
        limits:
          cpu: "1"
          memory: 1Gi
        requests:
          cpu: 500m
          memory: 512Mi

3.3.2 多环境 Overlay 策略

环境 Overlay 目录 关键差异
开发 overlays/dev replicaCount=1, 关闭 PDB, 开启调试日志
预发 overlays/staging replicaCount=2, 开启 PDB, 启用报告功能
生产 overlays/prod replicaCount=3, 严格 PDB, 开启 ServiceMonitor

3.4 生产环境最佳实践

以下实践基于多个生产集群的运维经验总结,涵盖资源规划、安全加固与可观测性。

3.4.1 资源规划与限流

  • CPU 与内存基线: 每个 Kyverno Pod 至少分配 500m CPU / 512Mi 内存,建议上限为 1 CPU / 1Gi 内存。
  • Webhook 超时设置: 默认超时为 10 秒,对于包含复杂 CEL 表达式的策略,建议调整为 15-20 秒。
  • 并发请求控制: 通过 --webhookParallelism 参数控制并发处理数,默认 10,高负载集群可调整为 20。

3.4.2 安全加固清单

安全项 配置方式 说明
禁用 generateSuccessEvents config.generateSuccessEvents: false 减少 etcd 写入压力与审计日志噪音
启用策略异常 features.policyException.enabled: true 允许特定资源绕过策略,避免误拦截
限制 webhook 作用范围 配置 webhook.rules 白名单 避免 Kyverno 拦截系统命名空间资源
TLS 证书轮换 启用 cert-manager 集成 自动管理 webhook 证书,避免过期导致策略失效

3.4.3 可观测性集成

Kyverno 原生暴露 Prometheus 指标,建议在 values 中开启 ServiceMonitor:

# 关键指标清单
kyverno_policy_rule_info_total        # 策略规则总数
kyverno_policy_results_total          # 策略执行结果(pass/fail/error)
kyverno_admission_requests_total      # 准入请求总数
kyverno_admission_latency_seconds     # 准入延迟分布
Grafana 看板建议: 导入 Kyverno 官方提供的 Grafana Dashboard ID 14808,重点关注 策略失败率 和 webhook 延迟 P99 两个面板。

3.5 高可用配置

Kyverno 的高可用设计围绕 多副本 + Pod 反亲和 + PodDisruptionBudget 三个核心维度展开。下图展示了生产环境的高可用部署架构:

Kyverno 生产高可用部署架构 Kubernetes API Server kyverno-svc (ClusterIP) kyverno-0 节点 A (us-east-1a) Leader 选举: 候选 kyverno-1 节点 B (us-east-1b) Leader 选举: 主 kyverno-2 节点 C (us-east-1c) Leader 选举: 候选 PodDisruptionBudget: minAvailable=2 允许最多 1 个 Pod 同时不可用,保障 webhook 持续响应 Pod Anti-Affinity: preferredDuringScheduling 尽量将 Pod 调度到不同可用区与不同节点,避免单点故障

3.5.1 关键高可用参数配置

# 高可用核心配置片段
replicaCount: 3
podDisruptionBudget:
  enabled: true
  minAvailable: 2

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app.kubernetes.io/name
            operator: In
            values:
            - kyverno
        topologyKey: topology.kubernetes.io/zone   # 跨可用区调度

topologySpreadConstraints:
- maxSkew: 1
  topologyKey: kubernetes.io/hostname
  whenUnsatisfiable: DoNotSchedule
  labelSelector:
    matchLabels:
      app.kubernetes.io/name: kyverno

3.5.2 Leader 选举机制

Kyverno 使用 Kubernetes 原生 Leader 选举机制(基于 ConfigMap 或 Lease 对象)来协调多个副本。只有 Leader 副本处理变更请求,其他副本处于热备状态。当 Leader 宕机时,选举会在 15 秒内完成切换,期间 webhook 调用会重试,不会导致策略执行失败。

重要: 即使 Leader 选举失败,Kyverno 的 webhook 配置仍然存在于 API Server 中。如果所有 Kyverno Pod 都不可用,所有资源变更请求将被阻塞。因此,必须确保至少 2 个副本始终健康运行,PDB 的 minAvailable 建议设置为 2。

3.6 部署验证与健康检查

完成部署后,执行以下验证步骤确保系统正常运行:

  1. Pod 状态检查: kubectl get pods -n kyverno -o wide,确认所有 Pod 处于 Running 状态且分布在不同的节点。
  2. Webhook 注入验证: kubectl get validatingwebhookconfigurations -o yaml | grep "kyverno",确认 webhook 配置存在且 clientConfig 指向正确的 Service。
  3. 策略执行测试: 创建一个测试命名空间并应用一条简单的 disallow-latest-tag 策略,验证 Kyverno 能够正常拦截和允许资源。
  4. 指标端点检查: kubectl port-forward -n kyverno svc/kyverno-svc 8000:8000,访问 localhost:8000/metrics 确认 Prometheus 指标正常暴露。
生产就绪检查清单:
  • ✅ 副本数 ≥ 3,且分布在 ≥ 3 个可用区
  • ✅ PodDisruptionBudget 已配置,minAvailable ≥ 2
  • ✅ 资源 requests/limits 已设置,避免资源争抢
  • ✅ ServiceMonitor 已配置,告警规则已导入
  • ✅ 证书自动轮换机制已启用(cert-manager 或 Kyverno 内置)
  • ✅ 策略异常(PolicyException)功能已开启