3、安装与部署:使用Helm安装Kyverno、配置高可用、验证安装状态
本章聚焦于在生产环境中使用 Helm 包管理器安装 Kyverno 策略引擎,并配置高可用(HA)模式以确保策略评估的连续性。安装完成后,将通过多种方式验证集群状态与组件健康度。
3.1 环境准备与 Helm 仓库配置
在安装 Kyverno 之前,请确保 Kubernetes 集群满足以下最低要求:
| 资源/组件 | 最低要求 | 生产推荐 |
|---|---|---|
| Kubernetes 版本 | v1.24+ | v1.28+ |
| 集群节点数 | 1(单机测试) | 3+(高可用) |
| Helm 版本 | v3.8+ | v3.14+ |
| 存储后端 | 无(默认使用 ConfigMap) | etcd 或外部数据库 |
首先添加 Kyverno 官方 Helm 仓库并更新索引:
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
最佳实践:建议在专用的
kyverno 命名空间中部署 Kyverno,便于资源隔离与权限管理。后续所有操作均默认使用该命名空间。
3.2 使用 Helm 安装 Kyverno(高可用模式)
高可用部署需要至少 2 个副本,并启用 leader-election 机制。以下命令展示了生产级安装配置:
helm install kyverno kyverno/kyverno \
--namespace kyverno \
--create-namespace \
--set replicaCount=2 \
--set leaderElection.enabled=true \
--set webhookTimeoutSeconds=10 \
--set resources.requests.cpu=200m \
--set resources.requests.memory=256Mi \
--set resources.limits.cpu=500m \
--set resources.limits.memory=512Mi
关键参数说明:
| 参数路径 | 值 | 作用 |
|---|---|---|
replicaCount |
2 | Pod 副本数,实现故障转移 |
leaderElection.enabled |
true | 启用领导者选举,避免多副本冲突 |
webhookTimeoutSeconds |
10 | Webhook 调用超时,防止阻塞 API Server |
resources.requests |
200m/256Mi | 基础资源保障,避免 OOMKill |
注意:如果集群规模较大(节点数 > 50),建议将
replicaCount 提升至 3,并配置 Pod 反亲和性,确保副本分布在不同的可用区。
3.3 高可用架构示意
下图展示了 Kyverno 在高可用模式下的组件交互与流量路径:
3.4 验证安装状态
安装完成后,执行以下步骤验证 Kyverno 是否正常运行:
3.4.1 检查 Pod 状态
kubectl get pods -n kyverno -o wide
预期输出应显示 2 个 Running 状态的 Pod,且分布在不同的 Worker 节点上:
NAME READY STATUS RESTARTS AGE NODE
kyverno-6f8b9c7d4c-abc12 1/1 Running 0 2m node-1
kyverno-6f8b9c7d4c-xyz78 1/1 Running 0 2m node-2
3.4.2 验证 Webhook 注册
kubectl get mutatingwebhookconfiguration -l webhook.kyverno.io/managed-by=kyverno
kubectl get validatingwebhookconfiguration -l webhook.kyverno.io/managed-by=kyverno
应至少返回 2 条 Webhook 配置记录,分别对应 Mutating 和 Validating 准入控制。
3.4.3 检查 Service 与 Endpoint
kubectl get svc -n kyverno
kubectl get endpoints -n kyverno
Service kyverno-svc 的 Endpoint 应包含两个 Pod 的 IP 地址,表明负载均衡已生效。
3.4.4 测试策略执行
部署一个简单的测试策略,验证 Kyverno 能否正确拦截或修改资源:
cat <<EOF | kubectl apply -f -
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-ns-labels
spec:
validationFailureAction: Audit
rules:
- name: check-labels
match:
any:
- resources:
kinds:
- Namespace
validate:
message: "Namespace must have label 'purpose'"
pattern:
metadata:
labels:
purpose: "?*"
EOF
创建测试命名空间并检查策略报告:
kubectl create ns test-ns
kubectl get policyreport -A | grep require-ns-labels
验证结果:如果 PolicyReport 中显示
fail: 1,说明 Kyverno 成功检测到缺少标签的命名空间,安装验证通过。
3.5 常见安装问题与排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
Pod 一直处于 Pending 状态 |
资源不足或节点污点 | 检查节点资源,添加 tolerations 或扩容节点 |
| Webhook 注册失败 | 证书签发异常或网络策略限制 | 查看 kyverno Pod 日志,检查 cert-manager 状态 |
| Leader Election 冲突 | 副本数过多或租约时间过短 | 调整 leaderElection.leaseDuration 为 15s |
| 策略不生效 | Webhook 未正确指向 Service | 执行 kubectl describe mutatingwebhookconfiguration 检查 clientConfig |