3、安装与配置:使用Helm安装Kyverno、配置高可用、TLS证书管理、日志与监控集成

本章聚焦于在生产环境中部署Kyverno策略引擎。我们将使用Helm作为包管理工具,完成从基础安装到高可用配置、TLS证书管理以及日志与监控集成的全流程。正确的安装与配置是策略即代码(Policy-as-Code)落地的基石,直接影响策略执行引擎的稳定性与安全性。

3.1 使用Helm安装Kyverno

Helm是Kubernetes生态中最流行的包管理工具,Kyverno官方维护的Helm Chart提供了灵活的配置选项,支持从开发环境到生产集群的平滑部署。

3.1.1 前置条件

  • Kubernetes集群:版本 ≥ 1.23,建议使用1.27及以上版本以获得最佳兼容性。
  • Helm CLI:版本 ≥ 3.8.0。
  • 集群管理员权限:Kyverno需要创建ClusterRole、ClusterRoleBinding、ValidatingWebhookConfiguration等集群级资源。
  • 存储类(StorageClass):如果启用高可用模式,需要默认StorageClass支持动态PV供应。

3.1.2 添加Helm仓库与安装

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

# 创建命名空间
kubectl create namespace kyverno

# 使用Helm安装Kyverno(基础单副本模式)
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --version v3.2.0 \
  --set replicaCount=1 \
  --set serviceMonitor.enabled=false
版本锁定建议: 生产环境中务必使用 --version 参数锁定Chart版本,避免自动升级引入不兼容变更。建议将Chart文件下载到本地Git仓库进行版本管理。

3.1.3 验证安装

# 检查Pod状态
kubectl get pods -n kyverno -l app.kubernetes.io/name=kyverno

# 检查Webhook配置是否就绪
kubectl get validatingwebhookconfigurations -l webhook.kyverno.io/managed-by=kyverno

# 查看Kyverno版本与健康状态
kubectl -n kyverno logs deployment/kyverno -c kyverno | grep "Starting Kyverno"

3.2 配置高可用(HA)模式

在生产环境中,单副本的Kyverno存在单点故障风险。高可用模式通过多副本部署、Leader选举和共享存储实现策略执行的连续性。

3.2.1 HA架构核心组件

高可用部署关键参数:

  • replicaCount:副本数,建议设置为3(奇数节点有利于Leader选举)。
  • leaderElection.enabled:启用Leader选举,确保同一时间只有一个实例处理Webhook请求。
  • persistence.enabled:启用持久化存储,用于存储策略变更历史与中间状态。
  • affinity.podAntiAffinity:配置Pod反亲和性,确保副本分布在不同节点。
# 高可用模式安装示例
helm upgrade --install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set replicaCount=3 \
  --set leaderElection.enabled=true \
  --set leaderElection.renewDeadline=15s \
  --set leaderElection.retryPeriod=5s \
  --set persistence.enabled=true \
  --set persistence.size=10Gi \
  --set affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].topologyKey=kubernetes.io/hostname

3.2.2 HA架构流程图

Kyverno 高可用架构(Leader Election) Kubernetes API Server Admission Review Kyverno Pod-1 (Leader) Kyverno Pod-2 (Follower) Kyverno Pod-3 (Follower) 仅 Leader 处理 共享持久卷 (PVC) - 策略状态 etcd (Leader Election) 说明:Leader 负责处理 Webhook 请求并写入策略状态;Follower 处于待命状态,Leader 故障时通过 etcd 选举新 Leader。

3.3 TLS证书管理

Kyverno作为动态准入控制(Admission Controller),其Webhook必须通过TLS与API Server进行安全通信。默认安装会自动生成自签名证书,但生产环境建议使用受信任的CA签发证书或集成cert-manager进行自动化管理。

3.3.1 证书管理方式对比

方式 适用场景 优点 缺点
自动生成(默认) 开发/测试环境 零配置,开箱即用 证书未受信任,浏览器/工具会报错
自定义CA证书 内部企业环境 可被内部PKI信任,可控性强 需要手动管理证书轮换
cert-manager集成 生产环境(推荐) 自动化签发与续期,支持ACME/自签名CA 需要额外部署cert-manager

3.3.2 使用cert-manager自动化TLS

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

# 2. 创建自签名 ClusterIssuer
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: kyverno-selfsigned-issuer
spec:
  selfSigned: {}
EOF

