3. 安装与部署:使用 Helm 安装 Kyverno、配置高可用、验证部署状态

本章聚焦于生产级 Kyverno 部署的完整流程。你将掌握使用 Helm 图表安装 Kyverno、配置高可用模式以及验证集群状态的核心技能。正确的安装与配置是后续策略生效的基础,尤其在高风险变更控制场景中,部署的稳定性直接决定安全基线的可靠性。

3.1 环境准备与 Helm 仓库配置

在安装 Kyverno 之前,请确保你的 Kubernetes 集群满足以下最低要求:

组件 最低版本 说明
Kubernetes v1.26+ 支持 Validating/MutatingAdmissionPolicy
Helm v3.8+ 支持 OCI 仓库与依赖管理
集群资源 4 vCPU / 8 GB 内存 高可用模式建议 3 节点
存储类 支持 ReadWriteMany 用于 Webhook 证书持久化(可选)

添加 Kyverno 官方 Helm 仓库并更新索引:

helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
生产建议: 始终使用 Helm 仓库的稳定版本标签(如 v3.2.x),避免使用 latest 或 main 分支。建议在测试环境中先验证版本兼容性。

3.2 高可用部署配置

Kyverno 的高可用模式通过多副本部署和领导者选举实现。以下配置确保策略评估在任意节点故障时仍能持续运行。

创建自定义 values 文件 kyverno-ha-values.yaml:

replicaCount: 3

podDisruptionBudget:
  enabled: true
  minAvailable: 2

highAvailability:
  enabled: true
  replicas: 3

webhooks:
  replicas: 3

features:
  reports:
    enabled: true
    replicas: 3

config:
  resourceFilters:
    - '[Event,*,*]'
    - '[*,kube-system,*]'
    - '[*,kube-public,*]'
    - '[*,kube-node-lease,*]'

extraArgs:
  - --autogenInternals=true
  - --webhookTimeout=10
关键参数解析:
  • replicaCount: 3 — 核心控制器副本数,保证领导者选举容错
  • podDisruptionBudget.minAvailable: 2 — 确保至少 2 个 Pod 可用
  • webhooks.replicas: 3 — Webhook 组件独立扩展,避免单点
  • features.reports.replicas: 3 — 报告生成器高可用,用于审计日志

执行安装命令:

helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --values kyverno-ha-values.yaml \
  --version 3.2.6

3.3 部署架构与组件关系

下图展示了 Kyverno 高可用部署的核心组件及其交互关系:

Kyverno 高可用部署架构 Kubernetes API Server Webhook Pod 1 Webhook Pod 2 Webhook Pod 3 Controller Pod 1 Controller Pod 2 Controller Pod 3 Report Pod 1 Report Pod 2 Report Pod 3 说明: Webhook 层拦截准入请求,Controller 层执行策略评估,Report 层生成审计报告。 所有组件均采用领导者选举机制,任意 Pod 故障不影响整体服务。

3.4 验证部署状态

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

  1. 检查命名空间与 Pod 状态
kubectl get pods -n kyverno -o wide

预期输出应显示 3 个 Webhook Pod、3 个 Controller Pod 和 3 个 Report Pod,全部处于 Running 状态。

  1. 验证 Webhook 注册
kubectl get validatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno
kubectl get mutatingwebhookconfigurations -l app.kubernetes.io/instance=kyverno

应返回至少 2 个 Webhook 配置,名称包含 kyverno-resource-validating-webhook 和 kyverno-resource-mutating-webhook。

  1. 测试策略生效

创建一个简单的测试策略验证准入控制是否正常工作:

cat <

尝试创建一个没有 team 标签的命名空间,应被拒绝:

kubectl create ns test-no-label

预期返回错误:Error from server: admission webhook "validate.kyverno.svc" denied the request: Namespace must have label 'team'

常见问题: 如果 Webhook 未生效,请检查 kyverno-webhook 服务的 Endpoints 是否正常。使用 kubectl get endpoints -n kyverno kyverno-webhook 确认所有 Pod IP 已注册。若 Endpoints 为空,可能是网络策略或 CNI 插件阻止了通信。

3.5 高可用验证与故障模拟

为了验证高可用配置的有效性,建议执行以下故障模拟:

测试场景 操作步骤 预期结果
单 Pod 故障 kubectl delete pod -n kyverno <pod-name> 新 Pod 自动重建,策略评估无中断
节点故障 封锁一个节点:kubectl cordon <node> Pod 迁移到其他节点,Webhook 持续响应
领导者选举 查看 Controller 日志:kubectl logs -n kyverno -l app.kubernetes.io/name=kyverno --tail=50 日志显示领导者选举事件,无重复处理

下图展示了高可用模式下领导者选举的流程:

Kyverno 领导者选举流程 Controller Pod 1 (候选者) Controller Pod 2 (候选者) Controller Pod 3 (候选者) 领导者选举(基于 ConfigMap Lease) Controller Pod 2 (领导者) 领导者持有 Lease 锁,定期续约;其他 Pod 监听 Lease 变化,在领导者故障时自动发起新选举。

3.6 升级与回滚策略

在生产环境中,升级 Kyverno 需要遵循以下步骤以确保策略连续性:

  1. 备份当前配置
kubectl get clusterpolicy -o yaml > cluster-policies-backup.yaml
helm get values kyverno -n kyverno > values-backup.yaml
  1. 执行升级
helm upgrade kyverno kyverno/kyverno \
  --namespace kyverno \
  --values kyverno-ha-values.yaml \
  --version 3.3.0
  1. 回滚操作
helm rollback kyverno 1 -n kyverno
升级注意事项:
  • 升级前检查 Changelog 中的 API 变更,避免策略语法不兼容
  • 先在非生产环境验证升级流程
  • 升级期间 Webhook 可能短暂不可用,建议在维护窗口执行
  • 保留至少 2 个历史版本:helm history kyverno -n kyverno

3.7 监控与告警配置

为保障 Kyverno 高可用部署的持续健康,建议集成以下监控指标:

指标名称 类型 告警阈值 说明
kyverno_admission_requests_total Counter 突增 > 500% 检测异常流量
kyverno_admission_webhook_latency_seconds Histogram P99 > 5s Webhook 响应延迟
kyverno_controller_leader_election_status Gauge 值 != 1 领导者选举异常
kyverno_policy_rule_info_total Gauge 突降 > 50% 策略规则丢失

使用 Prometheus Operator 的 ServiceMonitor 自动发现 Kyverno 指标端点:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kyverno-monitor
  namespace: kyverno
spec:
  selector:
    matchLabels:
      app.kubernetes.io/instance: kyverno
  endpoints:
  - port: metrics
    interval: 30s
生产检查清单:
  • 确认所有 Pod 的 ready 状态为 1/1
  • 验证 Webhook 证书未过期:kubectl get secret -n kyverno kyverno-webhook-certs -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -dates
  • 测试策略执行延迟是否在预期范围内
  • 确认日志无持续错误:kubectl logs -n kyverno -l app.kubernetes.io/name=kyverno --tail=100 | grep -i error

至此,你已经完成了 Kyverno 的高可用部署与验证。下一阶段将进入策略编写与安全基线覆盖的实战内容。