监控部署与看板(Prometheus + Grafana)
CubeStudio 的监控体系基于 prometheus-operator 搭建,组件包含:
- prometheus-operator:以 CRD 方式管理 Prometheus/Alertmanager 实例
- Alertmanager:报警分发
- node-exporter:采集节点(机器)层指标
- kube-state-metrics:采集 K8s 对象状态指标
- ServiceMonitor:声明 Prometheus 的采集目标
- DCGM exporter:采集 GPU 指标
- prometheus-adapter:把 Prometheus 指标暴露为 K8s custom metrics(供 HPA 使用)
- Grafana:监控看板展示
所有部署文件位于 install/kubernetes/prometheus/ 目录下。下文所有 kubectl apply -f ./xxx 命令均以该目录为工作目录,执行前请先:
cd install/kubernetes/prometheus
注意:仓库中报警相关目录名为
alertmanater(拼写如此),下文命令保持与实际目录一致。
1. 前置准备
为需要部署监控组件(node-exporter、pushgateway 等)的机器打 label。监控组件通过 monitoring=true 的节点亲和性进行调度,机器准备/打 label 的相关说明见 02-部署安装(集群准备)。
kubectl label node xxx monitoring=true
创建命名空间:
kubectl create ns monitoring
2. 部署 prometheus-operator
kubectl apply -f ./operator/operator-rbac.yml
kubectl apply -f ./operator/operator-dp.yml
kubectl apply -f ./operator/operator-crd.yml
3. Alertmanager、node-exporter、kube-state-metrics
创建 Alertmanager 配置(定义报警方式)、node-exporter(节点指标)、kube-state-metrics(K8s 对象指标):
kubectl apply -f ./alertmanater/alertmanager-main-sa.yml
kubectl apply -f ./alertmanater/alertmanager-main-secret.yml
kubectl apply -f ./alertmanater/alertmanager-main-svc.yml
kubectl apply -f ./alertmanater/alertmanager-main.yml
kubectl apply -f ./node-exporter/node-exporter-sa.yml
kubectl apply -f ./node-exporter/node-exporter-rbac.yml
kubectl apply -f ./node-exporter/node-exporter-svc.yml
kubectl apply -f ./node-exporter/node-exporter-ds.yml
kubectl apply -f ./kube-state-metrics/kube-state-metrics-sa.yml
kubectl apply -f ./kube-state-metrics/kube-state-metrics-rbac.yml
kubectl apply -f ./kube-state-metrics/kube-state-metrics-svc.yml
kubectl apply -f ./kube-state-metrics/kube-state-metrics-dp.yml
配置报警接收方(邮件 / 企业微信)
上面 apply 的 alertmanager-main-secret.yml 里存的是 Alertmanager 配置(base64 编码)。要配置邮件或企业微信报警接收方,用仓库 install/kubernetes/prometheus/alertmanater/ 下的两个脚本生成这段 base64:
- 邮件:编辑
make-alert-email-config.py里的config——全局smtp_smarthost/smtp_from/smtp_auth_username/smtp_auth_password,以及receivers下email_configs的收件人to;运行python make-alert-email-config.py,把打印出的 base64 串填入alertmanager-main-secret.yml的 secret data,再kubectl apply一次。 - 企业微信 / webhook:
make-alert-wechat-config.py同理,但用的是webhook_configs(url指向企业微信机器人或自建的报警转发 webhook);改好url后运行、取 base64、填 secret、apply。
route.routes里的match/match_re(如按namespace匹配)决定哪些告警走哪个 receiver;inhibit_rules做告警抑制避免重复告警。改完重新 apply secret 后 Alertmanager 会重载配置。
4. 部署 Grafana
按照自己的分布式存储创建 PV,再部署 Grafana 相关资源(定义数据源、显示方式):
# 按照自己的分布式存储创建pv
kubectl apply -f ./grafana/pv-pvc-hostpath.yml
kubectl apply -f ./grafana/grafana-sa.yml
kubectl apply -f ./grafana/grafana-source.yml
kubectl apply -f ./grafana/grafana-datasources.yml
kubectl apply -f ./grafana/grafana-admin-secret.yml
kubectl apply -f ./grafana/grafana-svc.yml
创建 Grafana 配置与看板的 configmap,然后部署 Grafana 及服务发现 svc:
kubectl create configmap grafana-config --from-file=./grafana/grafana.ini --namespace=monitoring
kubectl create configmap all-grafana-dashboards --from-file=./grafana/dashboard --namespace=monitoring
kubectl apply -f ./grafana/grafana-dp.yml
kubectl apply -f ./service-discovery/kube-controller-manager-svc.yml
kubectl apply -f ./service-discovery/kube-scheduler-svc.yml
Grafana 默认管理员账号/密码均为 admin / admin(定义于 grafana/grafana-admin-secret.yml,base64 编码的 admin,通过 GF_SECURITY_ADMIN_USER/GF_SECURITY_ADMIN_PASSWORD 注入)。Service 端口为 8080;如需从集群外访问,可在 grafana/grafana-svc.yml 中放开 type: NodePort 与 nodePort(默认被注释)。
5. 部署 Prometheus
自定义配置文件,定义采集和报警规则:
kubectl apply -f ./prometheus/prometheus-secret.yml
kubectl apply -f ./prometheus/prometheus-rules.yml
kubectl apply -f ./prometheus/prometheus-rbac.yml
kubectl apply -f ./prometheus/prometheus-svc.yml
prometheus-operator 部署成功后才能成功创建 Prometheus 实例:
kubectl apply -f ./prometheus/pv-pvc-hostpath.yaml
kubectl apply -f ./prometheus/prometheus-main.yml
6. 配置监控目标 ServiceMonitor
ServiceMonitor 声明 Prometheus 的采集目标。注意:采集目标的 label 必须是 k8s-app,因为 Prometheus 按这个标签查找,否则采集不到该资源。
# kubelet监控,请先确保每个节点的kubelet 添加了 authentication-token-webhook=true 和 authorization-mode=Webhook 参数
kubectl apply -f ./servicemonitor/alertmanager-sm.yml
kubectl apply -f ./servicemonitor/coredns-sm.yml
kubectl apply -f ./servicemonitor/kube-apiserver-sm.yml
kubectl apply -f ./servicemonitor/kube-controller-manager-sm.yml
kubectl apply -f ./servicemonitor/kube-scheduler-sm.yml
kubectl apply -f ./servicemonitor/kubelet-sm.yml
kubectl apply -f ./servicemonitor/kubestate-metrics-sm.yml
kubectl apply -f ./servicemonitor/node-exporter-sm.yml
kubectl apply -f ./servicemonitor/prometheus-operator-sm.yml
kubectl apply -f ./servicemonitor/prometheus-sm.yml
kubectl apply -f ./servicemonitor/pushgateway-sm.yml
7. 部署 GPU 监控
GPU 指标由 DCGM exporter(DaemonSet)采集,配套的 Grafana GPU 看板模板为 install/kubernetes/prometheus/grafana/dashboard/dcgm.json。
# 注意:源 readme 写的是 ./gpu/dcgm-exporter.yaml,但 prometheus/ 下并无 gpu 子目录,
# 实际部署文件在上一级的 install/kubernetes/gpu/dcgm-exporter.yaml,因此从 prometheus 目录执行时用 ../gpu
kubectl apply -f ../gpu/dcgm-exporter.yaml
DCGM exporter 部署详情(DaemonSet,命名空间 monitoring,镜像 nvidia/dcgm-exporter:3.1.7-3.1.4-ubuntu20.04)见 install/kubernetes/gpu/dcgm-exporter.yaml。GPU 节点接入与驱动准备见 02-部署安装/GPU与异构算力。
8. 部署 prometheus-adapter
prometheus-adapter 将 Prometheus 指标转换为 K8s custom metrics,供 HPA 等组件按自定义指标扩缩容:
kubectl apply -f ./prometheus_adapter/metric_rule.yaml
kubectl apply -f ./prometheus_adapter/prometheus_adapter.yaml
adapter 目录还提供:
metric_rule.yaml:把 Prometheus 指标映射为custom.metrics的规则;metric_rule_more.yaml是更多指标规则的扩展,按需追加 apply。prometheus_adapter-arm64.yaml:arm64 架构的 adapter 部署变体(国产化/ARM 集群用它替代prometheus_adapter.yaml)。hpa-demo.yaml:基于自定义指标做 HPA 的示例——对一个 Deployment 按 Pods 指标container_gpu_usage扩缩容(所有 pod 该指标均值超过targetAverageValue就加一个副本)。
这样推理服务/任务就能按 GPU 利用率、QPS 等自定义指标弹性伸缩(与 平台架构-推理服务 的 HPA 一节配合)。custom.metrics 是否生效可用 kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 验证。
9. Grafana 配置更新
修改 grafana.ini 后需要删除旧 configmap 再重建(在 install/kubernetes/prometheus/grafana/ 目录下执行),重建后重启 Grafana Deployment 生效:
cd install/kubernetes/prometheus/grafana
kubectl delete -n monitoring configmaps grafana-config
kubectl create configmap grafana-config --from-file=./grafana.ini --namespace=monitoring
kubectl delete -n monitoring configmaps grafana-defaults-config
kubectl create configmap grafana-defaults-config --from-file=./defaults.ini --namespace=monitoring
⚠️ 待核实:
grafana-defaults-config --from-file=./defaults.ini中的defaults.ini在仓库grafana/目录下不存在,且grafana-dp.yml只挂载了grafana-config、grafana-datasources、grafana-dashboards、all-grafana-dashboards四个 configmap,未引用grafana-defaults-config。该命令可能为历史遗留或可选项,见install/kubernetes/prometheus/grafana/readme.md:4-5,请确认。
10. 看板查看
部署完成后,登录 Grafana 即可查看以下内置看板。
所有机器的负载情况


单个机器的资源和应用使用情况


GPU 资源的使用情况

Pod 的资源使用情况

推理服务的流量负载和资源使用情况

相关文档
- 监控体系的架构与原理(Prometheus/Operator、机器与容器监控、ServiceMonitor、告警与 Grafana)见 01-架构原理/监控体系。
- 自定义指标推送与报警代理见 监控指标推送-pushgateway。