GKE 中的动态资源分配简介


本页面介绍了 Google Kubernetes Engine (GKE) 中的动态资源分配 (DRA)。在本页中,您将了解 DRA 的基础知识、它在 GKE 中的工作方式,以及使用 DRA 分配 GPU 和 TPU 等硬件的优势。

本页面适用于以下角色:

在阅读本页面之前,请确保您熟悉以下资源:

DRA 简介

DRA 是一项内置的 Kubernetes 功能,可让您在集群中的 Pod 和容器之间灵活地请求、分配和共享硬件。DRA 允许设备供应商和平台管理员声明可请求和分配的设备,从而改进了分配附加硬件(例如加速器)的体验。应用运营商可以在这些类中请求特定的设备配置,然后在工作负载中请求这些配置。Kubernetes 和 GKE 会根据工作负载请求管理 Pod 调度、节点分配和设备分配。

例如,平台管理员可以定义仅包含 NVIDIA A100 GPU 的设备类。然后,应用运营商可以根据工作负载要求过滤该设备类中的设备,例如过滤 GPU 内存至少为 80 GB 的设备。当应用运算符部署请求过滤配置的工作负载时,GKE 会将 Pod 放置在符合所选条件的节点上。在此示例中,GKE 会查找具有可用 A100 (80 GB) GPU 的节点。应用运营商无需在工作负载清单中选择特定节点或设备配置。

DRA 的优势

如果没有 DRA,在 Kubernetes 中分配硬件设备就要依赖于设备插件。如需使用设备插件将硬件资源附加到 Pod,您可以使用节点标签将 Pod 放置在特定节点上。此外,如需将整个节点的资源专用于单个 Pod,您可以请求连接到节点的设备的确切数量。

借助 DRA,将设备分配给 Pod 的体验与分配存储卷类似。您可以定义设备类,请求这些类中的设备,然后将所请求的设备分配给工作负载。DRA 提供了一个可大幅扩展的界面,可根据工作负载和业务需求过滤设备。使用表达式和模板来声明硬件和调度 Pod 的 DRA 方法具有以下优势:

  • 声明式设备分配:平台管理员可以为特定类型的工作负载或团队定义设备配置。
  • 降低跨团队复杂性:当平台管理员预配具有专用硬件配置的节点时,应用运维人员无需知道哪些节点具有特定配置。平台管理员无需标记节点或向运营商传达有关特定节点和设备的信息。
  • 降低了开发者的复杂度:Kubernetes 会根据引用的设备配置来调度 Pod。应用运维人员无需在其工作负载中选择特定节点,也无需确保每个 Pod 请求的设备数量与附加到这些节点的设备数量完全一致。
  • 集中式基础架构管理:平台管理员可以集中定义满足特定业务要求的硬件配置。例如,平台管理员可以声明一个具有 H100 GPU 的高性能配置,以及一个具有 Tesla T4 GPU 的小型推理配置。
  • 灵活的硬件选择:借助 DRA,您可以使用 CEL 表达式过滤具有特定属性的设备。使用表达式可灵活地过滤出最适合特定工作负载的设备。

何时使用 DRA

在预览版期间,在 GKE 中使用 DRA 的主要原因是,您可以灵活地为工作负载请求设备。您只需编写一次清单,即可将工作负载部署到具有不同设备类型的不同集群,而无需更改清单。这种灵活性非常适合以下使用场景:

  • 提高 GPU 可获取性:对于需要访问 GPU 硬件的工作负载,您可以使用 DRA 请求集群中的任何可用 GPU,而无需指定 GPU 型号。如果这些工作负载对 GPU 内存 (VRAM) 有具体要求,您可以请求集群中内存量达到最低要求的任何 GPU。这种灵活的请求会扩大工作负载可运行的 GPU 节点集,从而降低因资源不可用而导致工作负载无法调度的风险。
  • 在扩缩期间优化 GPU 节点可用性:工作负载所需的附加 GPU 数量可能会因 GPU 类型而异。您可以使用 GKE 计算类根据 GPU 可用性、配额或容量预留来预配节点。然后,您可以在工作负载中使用 DRA 将 Pod 配置为在 GKE 为计算类预配的任何节点上运行。将 DRA 与计算类搭配使用,可最大限度地降低无计划工作负载的风险,同时确保工作负载在经过优化的硬件上运行。

术语

开源 Kubernetes 和 GKE 等托管式 Kubernetes 提供商使用以下 DRA 术语:

