问题总结:
我们正在使用DCGM Exporter收集有关 GPU 工作负载的指标。在 GKE 上部署时,导出器不会返回有关其他 pod 或容器的 GPU 信息(当它应该返回该信息时)。
该导出器在每个节点上运行一个副本,并查询kubelet 公开的Pod 资源 API以获取所需的数据。似乎在 GKE 上,与其他 kubernetes 发行版相比,此 API 被禁用或配置不同。
问题演示:
我们的测试场景包括部署一个dcgm-exporter
在其上运行的单节点集群以及一个cuda-test
使用 GPU 资源的单副本部署(在此演示中称为)。
我们通过exporter的/metrics
endpoint查询exporter,结果如下。
在 rancher k3s 上运行时v1.20.4+k3s1
,container
和pod
标签包含一个值:
dcgm_sm_clock{gpu="0",UUID="GPU-a2bf9768-0411-f0bb-791c-67d5fec65e2f",device="nvidia0",Hostname="dcgm-exporter-xzpt9",container="cuda-test-main",namespace="default",pod="cuda-test-687bddf45c-qjl6x"} 1860
dcgm_memory_clock{gpu="0",UUID="GPU-a2bf9768-0411-f0bb-791c-67d5fec65e2f",device="nvidia0",Hostname="dcgm-exporter-xzpt9",container="cuda-test-main",namespace="default",pod="cuda-test-687bddf45c-qjl6x"} 9501
dcgm_gpu_temp{gpu="0",UUID="GPU-a2bf9768-0411-f0bb-791c-67d5fec65e2f",device="nvidia0",Hostname="dcgm-exporter-xzpt9",container="cuda-test-main",namespace="default",pod="cuda-test-687bddf45c-qjl6x"} 41
但是在 GKE 上运行时v1.19.8-gke.1600
,container
和pod
标签都有空值:
dcgm_sm_clock{gpu="0",UUID="GPU-bcb71627-8b00-b4aa-70d7-ce39fd6cbb01",device="nvidia0",Hostname="dcgm-exporter-ln6x4",container="",namespace="",pod=""} 585
dcgm_memory_clock{gpu="0",UUID="GPU-bcb71627-8b00-b4aa-70d7-ce39fd6cbb01",device="nvidia0",Hostname="dcgm-exporter-ln6x4",container="",namespace="",pod=""} 5000
dcgm_gpu_temp{gpu="0",UUID="GPU-bcb71627-8b00-b4aa-70d7-ce39fd6cbb01",device="nvidia0",Hostname="dcgm-exporter-ln6x4",container="",namespace="",pod=""} 76
我无法找到有关 GKE 是否禁用此 API(在 k8s 中引入1.13
)或限制某些值被公开的任何信息。我想了解有关此事的更多信息并找到解决方案,以便出口商访问和收集信息。
似乎将参数添加
--kubernetes-gpu-id-type device-name
到了dcgm-exporter
它。显然,在 GKE 上,pod 资源 API 不会返回 GPU 的值
uid
(这是参数的默认值),这就是跳过有关 pod 和容器的信息的原因。