2. 环境准备:Kubernetes集群搭建、Kyverno安装与配置、Prometheus与Grafana部署

本章是课程的基础设施搭建环节。你将依次完成:一个功能完整的Kubernetes集群、Kyverno策略引擎、以及Prometheus+Grafana监控栈的部署。所有操作均面向生产级配置,并为后续“缓存命中巡检”实验提供稳定的运行环境。

2.1 整体环境架构

下图展示了三个核心组件在集群内的部署关系与数据流向。Kyverno作为动态准入控制器拦截资源请求,Prometheus采集Kyverno指标,Grafana负责可视化巡检结果。

环境整体架构:组件部署与数据流 Kubernetes 集群边界 Control Plane kube-apiserver etcd kube-controller-manager Kyverno 准入控制器 策略引擎 缓存层 Prometheus 指标采集 告警规则 TSDB Grafana 仪表盘 / 巡检视图 准入请求 指标暴露 数据源 说明:Kyverno 以 Deployment 形式运行

2.2 Kubernetes集群搭建

本课程使用 kubeadm 部署一个 1 控制平面 + 2 工作节点的集群。最低要求:控制平面 2 核 4G,工作节点 2 核 4G,操作系统 Ubuntu 22.04 LTS。

2.2.1 节点规格与角色

主机名 角色 vCPU 内存 磁盘
master-1 控制平面 2 4 GB 40 GB
node-1 工作节点 2 4 GB 40 GB
node-2 工作节点 2 4 GB 40 GB

2.2.2 部署步骤(关键命令)

  1. 所有节点:安装容器运行时(containerd)、kubelet、kubeadm、kubectl,并执行 kubeadm init 前的系统配置。
  2. 控制平面:执行 kubeadm init --pod-network-cidr=10.244.0.0/16,初始化集群。
  3. 所有节点:安装 CNI 插件(本课程使用 Flannel):kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml。
  4. 工作节点:执行 kubeadm join 命令加入集群。
验证集群状态: 使用 kubectl get nodes -o wide 确认所有节点处于 Ready 状态,且版本一致。

2.3 Kyverno安装与配置

Kyverno 通过 Helm Chart 部署到 kyverno 命名空间。本课程使用 Kyverno v1.12+,支持缓存命中指标暴露。

2.3.1 安装步骤

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

# 创建命名空间并安装
kubectl create namespace kyverno
helm install kyverno kyverno/kyverno \
  --namespace kyverno \
  --set features.policyReports.enabled=true \
  --set admissionController.metrics.enabled=true \
  --set admissionController.metrics.serviceMonitor.enabled=true

2.3.2 关键配置参数

参数 默认值 说明
admissionController.metrics.enabled false 启用 Prometheus 指标暴露,必须设为 true
admissionController.metrics.serviceMonitor.enabled false 自动创建 ServiceMonitor 供 Prometheus Operator 发现
features.policyReports.enabled true 启用策略报告生成,便于巡检审计
admissionController.replicas 1 生产环境建议设为 2 或 3 保证高可用

2.3.3 验证安装

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

# 检查 Kyverno 是否正常响应
kubectl get validatingwebhookconfigurations -l app.kubernetes.io/name=kyverno
注意: 如果集群中已存在其他准入控制器(如 OPA Gatekeeper),请确保 Kyverno 的 webhook 配置不会与之冲突。建议在独立的命名空间部署,并检查 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 的 objectSelector 规则。

2.4 Prometheus与Grafana部署

本课程使用 kube-prometheus-stack Helm Chart 一键部署 Prometheus、Alertmanager 和 Grafana。该 Chart 会自动创建 ServiceMonitor 并抓取 Kyverno 指标。

2.4.1 部署步骤

# 添加 Prometheus 社区 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 创建监控命名空间
kubectl create namespace monitoring

# 安装 kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set grafana.adminPassword=admin123 \
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false

2.4.2 关键参数说明

参数 值 作用
grafana.adminPassword admin123 Grafana 管理员密码(生产环境请修改)
prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues false 允许 Prometheus 发现非 Helm 安装的 ServiceMonitor(如 Kyverno 创建的)

2.4.3 验证监控链路

  1. 确认 Prometheus 目标中已包含 Kyverno:访问 Prometheus UI(kubectl port-forward -n monitoring svc/prometheus-operated 9090),在 Targets 页面搜索 kyverno。
  2. 确认 Grafana 可访问:kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80,浏览器打开 http://localhost:3000,使用 admin / admin123 登录。
  3. 在 Grafana 中导入 Kyverno 官方仪表盘(ID: 17626),验证缓存命中相关指标是否正常显示。
监控数据流:从 Kyverno 到 Grafana Kyverno Pod :8000/metrics 缓存命中指标 Service kyverno-svc 端口 8000 ServiceMonitor kyverno-svc-monitor 标签选择器 Prometheus 抓取 / 存储 / 告警 Grafana 仪表盘 / 巡检视图 说明:ServiceMonitor 通过 标签匹配 Service,自动发现 Kyverno 的 metrics 端点

2.5 环境验证清单

完成上述部署后,请逐项确认以下检查点,确保环境就绪:

检查项 验证命令 / 方法 预期结果
集群节点状态 kubectl get nodes 所有节点 Ready
Kyverno Pod 运行 kubectl get pods -n kyverno 所有 Pod Running
Kyverno 指标端点 kubectl port-forward -n kyverno svc/kyverno-svc 8000:8000 后访问 localhost:8000/metrics 返回包含 kyverno_admission_requests_total 等指标
Prometheus 目标 Prometheus UI → Status → Targets Kyverno 目标状态为 UP
Grafana 数据源 Grafana UI → Configuration → Data Sources Prometheus 数据源状态 Default & Healthy
环境就绪标志: 当你在 Grafana 中看到 Kyverno 的 kyverno_admission_requests_total 和 kyverno_admission_request_duration_seconds 等指标随时间变化时,说明整个监控链路已完全打通,可以进入下一章的策略开发环节。