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架构流程图
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 监控架构图
3.5 配置验证与健康检查
完成安装与配置后,建议执行以下验证步骤,确保所有组件正常运行:
- Pod健康检查:确认所有Kyverno Pod处于
Running状态,且READY列为1/1。 - Webhook可达性测试:创建一个测试Namespace并添加标签,观察Kyverno是否能够正确响应Admission Review请求。
- 证书有效性检查:使用
openssl s_client或curl验证Webhook端点的TLS证书是否由预期CA签发。 - 指标端点测试:通过
kubectl port-forward暴露Metrics端口,访问/metrics端点确认指标数据正常输出。 - 日志采样:查看最近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)。