3. Kyverno 安装与部署:使用 Helm Chart 安装 Kyverno、配置高可用、验证组件状态

本章将指导你使用 Helm Chart 在生产环境中安装 Kyverno,配置其核心组件的高可用模式,并验证 Admission Controller、Cleanup Controller 与 Reports Controller 的运行状态。正确的安装与验证是后续策略审计与合规巡检的基础。

3.1 环境准备与 Helm 仓库配置

在安装 Kyverno 之前,请确保你的 Kubernetes 集群满足以下最低要求:

  • Kubernetes 版本:v1.26 及以上(推荐 v1.28+)
  • Helm 版本:v3.8.0 及以上
  • 集群资源:至少 2 个 Worker 节点,每个节点 4 GiB 内存、2 核 CPU
  • 存储类(StorageClass):支持动态卷供应(用于 Reports Controller 持久化)
生产建议:建议使用专用的 kyverno 命名空间,并提前配置好集群的 PodSecurityPolicy 或 Pod Security Admission 以允许 Kyverno 组件以特权模式运行。

首先,添加 Kyverno 官方 Helm 仓库并更新索引:

helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

3.2 使用 Helm Chart 安装 Kyverno(高可用模式)

Kyverno 官方 Chart 支持通过 values.yaml 灵活配置高可用。以下是一个面向生产环境的配置示例,启用了三个控制器的多副本与反亲和性:

# ha-values.yaml
admissionController:
  replicas: 3
  podDisruptionBudget:
    minAvailable: 2
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: app.kubernetes.io/component
                operator: In
                values:
                  - admission-controller
          topologyKey: kubernetes.io/hostname

cleanupController:
  replicas: 2
  podDisruptionBudget:
    minAvailable: 1

reportsController:
  replicas: 2
  podDisruptionBudget:
    minAvailable: 1

# 启用高可用相关的 feature gate
features:
  highAvailability:
    enabled: true

执行安装命令:

helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --values ha-values.yaml \
  --version v3.2.6
版本锁定:生产环境务必指定 --version 参数,避免意外升级导致策略行为变更。建议在测试环境验证新版本后再更新。

3.3 组件架构与高可用设计

Kyverno 由三个核心控制器组成,每个控制器在高可用模式下都运行多个副本,并通过 Kubernetes 原生机制实现故障转移。下图展示了高可用部署的组件关系:

Kyverno 高可用组件架构 Kubernetes API Server Admission Controller 副本 1 (Leader) 副本 2 (Follower) 副本 3 (Follower) Cleanup Controller 副本 1 (Leader) 副本 2 (Follower) Reports Controller 副本 1 (Leader) 副本 2 (Follower) 高可用关键机制: • 每个控制器通过 leader election 选主,仅 Leader 处理实际请求 • PodDisruptionBudget 确保滚动更新或节点故障时最少可用副本数 • Pod Anti-Affinity 将副本调度到不同节点,避免单点故障 • Reports Controller 依赖持久卷,需确保存储后端高可用

3.4 验证组件状态

安装完成后,通过以下步骤验证三个控制器的健康状态。

3.4.1 检查 Pod 运行状态

kubectl get pods -n kyverno -o wide

预期输出应包含以下 Pod 且 STATUS 均为 Running:

组件 Pod 名称前缀 预期副本数 关键标签
Admission Controller kyverno-admission-controller-* 3 app.kubernetes.io/component: admission-controller
Cleanup Controller kyverno-cleanup-controller-* 2 app.kubernetes.io/component: cleanup-controller
Reports Controller kyverno-reports-controller-* 2 app.kubernetes.io/component: reports-controller

3.4.2 验证 Leader Election

通过查看 Pod 日志确认 Leader 选举状态:

# 查看 Admission Controller 的 Leader 信息
kubectl logs -n kyverno -l app.kubernetes.io/component=admission-controller \
  --tail=20 | grep -E "leader|elected"

# 查看 Cleanup Controller 的 Leader 信息
kubectl logs -n kyverno -l app.kubernetes.io/component=cleanup-controller \
  --tail=20 | grep -E "leader|elected"

# 查看 Reports Controller 的 Leader 信息
kubectl logs -n kyverno -l app.kubernetes.io/component=reports-controller \
  --tail=20 | grep -E "leader|elected"

正常日志应包含类似 "successfully acquired lease" 或 "became leader" 的记录,且每个控制器仅有一个 Leader 副本输出此类信息。

3.4.3 检查 Webhook 配置

Admission Controller 通过 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 接收请求:

kubectl get validatingwebhookconfiguration -l app.kubernetes.io/instance=kyverno
kubectl get mutatingwebhookconfiguration -l app.kubernetes.io/instance=kyverno

确认两个 Webhook 配置的 AGE 正常,且 WEBHOOKS 列显示数量大于 0。

3.4.4 验证 Reports Controller 持久化

Reports Controller 使用 PersistentVolumeClaim 存储审计报告:

kubectl get pvc -n kyverno -l app.kubernetes.io/component=reports-controller
kubectl get pv | grep kyverno

确认 PVC 状态为 Bound,且对应的 PV 已创建。

巡检清单:完成安装后,建议执行以下快速验证:
  • 所有 Pod 的 READY 列为 1/1 或 2/2(取决于 sidecar)
  • Leader 选举日志无 error 或 failed 关键字
  • Webhook 配置的 service 引用指向正确的 Kyverno Service
  • Reports Controller 的 PVC 可读写(可通过挂载测试 Pod 验证)

3.5 常见安装问题与排错

问题现象 可能原因 解决方案
Admission Controller Pod 启动失败 Webhook 证书未就绪或集群 CA 不匹配 检查 kyverno-svc.kyverno.svc 的 TLS 证书;重启 Pod 或手动删除 Secret 让 Helm 重建
Cleanup Controller 无法选主 副本数过多或 etcd 性能瓶颈 降低副本数至 2;检查 etcd 的 --max-request-bytes 配置
Reports Controller PVC 一直 Pending 集群缺少默认 StorageClass 或存储后端故障 创建合适的 StorageClass;或在 values 中指定 reportsController.storage.storageClassName
Webhook 配置未生效 Kyverno Service 未正确暴露端口 检查 Service kyverno-svc 的 targetPort 是否为 443;确认网络策略允许 API Server 访问

3.6 升级与回滚策略

当需要升级 Kyverno 版本时,遵循以下步骤以最小化影响:

  1. 备份现有策略:kubectl get clusterpolicy -o yaml > backup-policies.yaml
  2. 升级 Helm Release:helm upgrade kyverno kyverno/kyverno --namespace kyverno --values ha-values.yaml --version <新版本>
  3. 监控滚动更新:kubectl rollout status -n kyverno deployment/kyverno-admission-controller
  4. 验证功能:执行 3.4 节的验证步骤

若升级失败,执行回滚:

helm rollback kyverno -n kyverno 1  # 回滚到上一个版本
版本兼容性:Kyverno 1.12 及以上版本不再支持 v1beta1 的 CRD 版本。升级前请确保所有自定义资源已迁移至 v1 或 v1beta2。使用 kubectl get crd | grep kyverno 检查当前 CRD 版本。