帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
使用 EKS 自动模式控制将工作负载部署到容量预留中
您可以控制工作负载在容量预留中的部署。EKS 自动模式支持 EC2 按需容量预留(ODCR)和适用于机器学习的 EC2 容量块。
提示
默认情况下,EKS 自动模式会在开放式 ODCR 和机器学习容量块中自动启动。在 NodeClass 定义中使用 capacityReservationSelectorTerms 时,EKS 自动模式将不再自动使用任何开放容量预留。
EC2 按需容量预留(ODCR)
通过使用 EC2 按需容量预留(ODCR),您可以在特定可用区中为 Amazon EC2 实例预留计算容量达任意持续时间。使用 EKS 自动模式时,您可能想要控制是否将 Kubernetes 工作负载部署到这些预留实例上,以最大限度地利用预先购买的容量,或确保关键工作负载能够访问有保障的资源。
默认情况下,EKS 自动模式会在开放式 ODCR 中自动启动。但是,通过在 NodeClass 上配置 capacityReservationSelectorTerms,您可以显式控制工作负载使用的 ODCR。使用已配置的 ODCR 预置的节点将具有 karpenter.sh/capacity-type: reserved 并优先于按需和竞价型节点。启用此功能后,EKS 自动模式将不再自动使用开放式 ODCR – 其必须由 NodeClass 显式选择,这样您就可以精确控制集群中的容量预留使用情况。
警告
如果在集群中的 NodeClass 上配置了 capacityReservationSelectorTerms,则 EKS 自动模式将不再为集群中的任何 NodeClass 自动使用开放式 ODCR。
示例 NodeClass
apiVersion: eks.amazonaws.com/v1 kind: NodeClass spec: # Optional: Selects upon on-demand capacity reservations and capacity blocks # for EKS Auto Mode to prioritize. capacityReservationSelectorTerms: - id: cr-56fac701cc1951b03 # Alternative Approaches - tags: app: "my-app" # Optional owning account ID filter owner: "012345678901"
此示例 NodeClass 演示了两种选择 ODCR 的方法。第一种方法通过其 ID(cr-56fac701cc1951b03)直接引用特定 ODCR。第二种方法使用基于标签的选择,目标是带有标签 Name: "targeted-odcr" 的 ODCR。您还可以选择按拥有预留的 Amazon 账户进行筛选,这在跨账户场景或使用共享容量预留时特别有用。
适用于机器学习的 EC2 容量块
机器学习容量块允许您在未来预留基于 GPU 的加速型计算实例,以支持短期机器学习(ML)工作负载。在容量块内运行的实例会自动紧密放置在 Amazon EC2 UltraClusters 中,以实现低延迟、PB 级非阻塞联网。
有关受支持的平台和实例类型的更多信息,请参阅《EC2 用户指南》中的 ML 容量块。
您可以创建使用机器学习容量块的 EKS 自动模式 NodeClass,类似于 ODCR(如前所述)。
以下示例定义创建了三个资源:
-
引用容量块预留的 NodeClass
-
使用 NodeClass 并应用污点的 NodePool
-
可以容忍污点并请求 GPU 资源的容器组(pod)规范
示例 NodeClass
此 NodeClass 通过其预留 ID 来引用特定机器学习容量块。您可以从 EC2 控制台获取此 ID。
apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: gpu spec: # Specify your Capacity Block reservation ID capacityReservationSelectorTerms: - id: cr-56fac701cc1951b03
有关更多信息,请参阅 为 Amazon EKS 创建节点类。
示例 NodePool
此 NodePool 引用 gpu NodeClass 并指定重要的配置:
-
其仅通过设置
karpenter.sh/capacity-type: reserved来使用预留容量 -
其请求适用于机器学习工作负载的特定 GPU 实例系列
-
其应用
nvidia.com/gpu污点,确保只在这些节点上调度 GPU 工作负载
apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: template: spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: gpu requirements: - key: eks.amazonaws.com/instance-family operator: In values: - g6 - p4d - p4de - p5 - p5e - p5en - p6 - p6-b200 - key: karpenter.sh/capacity-type operator: In values: - reserved # Enable other capacity types # - on-demand # - spot taints: - effect: NoSchedule key: nvidia.com/gpu
有关更多信息,请参阅 为 EKS 自动模式创建节点池。
示例容器组(pod)
此示例容器组(pod)演示了如何将工作负载配置为在容量块节点上运行:
-
其使用 nodeSelector 来定位特定的 GPU 类型(在本例中为 H200 GPU)
-
其包括对 NodePool 应用的
nvidia.com/gpu污点的容忍度 -
其使用
nvidia.com/gpu资源类型明确请求 GPU 资源
apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: nodeSelector: # Select specific GPU type - uncomment as needed # eks.amazonaws.com/instance-gpu-name: l4 # eks.amazonaws.com/instance-gpu-name: a100 eks.amazonaws.com/instance-gpu-name: h200 # eks.amazonaws.com/instance-gpu-name: b200 eks.amazonaws.com/compute-type: auto restartPolicy: OnFailure containers: - name: nvidia-smi image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal args: - "nvidia-smi" resources: requests: # Uncomment if needed # memory: "30Gi" # cpu: "3500m" nvidia.com/gpu: 1 limits: # Uncomment if needed # memory: "30Gi" nvidia.com/gpu: 1 tolerations: - key: nvidia.com/gpu effect: NoSchedule operator: Exists
有关更多信息,请参阅 Kubernetes 文档中的 Pod
相关资源
-
《Amazon EC2 用户指南》中的 ML 容量块
-
《Amazon EC2 用户指南》中的查找和购买容量块
-
《EKS 最佳实践指南》中的 GPU 资源优化和成本管理