.. _dcgm-exporter_instance_node: =========================================== DCGM-Exporter Dashboard将instance改成Node =========================================== 困扰 ======== 在使用 :ref:`dcgm-exporter` 实现 :ref:`intergrate_gpu_telemetry_into_k8s` 发现一个棘手的问题,从 :ref:`grafana` 上观察 NVIDIA 提供的 `NVIDIA DCGM Exporter Dashboard `_ 会发现: ``Instance`` 并不是物理主机( ``node`` )的IP地址,而是 ``dcgm-exporter`` pod的 IP地址:: # kubectl get pods -o wide | grep i-2ze6nk43mbc7xxpcb0ax | grep dcgm-exporter dcgm-exporter-1680364448-2rq5v 1/1 Running 0 4d17h 10.233.109.1 i-2ze6nk43mbc7xxpcb0ax # kubectl get nodes -o wide | grep i-2ze6nk43mbc7xxpcb0ax i-2ze6nk43mbc7xxpcb0ax Ready 11d v1.18.12 172.21.44.236 Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle) 4.19.91-25.6.al7.x86_64 containerd://1.6.18-1-g64ad7b7ae .. figure:: ../../_static/kubernetes/gpu/dcgm-exporter_instance.png :scale: 50 这给运维工作带来困扰,因为我们本意是希望知道那台物理主机上的GPU卡存在异常,监控给出 ``dcgm-exporter`` 的pod IP实在没有太大意义,虽然能够反查 pod 对应的 node 名字,但是对于观察监控显然是不利的。 检查 Prometheus 采集的数据就可以看到, ``Endpoint`` 是 Pod IP: .. figure:: ../../_static/kubernetes/gpu/dcgm-exporter_prometheus_endpoint.png :scale: 50 Pod IP改为Node name ====================== 仔细检查 Prometheus采集的metrics数据,就可以看到,实际上 :ref:`dcgm-exporter` 每个 metrics 实际上既包含了 ``instance`` ( ``dcgm-exporter`` pod的IP )页包含了物理主机的SN ( ``kubernetes_node`` ): 例如 ``instance="10.233.109.1:9400"`` 和 ``kubernetes_node="i-2ze6nk43mbc7xxpcb0ax"`` 。不过并没有包含 Node IP: .. figure:: ../../_static/kubernetes/gpu/dcgm-exporter_prometheus_query.png :scale: 50 既然数据已经采集,那么只需要定制 :ref:`grafana` 的 dashboard 查询语句就可以实现我们期望: 将物理主机信息和GPU监控数据关联起来 - 打开NVIDIA提供的 `NVIDIA DCGM Exporter Dashboard `_ 所制作的Dashboard,点击 ``Settings`` ,在 ``Variables`` 面板可以看到有两个变量: ============= ================================================= 变量 Query表达式 ============= ================================================= **instance** ``label_values(DCGM_FI_DEV_GPU_TEMP, instance)`` gpu ``label_values(gpu)`` ============= ================================================= 模仿上述 **instance** 变量,创建一个 **node** 变量 ============= ======================================================= 变量 Query表达式 ============= ======================================================= **node** ``label_values(DCGM_FI_DEV_GPU_TEMP, kubernetes_node)`` ============= ======================================================= - 点击Dashboard中面板,例如 ``GPU Utilizatiion`` 面板,点击 ``Edit`` 进行修改: 原先的查询表达式是:: DCGM_FI_DEV_GPU_UTIL{instance=~"${instance}", gpu=~"${gpu}"} 修改成:: DCGM_FI_DEV_GPU_UTIL{kubernetes_node=~"${node}", gpu=~"${gpu}"} 此时表头选择变量 ``node`` 就会和这个查询 Graph 关联起来,选择某个Node就会联动这个查询图表 - 依次修改整个Dashboard中的所有图表Query,这样整个Dashboard最终都会把 **instance** 的关联替换成 **node** ,最后就可以删除掉Dashboard的变量 **instance** (只需要 **node** 和 **gpu** ) 最后形成的Dashboard就是我们需要的以主机节点 ``SN`` 为查询条件的Dashboard .. figure:: ../../_static/kubernetes/gpu/dcgm-exporter_instance_node.png :scale: 20 参考 ====== - `Monitoring GPU workloads on GKE with NVIDIA Data Center GPU Manager (DCGM) `_