在复杂的AI基础设施中,尤其是基于Kubeflow的MLOps平台,缺乏透明度是导致生产环境问题的主要原因之一。Prometheus和Grafana的组合是Kubernetes生态中最成熟的监控解决方案。本文将指导您如何在已有的Kubeflow集群中,部署一套独立的、高可用的监控栈,并配置其抓取(Scrape)Kubeflow核心组件的内部指标。
Contents
1. 为什么要深度监控Kubeflow?
Kubeflow由数十个微服务组成,包括Kubeflow Pipelines (KFP)、Notebooks、各种训练操作符(TFJob, PyTorchJob)以及Metadata服务。标准K8s监控(如节点CPU/内存)不足以捕捉ML工作流的特性:
- 资源利用率波动: 训练任务启动和停止导致资源使用率急剧变化。
- 作业状态追踪: 需要监控Pipeline的步长、延迟和失败率。
- 组件性能: 监控Metadata、Volume Snapshots等关键后端服务的延迟和吞吐量。
2. 部署基础监控栈(Kube-Prometheus Stack)
我们推荐使用Helm chart中的kube-prometheus-stack,因为它包含了Prometheus Operator、Prometheus、Alertmanager和预配置的Grafana。
前提条件: 确保您已安装Helm。
步骤 2.1:添加Helm仓库并部署
我们将监控栈部署到一个名为monitoring的命名空间中。
1
2
3
4
5
6
7 # 添加 Prometheus Community 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 部署 kube-prometheus-stack
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace
部署完成后,您应该能在monitoring命名空间看到相关的Pod和服务。
3. 配置ServiceMonitor抓取Kubeflow指标
Prometheus通过ServiceMonitor自定义资源(CRD)来发现和配置抓取目标。Kubeflow的大多数关键服务(如KFP API Server, Metadata service)都暴露了标准的Prometheus /metrics 端点。我们需要为这些服务创建ServiceMonitor。
以下示例展示了如何为Kubeflow Pipelines (KFP) 的API Server创建一个ServiceMonitor。假设您的Kubeflow安装在kubeflow命名空间,且KFP API Service名为ml-pipeline。
步骤 3.1:检查Kubeflow服务的Label
Prometheus Operator使用Label Selector来匹配ServiceMonitor和实际的Kubernetes Service。首先获取KFP Service的标签:
1 kubectl describe service ml-pipeline -n kubeflow
假设我们观察到Service具有标签 app: ml-pipeline。
步骤 3.2:创建ServiceMonitor资源
创建一个名为kubeflow-pipeline-monitor.yaml的文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: kubeflow-pipeline-api-monitor
namespace: monitoring # ServiceMonitor 必须位于 Prometheus 所在的命名空间
labels:
release: monitoring # 匹配 kube-prometheus-stack 的默认标签
spec:
selector:
matchLabels:
app: ml-pipeline # 匹配 KFP API Service 的标签
namespaceSelector:
matchNames:
- kubeflow # 指明服务所在的命名空间
endpoints:
- port: http # KFP API Service 暴露 metrics 的端口名 (需根据实际情况确认)
path: /metrics # KFP 暴露 metrics 的路径
interval: 30s
应用配置:
1 kubectl apply -f kubeflow-pipeline-monitor.yaml
重复此过程,为Metadata服务、Notebook Controller以及您使用的任何自定义操作符(如TFJob/PyTorchJob Controller)创建相应的ServiceMonitor。
4. 访问和配置Grafana仪表板
Grafana是可视化Prometheus数据的界面。我们需要获取登录凭证并暴露服务。
步骤 4.1:获取管理员密码
默认情况下,密码存储在一个Secret中:
1
2 export GF_PASSWORD=$(kubectl get secret monitoring-grafana -n monitoring -o jsonpath="{.data.admin-password}" | base64 --decode)
echo "Grafana Admin Password: $GF_PASSWORD"
步骤 4.2:通过端口转发访问Grafana
1 kubectl port-forward service/monitoring-grafana 3000:80 -n monitoring
现在可以通过浏览器访问 http://localhost:3000,使用用户名 admin 和获取到的密码登录。
步骤 4.3:导入Kubeflow专用仪表板
登录Grafana后,您需要确保默认的Prometheus数据源已连接(由Helm自动完成)。然后,您可以导入社区或自定义的Kubeflow仪表板。
- 社区仪表板ID示例: 搜索针对Kubernetes组件或KubeFlow Pipelines的仪表板。
- 自定义QL查询: 如果要监控KFP作业数量,可以使用如下PromQL查询来构建面板:
1 sum(rate(kfp_api_server_request_total{job="ml-pipeline", code!="200"}[5m])) by (method, handler)
这个查询可以帮助您了解KFP API的错误率和性能。通过这种深度集成,您可以实时监控和优化Kubeflow中的所有AI工作负载。
汤不热吧