Kubernetes提供了Custom Metrics机制,该机制可以对接阿里云Prometheus监控来采集GPU指标。本文介绍如何部署阿里云Prometheus监控,然后举例说明如何通过阿里云Prometheus监控观测GPU指标,实现容器的弹性伸缩。
前提条件
您已完成创建以下任一类型集群:背景信息
在高性能计算领域,例如深度学习模型训练、推理等场景,通常需要使用GPU来做计算加速。为了节省成本,您可以根据GPU指标(利用率、显存)来进行弹性伸缩。
Kubernetes默认提供CPU和内存作为HPA弹性伸缩的指标,如果有更复杂的场景需求,例如基于GPU指标进行自动扩缩容,您可以通过Prometheus Adapter适配Prometheus采集到的GPU指标,再利用Custom Metrics API来对HPA的指标进行扩展,从而根据GPU利用率、显存等指标进行弹性伸缩。GPU弹性伸缩原理如下图所示:

步骤一:部署阿里云Prometheus和Metrics Adapter
- 开启阿里云Prometheus监控。说明 如果您在创建集群时,已选中安装Prometheus,则不需要重复安装。
- 安装并配置ack-alibaba-cloud-metrics-adapter。一、获取HTTP API地址
- 登录ARMS控制台。
- 在控制台左侧导航栏,选择 。
- 在Prometheus监控页面左上角选择容器服务K8s集群所在的地域,然后选择实例类型为Prometheus for 容器服务的目标实例名称,进入对应实例页面。
- 在左侧导航栏单击设置,复制HTTP API地址下的内网地址。
二、配置Prometheus Url- 登录容器服务管理控制台,在左侧导航栏中选择 。
- 在应用市场页面单击应用目录页签,搜索并单击ack-alibaba-cloud-metrics-adapter。
- 在ack-alibaba-cloud-metrics-adapter页面,单击一键部署。
- 在基本信息配置向导中,选择集群和命名空间,然后单击下一步。
- 在参数配置配置向导中,选择Chart版本,在参数配置中将上述获取的HTTP API地址设置为Prometheus
url
的值,然后单击确定。
步骤二:基于GPU指标实现弹性伸缩
本文通过在GPU上部署一个模型推理服务,然后对其进行压测,根据GPU利用率测试弹性伸缩。
- 部署推理服务。
- 配置HPA。本文以GPU利用率为例进行说明,当Pod的GPU利用率大于20%时,触发扩容。HPA目前支持的指标如下:
指标名称 说明 单位 duty_cycle_current GPU利用率 百分比 memory_used_bytes_current 显存使用量 字节 - 测试推理服务弹性伸缩。场景一:测试扩容效果场景二:测试缩容效果
当压测停止,GPU利用率降低且低于20%后,系统开始进行弹性缩容。
(可选)步骤三:配置弹性节点池
当集群中GPU节点资源不足,HPA触发扩容后,Pod的状态会变为Pending
,导致扩容失败。此时可以使用弹性节点池进行处理,当集群GPU不足时,自动扩容节点。更多信息,请参见配置自动弹性伸缩。
- 登录容器服务管理控制台,在左侧导航栏中选择集群。
- 在目标集群右侧的操作列下,选择 。
- 在自动弹性伸缩配置页面,完成弹性伸缩配置并提交。
- 在自动弹性伸缩配置页面,单击创建节点池。
- 在创建节点池对话框,设置创建节点池的配置项。部分配置项说明如下所示。
参数 说明 自动伸缩 请选中开启自动开启弹性伸缩。 节点标签 如果您有多个节点,可以在创建节点池对话框最下方单击显示高级选项,找到节点标签,为集群节点添加自定义标签。 说明 部署应用时,您可以在YAML文件中通过nodeSelector
配置节点标签,应用会自动部署到指定的节点池中,扩容的节点也会部署在指定节点池中。关于更多配置项说明,请参见创建Kubernetes专有版集群。
- 配置完成后,在创建节点池对话框最下方单击确认配置。
常见问题
问:如果执行
kubectl get hpa
命令后,发现target
一栏为UNKNOWN
怎么办?答:请按照以下步骤进行验证:
- 确认
HorizontalPodAutoscaler
中指标名字是否正确。 - 执行
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
命令,查看返回结果中是否有对应的指标。 - 检查ack-alibaba-cloud-metrics-adapter中配置的Prometheus
url
是否正确。
- 确认
问:如何根据GPU显存的使用情况进行弹性伸缩?
答:您可以使用memory_used_bytes_current
作为指标进行部署,此操作适用于GPU独占或GPU共享模式。apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metricName: memory_used_bytes_current #Pod使用的显存,单位为字节。 targetAverageValue: 4G #单个Pod显存超过4 GB触发扩容。
问:如何禁止自动缩容?
答:您可以在创建HPA时,通过配置behavior
来禁止自动缩容。
完整的HPA配置文件如下:behavior: scaleDown: policies: - type: pods value: 0
apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metricName: duty_cycle_current #Pod的GPU利用率。 targetAverageValue: 20 #GPU利用率超过20%,触发扩容。 behavior: scaleDown: policies: - type: pods value: 0
问:如何延迟缩容时间窗口?
答:缩容默认时间窗口(--horizontal-pod-autoscaler-downscale-stabilization-window
)是5分钟 ,如果您需要延长时间窗口以避免一些流量毛刺造成的异常,可以指定缩容的时间窗口,behavior
参数配置示例如下:
上述示例表示当负载下降时,系统会等待600秒(10分钟)后再次进行缩容,每次只缩容5个Pod。behavior: scaleDown: stabilizationWindowSeconds: 600 #等待10分钟后再开始缩容。 policies: - type: pods value: 5 #每次只缩容5个Pod。