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 在高可用模式下的组件交互与流量路径:

Kyverno 高可用部署架构 Kubernetes API Server Mutating / Validating Webhook Kyverno Pod 1 (Leader) 副本 1 · 策略评估 Kyverno Pod 2 (Follower) 副本 2 · 热备 Leader Election 策略存储 (ConfigMap / etcd) 说明: Leader 负责处理所有 Webhook 请求;Follower 通过 Leader Election 机制实时同步状态, 当 Leader 故障时自动接管,确保策略评估不中断。

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