ResourceSlice
ResourceSlice 列出了集群中节点可访问的一个或多个硬件设备。 例如,在可以访问单个 GPU 的节点中,ResourceSlice 会列出 GPU 和节点的名称。每个节点上的 DRA 设备驱动程序都会创建 ResourceSlice。Kubernetes 调度器使用 ResourceSlice 来决定分配哪些设备以满足工作负载请求。
DeviceClass
DeviceClass 定义了可供工作负载请求的设备类别,例如 GPU。 某些设备驱动程序提供内置的 DeviceClass,例如 NVIDIA GPU 的 gpu.nvidia.com DeviceClass。平台管理员还可以创建自定义 DeviceClass,用于定义特定的设备配置。
ResourceClaim

借助 ResourceClaim,Pod 或用户可以通过在 DeviceClass 中过滤特定参数来请求硬件资源。 当工作负载引用 ResourceClaim 时,Kubernetes 会将符合指定参数的设备分配给该 ResourceClaim。

例如,假设您创建了一个针对一个 A100 (40 GB) GPU 的 ResourceClaim,然后部署了一个选择该 ResourceClaim 的工作负载。Kubernetes 会为 ResourceClaim 分配一个可用的 A100 (40 GB) GPU,并将您的 Pod 调度到可以访问该 GPU 的节点上。

ResourceClaimTemplate

ResourceClaimTemplate 定义了一个模板,Pod 可使用该模板自动创建新的每个 Pod ResourceClaim。 当您有多个工作负载需要访问类似的设备配置时,ResourceClaimTemplates 非常有用,尤其是在使用 Deployment 或 StatefulSet 等工作负载控制器时。

应用运维人员部署 ResourceClaimTemplate,然后在工作负载中引用这些模板。Kubernetes 会根据指定的模板为每个 Pod 创建 ResourceClaim,分配设备并调度 Pod。当 Pod 终止时,Kubernetes 会清理相应的 ResourceClaim。

DRA 的运作方式

在集群和工作负载中使用 DRA 的体验与使用 StorageClass、PersistentVolumeClaim 和 PersistentVolume 来为 Pod 动态预配卷的体验类似。

下图展示了集群管理员和应用运维人员使用 DRA 分配设备的步骤:

在此图中,集群管理员和应用操作员执行以下操作:

  1. 集群管理员在节点中安装支持 DRA 的设备驱动程序。
  2. 集群管理员创建 DeviceClass,用于过滤符合特定要求的硬件,例如所有内存超过 40 GB 的 GPU。某些设备可能还包含内置的 DeviceClass。
  3. 应用运营商创建请求设备配置的 ResourceClaimTemplate 或 ResourceClaim。每种声明的主要使用场景如下:
    • 借助 ResourceClaim,多个 Pod 可以共享对同一设备的访问权限。
    • 借助 ResourceClaimTemplate,多个 Pod 可以通过自动生成每个 Pod 的 ResourceClaim 来访问单独的类似设备。
  4. 应用操作员将 ResourceClaimTemplate 或 ResourceClaim 添加到其工作负载清单中。
  5. 应用运维人员部署工作负载。

当您部署引用 ResourceClaimTemplate 或 ResourceClaim 的工作负载时,Kubernetes 会执行以下调度步骤:

  1. 如果工作负载引用了 ResourceClaimTemplate,Kubernetes 会为工作负载的每个实例(例如,Deployment 中的每个副本)创建一个新的 ResourceClaim 对象。
  2. Kubernetes 调度器使用集群中的 ResourceSlice 将可用的符合条件的设备分配给每个 Pod 的 ResourceClaim。
  3. 调度程序会将每个 Pod 放置在可以访问已分配给 Pod 的 ResourceClaim 的设备的节点上。
  4. 目标节点上的 kubelet 调用节点上的 DRA 驱动程序,将分配的硬件附加到 Pod 以满足其资源请求。

何时使用 ResourceClaim 和 ResourceClaimTemplate

您可以使用 ResourceClaim 和 ResourceClaimTemplate 向 Kubernetes 指示您需要满足特定要求的设备。当 Pod 中引用 ResourceClaim 时,Kubernetes 会在 Kubernetes API 服务器中为相应的 ResourceClaim API 资源分配设备。无论是由您创建 ResourceClaim,还是由 Kubernetes 从 ResourceClaimTemplate 创建 ResourceClaim,都会发生此分配。

如果您创建了一个 ResourceClaim,然后在多个 Pod 中引用它,那么所有这些 Pod 都可以访问 Kubernetes 为该 ResourceClaim 分配的设备。例如,如果您在具有多个副本的 Deployment 清单中引用了特定的 ResourceClaim,则可能会发生这种共享访问。不过,如果分配的设备未配置为可供多个进程共享,则跨 Pod 的这种共享设备访问可能会导致意外行为。

