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 原生机制实现故障转移。下图展示了高可用部署的组件关系:
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 版本时,遵循以下步骤以最小化影响:
- 备份现有策略:
kubectl get clusterpolicy -o yaml > backup-policies.yaml - 升级 Helm Release:
helm upgrade kyverno kyverno/kyverno --namespace kyverno --values ha-values.yaml --version <新版本> - 监控滚动更新:
kubectl rollout status -n kyverno deployment/kyverno-admission-controller - 验证功能:执行 3.4 节的验证步骤
若升级失败,执行回滚:
helm rollback kyverno -n kyverno 1 # 回滚到上一个版本
kubectl get crd | grep kyverno 检查当前 CRD 版本。