我最近(就在本周)设法做到了这一点。我将概述我的解决方案和所有问题,以防万一。
从 AKS 集群开始,我安装了以下组件以收集 GPU 指标:
- nvidia-device-plugin - 使 GPU 指标可收集
- dcgm-exporter - 显示每个节点上的 GPU 指标的守护程序集
- kube-prometheus-stack - 收集并存储 GPU 指标
- prometheus-adapter - 将收集的、存储的指标提供给 k8s 指标服务器
AKS 群集带有内置的指标服务器,因此您无需担心这一点。也可以使用已应用的 nvidia-device-plugin 来配置集群,但目前无法通过 terraform (Is it possible to use aks custom headers with the azurerm_kubernetes_cluster resource?),这就是我部署集群的方式。
为了安装所有这些东西,我使用了一个类似于以下的脚本:
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add gpu-helm-charts https://nvidia.github.io/gpu-monitoring-tools/helm-charts
helm repo update
echo "Installing the NVIDIA device plugin..."
helm install nvdp/nvidia-device-plugin \
--generate-name \
--set migStrategy=mixed \
--version=0.9.0
echo "Installing the Prometheus/Grafana stack..."
helm install prometheus-community/kube-prometheus-stack \
--create-namespace --namespace prometheus \
--generate-name \
--values ./kube-prometheus-stack.values
prometheus_service=$(kubectl get svc -nprometheus -lapp=kube-prometheus-stack-prometheus -ojsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
helm install prometheus-adapter prometheus-community/prometheus-adapter \
--namespace prometheus \
--set rbac.create=true,prometheus.url=http://${prometheus_service}.prometheus.svc.cluster.local,prometheus.port=9090
helm install gpu-helm-charts/dcgm-exporter \
--generate-name
实际上,我在撒谎dcgm-exporter。我遇到了一个问题(我的第一个“陷阱”),dcgm-exporter 没有及时响应活动请求,并且一直进入CrashLoopBackoff 状态(https://github.com/NVIDIA/gpu-monitoring-tools/issues/120)。为了解决这个问题,我创建了自己的dcgm-exporter k8s 配置(通过从这里获取细节并稍微修改它们:https://github.com/NVIDIA/gpu-monitoring-tools)并应用它。
在此过程中,我遇到了第二个“陷阱”,即在最新的dcgm-exporter 图像中,他们删除了一些 GPU 指标,例如DCGM_FI_DEV_GPU_UTIL,主要是因为收集这些指标需要大量资源(请参阅https://github.com/NVIDIA/gpu-monitoring-tools/issues/143)。如果您想重新启用它们,请确保您运行 dcgm-exporter 并将参数设置为:["-f", "/etc/dcgm-exporter/dcp-metrics-included.csv"] 或者您可以创建自己的图像并提供自己的指标列表,这就是我使用此 Dockerfile 所做的:
FROM nvcr.io/nvidia/k8s/dcgm-exporter:2.1.4-2.3.1-ubuntu18.04
RUN sed -i -e '/^# DCGM_FI_DEV_GPU_UTIL.*/s/^#\ //' /etc/dcgm-exporter/default-counters.csv
ENTRYPOINT ["/usr/local/dcgm/dcgm-exporter-entrypoint.sh"]
您可以从上面的脚本中看到的另一件事是,我还使用了自己的 Prometheus helm 图表值文件。我按照 nvidia 网站 (https://docs.nvidia.com/datacenter/cloud-native/kubernetes/dcgme2e.html) 的说明进行操作,但在 additionalScrapeConfig 中找到了我的第三个“陷阱”。
我了解到,在最终部署中,HPA 必须与它正在扩展的服务(由 targetRef 标识)位于相同的命名空间中,否则它无法找到它来扩展它,你可能已经知道了。
但同样重要的是dcgm-metrics Service 也必须在同一个命名空间中,否则 HPA 无法找到它需要扩展的指标经过。
因此,我更改了 additionalScrapeConfig 以定位相关的命名空间。我确信有一种方法可以使用 additionalScrapeConfig.relabel_configs 部分,使您能够将 dcgm-exporter 保留在不同的命名空间中,并且仍然让 HPA 找到指标,但我还没有时间学习那个巫术。
完成所有这些后,我可以检查 DCGM 指标是否可供 kube 指标服务器使用:
$ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq -r . | grep DCGM_FI_DEV_GPU_UTIL
在结果列表中,您真的希望看到 services 条目,如下所示:
"name": "jobs.batch/DCGM_FI_DEV_GPU_UTIL",
"name": "namespaces/DCGM_FI_DEV_GPU_UTIL",
"name": "services/DCGM_FI_DEV_GPU_UTIL",
"name": "pods/DCGM_FI_DEV_GPU_UTIL",
如果您不这样做,这可能意味着您使用的 dcgm-exporter 部署缺少 ServiceAccount 组件,并且 HPA 仍然无法工作。
最后,我这样写了我的 HPA:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
namespace: my-namespace
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: X
maxReplicas: Y
...
metrics:
- type: Object
object:
metricName: DCGM_FI_DEV_GPU_UTIL
targetValue: 80
target:
kind: Service
name: dcgm-exporter
一切都奏效了。
我希望这会有所帮助!我花了很长时间尝试人们在咨询公司博客、媒体帖子等上展示的不同方法,然后发现编写这些文章的人已经对您的部署做出了假设,这会影响您真正需要了解的细节(例如:命名空间问题) .