我最近(就在本周)设法做到了这一点。我将概述我的解决方案和所有问题,以防万一。
从 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 资源吗?),这就是我部署集群的方式。
为了安装所有这些东西,我使用了一个类似于以下的脚本:
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 )并应用它。在此过程中,我遇到了第二个“陷阱”,即在最新的图像中,他们删除了一些GPU指标dcgm-exporter
,例如-监控工具/问题/143DCGM_FI_DEV_GPU_UTIL
)。如果要重新启用它们,请确保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
这一切都奏效了。
我希望这有帮助!我花了很长时间尝试人们在咨询公司博客、媒体帖子等上展示的不同方法,然后发现编写这些文章的人已经对您的部署做出了假设,这会影响您真正需要了解的细节(例如:命名空间问题) .