3. Kyverno 安装与部署:Helm 安装方式、YAML 直接部署、配置 TLS 证书、高可用部署模式

Kyverno 作为 Kubernetes 原生的策略引擎,其部署方式直接影响集群安全基线的生效速度与运维复杂度。本章覆盖四种核心部署场景:Helm 安装(生产推荐)、YAML 直接部署(离线/快速验证)、TLS 证书配置(Webhook 安全加固)以及高可用部署模式(控制面容灾)。

前置条件:确保集群版本 ≥ 1.23,已安装 kubectl 并具备 cluster-admin 权限。Helm 安装方式要求 Helm ≥ 3.8。

3.1 Helm 安装方式(生产推荐)

Helm Chart 是 Kyverno 官方推荐的部署方式,支持参数化配置、版本回滚和依赖管理。以下步骤适用于大多数生产环境。

3.1.1 添加 Helm 仓库并安装

# 添加 Kyverno Helm 仓库
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# 创建命名空间
kubectl create namespace kyverno

# 安装 Kyverno(基础配置)
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set admissionController.replicas=2 \
  --set backgroundController.replicas=2 \
  --set cleanupController.replicas=1 \
  --set reportsController.replicas=1

3.1.2 常用安装参数对照表

参数路径 默认值 生产推荐值 说明
admissionController.replicas 1 2-3 准入控制器副本数,影响策略执行吞吐
backgroundController.replicas 1 2 后台扫描控制器,处理现有资源审计
cleanupController.replicas 1 1 清理控制器,管理资源生命周期
reportsController.replicas 1 1 报告控制器,生成策略执行报告
webhookTimeoutSeconds 10 15 Webhook 超时时间,复杂策略建议增大
config.resourceFilters [Node, ...] 按需调整 排除系统组件的资源过滤器

3.1.3 验证安装状态

# 检查 Pod 运行状态
kubectl get pods -n kyverno -o wide

# 检查 Webhook 配置
kubectl get validatingwebhookconfigurations -l webhook.kyverno.io/managed-by=kyverno
kubectl get mutatingwebhookconfigurations -l webhook.kyverno.io/managed-by=kyverno

# 查看 Kyverno 版本
kubectl get deployment -n kyverno kyverno-admission-controller -o jsonpath='{.spec.template.spec.containers[0].image}'
Kyverno Helm 安装组件架构图 Kubernetes 集群 准入控制器 admission-controller 后台控制器 background-controller 清理控制器 cleanup-controller 报告控制器 reports-controller 共享 ConfigMap / Webhook 配置 / 策略存储 Helm 安装自动创建 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 副本数 ≥ 2 时启用 PodAntiAffinity 实现高可用

3.2 YAML 直接部署(离线/快速验证)

当集群无法访问外部 Helm 仓库,或需要快速验证策略功能时,可使用 YAML 直接部署。Kyverno 官方提供聚合的 install.yaml 文件。

3.2.1 下载并部署

# 下载最新稳定版 YAML
wget https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml

# 检查 YAML 内容(确认镜像地址、命名空间)
head -50 install.yaml

# 部署到集群
kubectl apply -f install.yaml

# 验证部署
kubectl get pods -n kyverno -w

3.2.2 Helm 与 YAML 部署对比

对比维度 Helm 安装 YAML 直接部署
配置灵活性 高,支持 values.yaml 覆盖 低,需手动修改 YAML
版本管理 支持 helm rollback 需 kubectl rollout undo
离线部署 需提前导出 Chart 直接 apply 即可
生产推荐度 ★★★★★ ★★☆☆☆
快速验证 ★★☆☆☆ ★★★★★
安全注意:YAML 直接部署默认使用 ClusterRole 和 ClusterRoleBinding,权限范围覆盖整个集群。部署前务必审查 RBAC 规则,避免过度授权。

3.3 配置 TLS 证书(Webhook 安全加固)

Kyverno 通过 Admission Webhook 拦截资源请求,Webhook 必须使用 TLS 加密通信。默认安装会自签证书,生产环境建议使用受信任的 CA 签发证书。

3.3.1 证书配置方式对比

方式 证书来源 自动轮换 适用场景
自签证书(默认) Kyverno 内置 CA 是(30 天) 开发测试、快速部署
cert-manager Let's Encrypt / 内部 CA 是(自动续期) 生产环境,已有 cert-manager
手动注入 Secret 企业 CA 签发 否(需手动更新) 合规要求严格的场景