# 3. 使用Helm安装Kyverno并配置cert-manager集成
helm upgrade --install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set replicaCount=3 \
  --set webhookCert.certManager.enabled=true \
  --set webhookCert.certManager.issuerName=kyverno-selfsigned-issuer \
  --set webhookCert.certManager.issuerKind=ClusterIssuer \
  --set webhookCert.certManager.issuerGroup=cert-manager.io
证书轮换注意事项: 当TLS证书更新后,需要重启Kyverno Pod以加载新证书,或者配置cert-manager的 renewBefore 策略提前触发轮换。建议设置 renewBefore: 720h(30天)确保证书在过期前完成更新。

3.4 日志与监控集成

策略引擎的可观测性是运维的核心。Kyverno原生支持结构化日志输出,并提供了Prometheus指标接口,可以无缝集成到现有的监控体系中。

3.4.1 日志配置

Kyverno使用 zap 日志库,支持多种日志级别和输出格式。推荐在生产环境中使用JSON格式输出,便于日志收集系统(如Elasticsearch、Loki)解析。

# 配置结构化JSON日志与级别
helm upgrade --install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set logLevel=4 \
  --set logFormat=json \
  --set logOutput=stdout
日志级别 数值 说明
Debug 4 最详细,包含策略引擎内部决策过程,用于问题排查
Info 2 默认级别,记录策略执行结果、Webhook请求摘要
Warn 1 记录配置异常、策略匹配失败等警告信息
Error 0 仅记录严重错误,如Webhook调用失败、证书异常

3.4.2 Prometheus监控集成

Kyverno暴露了标准的Prometheus指标端点(默认端口8000),可以采集策略执行次数、Webhook延迟、策略变更事件等关键指标。

# 启用ServiceMonitor(需要已安装Prometheus Operator)
helm upgrade --install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set serviceMonitor.enabled=true \
  --set serviceMonitor.namespace=monitoring \
  --set serviceMonitor.interval=30s \
  --set metrics.enabled=true \
  --set metrics.port=8000

3.4.3 关键监控指标

指标名称 类型 说明
kyverno_policy_rule_info_total Counter 策略规则执行总次数,按策略名称、规则名称、执行结果(pass/fail/error)标签区分
kyverno_admission_request_duration_seconds Histogram Webhook准入请求处理延迟,用于监控策略执行性能
kyverno_policy_changes_total Counter 策略创建、更新、删除事件计数
kyverno_leader_election_status Gauge 当前实例是否为Leader(1为Leader,0为Follower)

3.4.4 监控架构图

Kyverno 日志与监控集成架构 Kyverno Pod 集群 3副本 HA 模式 JSON 结构化日志 Prometheus 指标 Fluentd / Logstash Elasticsearch / Loki Kibana / Grafana Prometheus Server Alertmanager Grafana 仪表盘 建议:日志保留期 ≥ 30天;Prometheus 指标保留期 ≥ 15天;配置告警规则:策略执行失败率 > 1% 时触发告警。

3.5 配置验证与健康检查

完成安装与配置后,建议执行以下验证步骤,确保所有组件正常运行:

  1. Pod健康检查:确认所有Kyverno Pod处于 Running 状态,且 READY 列为 1/1。
  2. Webhook可达性测试:创建一个测试Namespace并添加标签,观察Kyverno是否能够正确响应Admission Review请求。
  3. 证书有效性检查:使用 openssl s_client 或 curl 验证Webhook端点的TLS证书是否由预期CA签发。
  4. 指标端点测试:通过 kubectl port-forward 暴露Metrics端口,访问 /metrics 端点确认指标数据正常输出。
  5. 日志采样:查看最近100条日志,确认无 ERROR 级别异常,且JSON格式正确可解析。
# 快速健康检查命令集
echo "=== Pod状态 ==="
kubectl get pods -n kyverno -o wide

echo "=== Webhook配置 ==="
kubectl get validatingwebhookconfigurations -l webhook.kyverno.io/managed-by=kyverno -o yaml | grep -A5 "clientConfig"

echo "=== 指标端点测试 ==="
kubectl -n kyverno port-forward svc/kyverno-svc-metrics 8000:8000 &
curl -s http://localhost:8000/metrics | head -20
kill %1
生产环境基线配置清单:
  • 副本数 ≥ 3,启用Leader Election与Pod反亲和性。
  • 持久卷大小 ≥ 10Gi,存储类支持自动扩容。
  • TLS证书使用cert-manager管理,续期周期 ≤ 30天。
  • 日志级别设置为 Info(2),输出格式为 JSON。
  • 启用ServiceMonitor,指标采集间隔 ≤ 30s。
  • 配置Grafana仪表盘,导入Kyverno官方Dashboard ID(如 #14205)。