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 命名空间。
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 安装完成后,核心组件之间的交互关系以及准入控制请求的流转路径:
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