3.3.2 使用 cert-manager 配置 TLS

# 1. 安装 cert-manager(如未安装)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.0/cert-manager.yaml

# 2. 创建 Issuer(以自签 CA 为例)
cat <

3.3.3 验证证书状态

# 查看 Secret 中的证书
kubectl get secret kyverno-webhook-cert -n kyverno -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout | grep -E "Subject:|Not Before|Not After"

# 检查 Webhook 是否使用新证书
kubectl get validatingwebhookconfiguration kyverno-resource-validating-webhook-cfg -o yaml | grep -A5 "clientConfig"
TLS 证书配置流程 cert-manager Issuer / ClusterIssuer Certificate 资源 DNS Names / 有效期 Secret tls.crt / tls.key Kyverno Pod 挂载 Secret 卷 Webhook 配置 CA Bundle 更新 证书自动轮换机制 1. cert-manager 监控 Certificate 到期时间 2. 到期前自动签发新证书并更新 Secret 3. Kyverno 监听 Secret 变化自动重载

3.4 高可用部署模式(控制面容灾)

Kyverno 作为集群控制面的关键组件,必须保证在节点故障、升级或网络分区时持续可用。高可用部署涉及多副本、Pod 反亲和、资源配额和 PDB 配置。

3.4.1 高可用部署核心配置

# Helm values-ha.yaml 示例
admissionController:
  replicas: 3
  podDisruptionBudget:
    minAvailable: 2
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app.kubernetes.io/name
              operator: In
              values:
              - kyverno
          topologyKey: kubernetes.io/hostname
  resources:
    requests:
      cpu: 500m
      memory: 512Mi
    limits:
      cpu: 1000m
      memory: 1Gi

backgroundController:
  replicas: 2
  podDisruptionBudget:
    minAvailable: 1

cleanupController:
  replicas: 1

reportsController:
  replicas: 1

# 安装高可用配置
helm upgrade kyverno kyverno/kyverno \
  --namespace kyverno \
  -f values-ha.yaml

3.4.2 高可用部署检查清单

检查项 推荐配置 验证命令
准入控制器副本数 ≥ 3 kubectl get deploy -n kyverno kyverno-admission-controller
Pod 反亲和 preferredAntiAffinity kubectl get pod -n kyverno -o wide 检查分布
PDB 配置 minAvailable: 2 kubectl get pdb -n kyverno
资源请求/限制 CPU 500m/1000m, Mem 512Mi/1Gi kubectl describe pod -n kyverno
HPA(可选) CPU > 70% 时扩容 kubectl get hpa -n kyverno
多可用区分布 topologyKey: topology.kubernetes.io/zone 检查 Pod 所在节点/可用区

3.4.3 高可用架构说明

  • 多副本准入控制器:所有副本同时接收 Webhook 请求,Kubernetes API Server 自动负载均衡。任一副本故障不影响准入判断。
  • Pod 反亲和:确保同一组件的 Pod 调度到不同节点,避免单点故障。跨可用区部署时使用 topology.kubernetes.io/zone。
  • PodDisruptionBudget:保证在节点维护或升级时,至少保留指定数量的可用副本,防止 Webhook 中断。
  • 资源隔离:为每个控制器设置独立的资源配额,避免后台扫描任务抢占准入控制器的 CPU 和内存。
生产建议:在超过 50 个工作节点的集群中,建议将 admissionController.replicas 设置为 3-5 个,并启用 HPA 以应对突发流量。后台控制器副本数保持 2 个即可,避免过度消耗集群资源。

3.5 部署后安全验证

完成部署后,必须执行以下安全验证步骤,确保 Kyverno 正确运行且 Webhook 通信加密。

# 1. 验证 Webhook 是否正常响应
kubectl run test-pod --image=nginx --restart=Never --dry-run=server

# 2. 检查 TLS 证书是否有效
kubectl get validatingwebhookconfiguration -o yaml | grep -A10 "clientConfig"
# 确认 caBundle 字段非空且与 Secret 中的 CA 一致

# 3. 测试策略执行
cat <
快速排障:如果 Webhook 拒绝所有请求,检查 kubectl logs -n kyverno deployment/kyverno-admission-controller 中的 TLS 握手错误。常见原因包括证书过期、caBundle 不匹配或 DNS 解析失败。