3. 安装 Kyverno:使用 Helm 或 YAML 部署 Kyverno 到集群,验证 Pod 与 Webhook 状态

Kyverno 作为 Kubernetes 原生的策略引擎,以动态准入控制 Webhook 的形式运行。本章将演示两种主流的部署方式——Helm Chart 与 原始 YAML 清单,并指导你完成安装后的关键验证步骤,确保 Kyverno 的 Pod 与 Webhook 配置正确生效。

3.1 部署方式对比

在开始安装前,理解两种方式的适用场景有助于做出合理选择。下表从运维复杂度、可定制性、版本管理三个维度进行对比:

对比维度 Helm Chart 部署 YAML 清单部署
运维复杂度 低,一条命令完成安装与升级 中,需手动管理多个资源文件
可定制性 高,通过 values.yaml 灵活配置 中,需直接编辑 YAML 文件
版本管理 支持 Helm 版本回滚与依赖管理 需借助 GitOps 工具或手动备份
推荐场景 生产环境、需要频繁调整配置 快速验证、离线环境、学习测试

3.2 使用 Helm 部署 Kyverno

Helm 是 Kubernetes 生态中最流行的包管理工具。Kyverno 官方维护的 Helm Chart 位于 kyverno/kyverno 仓库,支持丰富的配置参数。

3.2.1 添加 Helm 仓库并更新

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

3.2.2 安装 Kyverno(默认配置)

helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace

该命令会在 kyverno 命名空间中创建以下核心资源:

  • Deployment:运行 Kyverno 主控制器 Pod
  • Service:暴露 Webhook 端点
  • ValidatingWebhookConfiguration:注册准入验证回调
  • MutatingWebhookConfiguration:注册准入变更回调
  • ClusterRole / ClusterRoleBinding:赋予 Kyverno 必要的集群权限

3.2.3 自定义安装(生产推荐)

通过 --set 参数或自定义 values.yaml 文件,可以调整资源限制、副本数、日志级别等关键参数:

helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --set replicaCount=2 \
  --set resources.requests.cpu=500m \
  --set resources.requests.memory=512Mi \
  --set webhookTimeout=10
提示: 生产环境建议将 replicaCount 设置为至少 2,确保控制器高可用。同时根据集群规模调整 webhookTimeout(默认 10 秒),避免大规模策略评估超时。

3.3 使用 YAML 清单部署 Kyverno

对于无法使用 Helm 的环境(如离线集群、安全合规要求严格的网络隔离环境),可以直接应用 Kyverno 官方发布的 YAML 清单。

3.3.1 下载最新发布清单

wget https://github.com/kyverno/kyverno/releases/latest/download/install.yaml

3.3.2 应用清单到集群

kubectl apply -f install.yaml

该 YAML 文件包含了所有必要的 RBAC、Service、Deployment 以及 Webhook 配置。默认安装到 kyverno 命名空间。

注意: 直接应用 YAML 清单时,无法像 Helm 那样通过参数动态调整配置。如需修改资源限制或副本数,必须在应用前手动编辑 YAML 文件。建议将清单纳入版本控制,便于审计与回滚。

3.4 验证 Pod 与 Webhook 状态

安装完成后,必须执行以下验证步骤,确保 Kyverno 的准入控制链路完整可用。

3.4.1 检查 Pod 运行状态

kubectl get pods -n kyverno

预期输出应显示 kyverno-xxx-yyy 的 Pod 处于 Running 状态,且 READY 列为 1/1。

3.4.2 检查 Webhook 配置

kubectl get validatingwebhookconfiguration -l webhook.kyverno.io/managed-by=kyverno
kubectl get mutatingwebhookconfiguration -l webhook.kyverno.io/managed-by=kyverno

这两个命令应分别返回 Kyverno 注册的验证与变更 Webhook 配置。如果返回为空,说明 Webhook 注册失败,需检查 Service 与证书配置。

3.4.3 检查 Service 端点

kubectl get svc -n kyverno
kubectl get endpoints -n kyverno

Service kyverno-svc 的 Endpoints 应包含 Kyverno Pod 的 IP 地址。如果 Endpoints 为空,说明 Service 与 Pod 的标签选择器不匹配。

3.4.4 验证 Webhook 连通性(可选)

通过临时 Pod 测试 Webhook 端点是否可达:

kubectl run test-connect --image=busybox --rm -it --restart=Never -- \
  wget -qO- --timeout=5 https://kyverno-svc.kyverno.svc:443/healthz

返回 ok 表示 Webhook 服务健康。

3.5 部署架构与组件交互

下图展示了 Kyverno 安装完成后,核心组件之间的交互关系以及准入控制请求的流转路径:

Kyverno 部署架构与准入控制流程 Kyverno 部署架构与准入控制流程 Kubernetes API Server ValidatingWebhookConfiguration MutatingWebhookConfiguration kyverno-svc (Service) Kyverno Controller Pod (策略引擎 + Webhook 处理) ClusterPolicy / Policy (CRD 资源) 流程说明: 1. 用户提交资源 → API Server 触发准入 Webhook → 2. Webhook 配置将请求转发至 kyverno-svc → 3. Service 路由到 Kyverno Pod → 4. Pod 加载 ClusterPolicy 进行策略评估 → 5. 返回准入响应

3.6 常见安装问题与排查

下表汇总了安装过程中最常遇到的几类问题及其解决方案:

问题现象 可能原因 排查命令 / 解决方案
Pod 一直处于 Pending 状态 节点资源不足或 PVC 未就绪 kubectl describe pod -n kyverno <pod-name> 查看 Events
Pod 反复 CrashLoopBackOff Webhook 证书生成失败或配置错误 检查 kyverno 命名空间下的 Secret 是否存在且格式正确
Webhook 配置未创建 RBAC 权限不足或 Helm values 中禁用了 Webhook kubectl get validatingwebhookconfiguration 确认是否被其他组件删除
创建资源时超时或卡住 Webhook 服务不可达或证书不信任 检查 Service Endpoints;确认 CA Bundle 是否与集群一致
关键检查清单:
  • Pod 状态:kubectl get pods -n kyverno -o wide
  • Webhook 配置:kubectl get validatingwebhookconfiguration -o yaml | grep -A5 "clientConfig"
  • Service 与 Endpoints:kubectl get endpoints -n kyverno
  • 日志:kubectl logs -n kyverno deployment/kyverno

3.7 卸载 Kyverno

如需从集群中移除 Kyverno,请根据部署方式执行对应命令:

# Helm 部署
helm uninstall kyverno -n kyverno

# YAML 部署
kubectl delete -f install.yaml

# 清理命名空间(如果不再需要)
kubectl delete namespace kyverno
注意: 卸载 Kyverno 前,请确保集群中已没有依赖 Kyverno 策略的资源。如果存在由 Kyverno 生成的资源(如 ConfigMap、Secret),卸载后这些资源将保留,但不再受策略约束。建议先删除所有 ClusterPolicy 和 Policy 资源,再执行卸载。