You need to enable JavaScript to run this app.
导航
使用 GPU 和网络指标实现弹性伸缩
最近更新时间:2024.07.24 16:07:47首次发布时间:2022.12.30 19:03:45

除 Kubernets 原生支持的 CPU 和内存指标外,容器服务还为您预置了 GPU 和网络指标映射规则,允许通过容器的 GPU 指标或网络指标实现弹性伸缩。本文介绍如何配置基于 GPU 或网络指标的弹性伸缩。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

背景信息

基本概念

默认情况下,HPA (Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)只支持基于 CPU 和内存的自动扩缩容,并不能满足复杂业务的诉求。在实际生产业务中,用户常常希望通过 Pod 的 GPU 负载或网络流量来触发扩容和缩容。

容器服务提供 prometheus-adapter 组件,支持将原生 Prometheus 指标转化成自定义指标 API 的格式,同时在组件中预置了 GPU 指标和网络指标的转化规则。当您在集群中开启 云原生观测 功能后,能够基于采集的容器 GPU 指标和网络指标,实现工作负载的自动扩缩容,使得业务负载可以更好地按需扩展,保证稳定性并平衡成本。

使用 GPU 和网络指标进行弹性伸缩,主要步骤如下:

  1. 在集群中安装 prometheus-adapter 组件。
  2. 在集群中开启云原生观测,采集相关指标。详情请参见 开启观测基础观测
  3. 配置 HPA,使用 GPU 或网络指标实现工作负载自动扩缩容。

指标说明

容器服务支持基于工作负载的 GPU 和网络指标实现弹性伸缩,预置指标如下表所示。

监控指标指标名称单位
GPU 使用率k8s_pod_rate_gpu_used%
GPU 显存使用率k8s_pod_rate_gpu_memory_used%
GPU 显存量k8s_pod_gpu_memory_usedMiB
网络入吞吐率k8s_pod_network_receive_throughput%
网络出吞吐率k8s_pod_network_transmit_throughput%

说明

  • 您可以在集群kube-system命名空间中,查看prometheus-adapter-config配置项,确认系统中的预置指标名称,以及该指标名称对应的 Prometheus 原始指标。
  • 除系统预置的 GPU 和网络指标外,也支持基于自定义指标的弹性伸缩。详情请参见 使用自定义指标进行弹性伸缩

使用限制

  • HPA 配置多种指标时,会分别基于每种指标计算,并取最大值作为最终结果。
  • 指标伸缩仅支持配置无状态负载(Deployment)和有状态负载(Statefulset)。
  • 使用 GPU 指标实现弹性伸缩时,目前仅支持普通 GPU Pod 的 HPA 能力,暂不支持 mGPU Pod。

前提条件

  • 已开启云原生观测。详情请参见 开启观测
  • 使用 kubectl 连接目标集群。详情请参见 连接集群
  • 已安装 nvidia-device-plugin 组件,且 部署插件 必须勾选 安装 dcgm-exporter。详情请参见 nvidia-device-plugin
  • 已安装 prometheus-agent 组件,且 部署插件 必须勾选 安装 node-exporter。详情请参见 prometheus-agent
  • 已安装 prometheus-adapter 组件。详情请参见 prometheus-adapter