借助 ResourceClaimTemplate,您可以定义 Kubernetes 用于自动为 Pod 创建各个 ResourceClaim 的模板。例如,如果您在具有多个副本的 Deployment 中引用 ResourceClaimTemplate,Kubernetes 会为每个复制的 Pod 创建单独的 ResourceClaim。因此,每个 Pod 都会获得自己的分配设备,而不是与其他 Pod 共享对设备的访问权限。这些自动生成的 ResourceClaim 会绑定到相应 Pod 的生命周期,并在 Pod 终止时被删除。如果您有需要访问类似设备配置的独立 Pod,请使用 ResourceClaimTemplate 为每个 Pod 单独分配设备。

下表说明了手动创建 ResourceClaim 与让 Kubernetes 从 ResourceClaimTemplate 创建 ResourceClaim 之间的一些区别:

手动创建的 ResourceClaim 自动创建的 ResourceClaim
由您管理 由 Kubernetes 管理
允许从多个 Pod 访问同一设备 提供从单个 Pod 访问设备的权限
独立于 Pod 存在于集群中 与相应 Pod 的生命周期绑定
非常适合需要共享特定设备的多个工作负载 非常适合需要独立设备访问权限的多个工作负载

DRA 与手动设备分配的比较

借助 DRA,分配附加设备与动态预配 PersistentVolume 的体验类似。Kubernetes 还支持使用设备插件来分配设备。此方法涉及以下步骤:

  1. 集群管理员创建已连接设备(例如 GPU)的节点。
  2. 集群管理员会向工作负载运营商传达有关特定节点及其连接的设备的信息。
  3. 工作负载运算符在工作负载清单中请求设备,如下所示:
    • 使用 nodeSelector 字段选择具有所需设备配置(例如 GPU 型号或 TPU 类型和拓扑)的节点。
    • 使用 Pod 规范中的 resources 字段,指定容器要使用的确切设备数量。

这种手动分配方法要求应用运营商和集群管理员就哪些特定节点或节点池具有特定设备配置进行沟通。它们必须协调工作负载请求,以匹配节点上的设备,否则部署会失败。相比之下,DRA 可让您使用表达式根据属性灵活地过滤设备,并且不需要工作负载运算符了解集群中节点的精确配置。

下表比较了 DRA 与设备插件:

DRA 手动分配
使用 CEL 表达式灵活选择设备 使用选择器和资源请求选择特定节点
Kubernetes 做出的调度决策 由运维人员使用节点选择器做出的调度决策
设备过滤与工作负载创建是分开的 必须在工作负载清单中完成设备过滤
由平台管理员管理的集中式设备过滤和基于需求的课程 通过应用运算符进行隔离设备过滤
应用运营商无需了解节点容量、节点标签信息或每个节点的连接设备型号 应用运营商必须知道哪些节点连接了特定型号和数量的特定设备。

支持 DRA 的 GKE 设备

您可以使用 DRA 将 GPU 或 TPU 分配给 GKE 工作负载。您可以分配 GKE 支持的任何 GPU 和 TPU 模型。如需详细了解 GKE 支持的 GPU 和 TPU,请参阅以下资源:

GKE 中 DRA 的限制

在 GKE 集群中,DRA 存在以下限制:

  • 您无法将 DRA 与节点自动预配功能搭配使用。
  • 您无法将 DRA 与以下 GPU 共享功能搭配使用:
    • 分时 GPU。
    • 多实例 GPU。
    • 多进程服务 (MPS)。
  • 您无法在 Autopilot 集群中使用 DRA。
  • 您必须使用 GKE 1.32.1-gke.1489001 或更高版本。

本部分为希望使用 DRA 将设备分配给工作负载的平台管理员或应用运维人员提供建议。DRA 大幅改变了您在 GKE 和 Kubernetes 中请求连接设备的方法。如需受益于更高级的用例(例如跨设备回退或精细的设备过滤和选择),请考虑以下指导:

在伸缩期间提高节点可用性

借助 GKE 中的 ComputeClasses,您可以定义基于优先级的回退行为,供 GKE 在集群中创建新节点时遵循。 您可以使用 ComputeClasses 配置一系列优先级的节点和设备配置,供 GKE 在创建节点以运行工作负载时使用。然后,您可以使用 DRA 来确保工作负载可以在 ComputeClass 中的任何节点上运行,而无需按标签手动选择节点。

例如,某工作负载可能需要两个 NVIDIA L4 GPU 或一个 NVIDIA A100 (40 GB) GPU 才能以最佳状态运行。您可以创建一个 ComputeClass,该类优先创建具有一个 A100 (40 GB) GPU 的节点,但可以回退到创建每个节点具有两个 L4 GPU 的节点。然后,您可以使用 DRA 为工作负载请求任何可用的 GPU。当您部署工作负载并选择该 ComputeClass 时,GKE 会创建具有指定 GPU 配置之一的节点。借助 DRA,GKE 可以将工作负载放置在第一个可用节点上,而无需考虑 GPU 型号、节点标签或 GPU 数量。

如需了解详情,请参阅以下页面:

后续步骤