

 **帮助改进此页面** 

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

# 创建带适用于机器学习的容量块的托管式节点组
<a name="capacity-blocks-mng"></a>

机器学习（ML）容量块允许您在未来某个日期预留 GPU 实例，从而支持您的短期 ML 工作负载。有关更多信息，请参阅《Amazon EC2 用户指南（适用于 Linux 实例）**》中的[适用于 ML 的容量块](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html)。

## 注意事项
<a name="capacity-blocks-mng-considerations"></a>

**重要**  
容量块仅适用于某些 Amazon EC2 实例类型和 Amazon 区域。有关兼容性信息，请参阅《Amazon EC2 用户指南（适用于 Linux 实例）**》中的[使用容量块](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/capacity-blocks-using.html#capacity-blocks-prerequisites)。
有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[将容量块用于机器学习工作负载](https://docs.amazonaws.cn/autoscaling/ec2/userguide/launch-template-capacity-blocks.html)。
带有容量块的托管式节点组只能使用自定义启动模板创建。
升级带有容量块的托管式节点组时，请务必将所需的节点组大小设置为 `0`。

## 创建带有 Amazon EC2 容量块的托管式节点组
<a name="capacity-blocks-mng-procedure"></a>

您可以将容量块与 Amazon EKS 托管式节点组配合使用来预置和扩展由 GPU 加速的 Worker 节点。下面的 Amazon CloudFormation 模板示例并未涵盖生产集群所需的各个方面。通常，您还需要一个引导脚本来将节点加入集群，并指定由 Amazon EKS 加速的 AMI。有关更多信息，请参阅 [为集群创建托管式节点组](create-managed-node-group.md)。

1. 创建适合工作负载并且可与 Amazon EKS 托管节点组结合使用的启动模板。有关更多信息，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。

   除了上述过程中的要求外，还要确保 `LaunchTemplateData` 包括以下内容：
   +  对于 `InstanceMarketOptions`，将 `MarketType` 设置为 `"capacity-block"` 
   +  `CapacityReservationSpecification: CapacityReservationTarget`，将 `CapacityReservationId` 设置为该容量块（例如：`cr-02168da1478b509e0 `）
   +  将 `InstanceType` 设置为支持容量块的实例类型（例如：*p5.48xlarge*）

     以下 CloudFormation 模板节选将创建一个以容量块为目标的启动模板。要创建自定义 AMI 托管式节点组，您还可以添加 `ImageId` 和 `UserData` 参数。

     ```
     NodeLaunchTemplate:
       Type: "Amazon::EC2::LaunchTemplate"
       Properties:
         LaunchTemplateData:
           InstanceMarketOptions:
             MarketType: "capacity-block"
           CapacityReservationSpecification:
             CapacityReservationTarget:
               CapacityReservationId: "cr-02168da1478b509e0"
           InstanceType: p5.48xlarge
     ```

1. 使用启动模板创建托管式节点组。

   以下是容量块的创建节点组命令示例。将 *example-values* 替换为适用于集群的相应值。

   创建容量块托管式节点组时，请执行以下操作：
   + 将 `capacity-type` 设置为 `"CAPACITY_BLOCK"`。如果容量类型未设置为`"CAPACITY_BLOCK"` 或者缺失上述任何其他必需的启动模板值，则创建请求将被拒绝。
   + 在创建请求中指定 `subnets` 时，请确保仅在与容量预留相同的可用区中指定子网。
   + 如果在创建请求中指定某个非零 `desiredSize`，Amazon EKS 将在创建自动扩缩组（ASG）时遵守该值。但是，如果创建请求是在容量预留激活之前发出的，则在容量预留处于活动状态之前，ASG 将无法启动 Amazon EC2 实例。这样，ASG 扩缩活动将出现启动错误。每当预留变为活动状态时，实例将会成功启动，并且 ASG 将纵向扩展至创建时提到的 `desiredSize`。

     ```
     aws eks create-nodegroup \
         --cluster-name my-cluster \
         --nodegroup-name my-mng \
         --node-role node-role-arn \
         --region region-code \
         --subnets subnet-id \
         --scaling-config minSize=node-group-min-size,maxSize=node-group-max-size,desiredSize=node-group-desired-size \
         --ami-type "AL2023_x86_64_NVIDIA" \
         --capacity-type "CAPACITY_BLOCK" \
         --launch-template id="lt-id",version=1
     ```

1. 请确保节点在纵向扩展后加入。使用带容量块的托管节点组时，Amazon EKS 集群不会验证启动的实例确实已经加入并注册到集群。

1. 如果您在创建时将 `desiredSize` 设置为 `0`，则在容量预留变为活动状态时，您可通过不同的选项来纵向扩展节点组：
   + 为 ASG 创建与容量块预留时间保持一致的计划扩缩策略。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的 [Amazon EC2 Auto Scaling 的计划扩展](https://docs.amazonaws.cn/autoscaling/ec2/userguide/ec2-auto-scaling-scheduled-scaling.html)。
   + 使用 Amazon EKS 控制台或 `eks update-nodegroup-config` 更新扩缩配置并设置所需的节点组大小。
   + 使用 Kubernetes Cluster Autoscaler。有关更多信息，请参阅 [Amazon 上的 Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)。

1. 节点组现已准备就绪，可供计划工作负载和容器组（pod）。

1. 为确保能够在预留结束之前正常耗尽容器组（pod），Amazon EKS 使用计划扩缩策略将节点组大小缩减到 `0`。此计划扩缩策略的名称将设置为 `Amazon EKS Node Group Capacity Scaledown Before Reservation End`。我们建议不要编辑或删除此操作。

   Amazon EC2 会在预留结束前 30 分钟开始关闭实例。因此，Amazon EKS 将在预留结束前 40 分钟设置节点组计划缩减，以便安全、正常地退出容器组（pod）。