通过控制台配置

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 弹性伸缩 > 指标伸缩,单击 创建指标伸缩,配置指标伸缩。
    • 基本信息
      alt
      配置项说明
      名称根据系统提示,配置指标伸缩策略的名称。在同一个命名空间下,名称必须唯一。
      命名空间选择伸缩策略所属的命名空间。建议选择您自定义的命名空间或系统默认创建的 default 命名空间。命名空间相关介绍,请参见 命名空间概述
      标签对应 Kubernetes 中的 Label,用于指定该伸缩策略的标识属性。单击 添加标签,根据界面提示输入符合要求的
      注解对应 Kubernetes 中的 Annotation,用于为伸缩策略附加任意非标识的元数据,包括 标签 不允许的字符,方便客户端能够检索此元数据。单击 添加注解,根据界面提示输入符合要求的
    • 伸缩策略
      alt
      配置项说明
      伸缩对象配置需要伸缩的工作负载。在下拉菜单中选择工作负载的类型和具体的工作负载。

      监测指标

      配置伸缩的监测指标,系统基于此指标决定是否需要进行伸缩。容器服务中支持的 GPU 和网络指标包括:

      • GPU 使用率:按所有 Pod 实例 GPU 平均使用率,作为监测指标,当 GPU 使用率达到该值,则进行伸缩。
      • GPU 显存使用率:按所有 Pod 实例共享 GPU 显存使用量 / 所有 Pod 实例共享 GPU 显存请求(Request)量的百分比,作为监测指标,当 GPU 显存使用率达到该值,则进行伸缩。
      • GPU 显存量:按所有 Pod 实例共享 GPU 显存使用量,作为监测指标,当 GPU 显存量达到该值,则进行伸缩。
      • 网络入吞吐率:按工作负载中所有 Pod 实例下所有容器的入方向带宽之和,作为监测指标,当网络入吞吐率达到该值,则进行伸缩。
      • 网络出吞吐率:按工作负载中所有 Pod 实例下所有容器的出方向带宽之和,作为监测指标,当网络出吞吐率达到该值,则进行伸缩。

      说明

      • 一个 HPA 伸缩规则里,不能同时设置两个相同种类的伸缩指标。
      • 目前最多支持添加两个监测指标。
      • 使用 CPU 和内存指标配置弹性伸缩的方法,请参见 创建指标伸缩
      最小实例数配置伸缩时的最小实例数和最大实例数。策略触发时,工作负载实例将在此范围内伸缩。
      最大实例数
    • 伸缩规则
      alt
      配置项说明
      扩缩容策略配置工作负载的扩缩容行为,勾选 扩容策略缩容策略,分别配置扩容策略行为和缩容策略行为。

      静默时间

      扩容策略或缩容策略的静默时间,整数形式,单位为秒。
      系统完成扩缩容后,在静默时间内,不会再次执行扩缩容策略,避免工作负载副本数频繁变更造成系统震荡。

      策略类型

      配置策略类型,包括:

      • 最大值:执行影响 Pod 数量最大的策略。
      • 最小值:执行影响 Pod 数量最小的策略。
      • 禁用:禁用该扩容策略或缩容策略。

      策略

      配置扩缩容的具体策略行为,包括:

      • 类型:配置扩缩容策略行为的类型。
        • 容器组:基于 Pod 数量执行扩缩容。
        • 百分比:基于 Pod 百分比执行扩缩容。
      • 阈值:配置扩缩容行为的阈值,与 类型 配合使用。例如:当 类型 配置为 容器组,阈值配置为 10 时,表示在 时间间隔 内扩容或缩容 10 个副本。
      • 时间间隔:配置扩缩容速率,整数形式,取值范围为 1~1800,单位为秒。
  5. 单击 确定,完成配置。

通过 kubectl 命令行配置

  1. 创建使用 GPU 的工作负载。本示例以创建无状态负载(Deployment)为例。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-gpu-workload  # 工作负载名称。
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: example-gpu-workload
      template:
        metadata:
          labels:
            app: example-gpu-workload
        spec:
          containers:
          - name: workload
            image: example-gpu-workload
            resources:
              limits:
                nvidia.com/gpu: 1  # GPU 显卡数量。
    
  2. 创建与工作负载关联的 HPA,指定按照 GPU 使用率进行弹性伸缩。
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gpu-hpa  # 指标伸缩名称。
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: example-gpu-workload # 指定指标伸缩的工作负载对象。
      minReplicas: 1 # 配置 HPA 的最小实例数。
      maxReplicas: 10 # 配置 HPA 的最大实例数。
      metrics:
      - type: Pods
        pods:
          metric:
            name: k8s_pod_rate_gpu_used  # 配置 HPA 的触发指标,本例中配置为 Pod 的 GPU 利用率。
          target:
            averageValue: 20  # 当 GPU 利用率超过 20%,触发扩容。
            type: AverageValue
    
  3. 查看弹性伸缩结果。
    • 当 Pod GPU 使用率增加后会触发扩容,此时可通过如下命令查看 HPA 信息。
      kubectl get hpa   
      
      预期返回结果如下,Deployment 的副本数扩容到 2:
      NAME      REFERENCE                         TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      gpu-hpa   Deployment/example-gpu-workload   23/20      1         10        2          62s   
      
    • 当 Pod GPU 使用率下降到指定值以下会触发缩容,此时可通过如下命令查看 HPA 信息。
      kubectl get hpa   
      
      预期返回结果如下,Deployment 的副本数缩容到 1:
      NAME      REFERENCE                         TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      gpu-hpa   Deployment/example-gpu-workload   0/20      1         10        1          15m
      

参考信息

不同版本的 HPA 资源对于扩缩容行为有不同粒度的控制能力。详细说明,请参见 开源社区文档

您可参考官方文档,根据使用容器服务创建的集群 Kubernetes 版本,结合您自身业务使用弹性伸缩的期望,合理控制工作负载的弹性伸缩行为。