

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 EKS 自动模式控制将工作负载部署到容量预留中
<a name="auto-odcr"></a>

您可以控制工作负载在[容量预留](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/capacity-reservation-overview.html)中的部署。EKS 自动模式支持 EC2 按需容量预留（ODCR）和适用于机器学习的 EC2 容量块。

**提示**  
默认情况下，EKS Auto Mode 可以通过开放匹配在开放 ODCR 中启动实例，但不会优先考虑这些 ODCR。通过开放匹配启动的实例会被标记为 `karpenter.sh/capacity-type: on-demand`，而不是 `reserved`。要优先使用 ODCR 并标记实例 `karpenter.sh/capacity-type: reserved`，请在 NodeClass 定义中配置 `capacityReservationSelectorTerms`。机器学习容量块始终需要 `capacityReservationSelectorTerms`，并且不会自动使用。

## EC2 按需容量预留（ODCR）
<a name="_ec2_on_demand_capacity_reservations_odcrs"></a>

通过使用 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
<a name="_example_nodeclass"></a>

```
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 容量块
<a name="_ec2_capacity_blocks_for_ml"></a>

机器学习容量块允许您在未来预留基于 GPU 的加速型计算实例，以支持短期机器学习（ML）工作负载。在容量块内运行的实例会自动紧密放置在 Amazon EC2 UltraClusters 中，以实现低延迟、PB 级非阻塞联网。

有关受支持的平台和实例类型的更多信息，请参阅《EC2 用户指南》中的 [ML 容量块](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html)。

您可以创建使用机器学习容量块的 EKS 自动模式 NodeClass，类似于 ODCR（如前所述）。

以下示例定义创建了三个资源：

1. 引用容量块预留的 NodeClass

1. 使用 NodeClass 并应用污点的 NodePool

1. 可以容忍污点并请求 GPU 资源的容器组（pod）规范

### 示例 NodeClass
<a name="_example_nodeclass_2"></a>

此 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 创建节点类](create-node-class.md)。

### 示例 NodePool
<a name="_example_nodepool"></a>

此 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 自动模式创建节点池](create-node-pool.md)。

### 示例容器组（pod）
<a name="_example_pod"></a>

此示例容器组（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](https://kubernetes.io/docs/concepts/workloads/pods/)。

### 相关资源
<a name="_related_resources"></a>
+  《Amazon EC2 用户指南》中的 [ML 容量块](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html)
+  《Amazon EC2 用户指南》中的[查找和购买容量块](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/capacity-blocks-purchase.html)
+  [管理 Amazon EKS 上人工智能/机器学习工作负载的计算资源](https://docs.amazonaws.cn/eks/latest/userguide/ml-compute-management.html) 
+  《EKS 最佳实践指南》中的 [GPU 资源优化和成本管理](https://docs.amazonaws.cn/eks/latest/best-practices/aiml-compute.html#_gpu_resource_optimization_and_cost_management)