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}'
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"
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 解析失败。