

 **帮助改进此页面** 

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

# 使用适用于机器学习的容量块创建自行管理的节点
<a name="capacity-blocks"></a>

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

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

**重要**  
容量块仅适用于某些 Amazon EC2 实例类型和 AWS 区域。有关兼容性信息，请参阅《Amazon EC2 用户指南（适用于 Linux 实例）**》中的[使用容量块](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-blocks-using.html#capacity-blocks-prerequisites)。
如果您在容量预留变为活动状态之前创建自行管理的节点组，请将所需容量设置为 `0`。
为了留出足够的时间来正常地耗尽节点，我们建议您在容量块预留结束时间前 30 分钟计划扩展至零。
为确保能正常耗尽容器组（pod），我们建议按照示例步骤中的说明设置 AWS 节点终止处理程序。

## 将容量块与自行管理的节点配合使用
<a name="capacity-blocks-procedure"></a>

您可以将容量块与 Amazon EKS 配合使用来预置和扩展自己的自行管理节点。以下步骤给出了一般的示例概述。AWS CloudFormation 模板示例并未涵盖生产工作负载所需的各个方面。通常，您还需要一个引导脚本才能将节点加入集群，其中应指定一个由 Amazon EKS 加速的 AMI，以及用于加入集群的适当实例配置文件。有关更多信息，请参阅 [创建自行管理的 Amazon Linux 节点](launch-workers.md)。

1. 创建适合工作负载的启动模板。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[将容量块用于机器学习工作负载](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-template-capacity-blocks.html)。

   确保 `LaunchTemplateData` 包含以下内容：
   +  对于 `InstanceMarketOptions`，将 `MarketType` 设置为 `"capacity-block"` 
   +  `CapacityReservationSpecification: CapacityReservationTarget`，将 `CapacityReservationId` 设置为该容量块（例如：`cr-02168da1478b509e0 `）
   +  `IamInstanceProfile`，将 `Arn` 设置为适用的 *iam-instance-profile-arn* 
   +  将 `ImageId` 设置为适用的 *image-id* 
   +  将 `InstanceType` 设置为支持容量块的实例类型（例如：*p5.48xlarge*）
   +  将 `SecurityGroupIds` 设置为适用的 ID（例如：*sg-05b1d815d1EXAMPLE*）
   +  将 `UserData` 设置您自行管理的节点组的适用 *user-data*

     以下 CloudFormation 模板节选将创建一个以容量块为目标的启动模板。

     ```
     NodeLaunchTemplate:
       Type: "aws::EC2::LaunchTemplate"
       Properties:
         LaunchTemplateData:
           InstanceMarketOptions:
             MarketType: "capacity-block"
           CapacityReservationSpecification:
             CapacityReservationTarget:
               CapacityReservationId: "cr-02168da1478b509e0"
           IamInstanceProfile:
             Arn: iam-instance-profile-arn
           ImageId: image-id
           InstanceType: p5.48xlarge
           KeyName: key-name
           SecurityGroupIds:
           - sg-05b1d815d1EXAMPLE
           UserData: user-data
     ```

     由于容量块是区域性的，因此必须将子网传递到进行预留的可用区。

1. 使用启动模板创建自行管理的节点组。如果您在容量预留变为活动状态之前执行此操作，请将所需容量设置为 `0`。创建节点组时，请确保仅为预留容量的可用区指定相应的子网。

   您在创建适合工作负载的模板时可以参考以下 CloudFormation 模板示例。此示例会获取上一步骤中所示 ` AWS::Amazon EC2::LaunchTemplate` 资源的 `LaunchTemplateId` 和 `Version`。它还会获取 `DesiredCapacity`、`MaxSize`、`MinSize` 和 `VPCZoneIdentifier` 的值，这些内容在同一模板的其他位置声明。

   ```
   NodeGroup:
     Type: "AWS::AutoScaling::AutoScalingGroup"
     Properties:
       DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity
       LaunchTemplate:
         LaunchTemplateId: !Ref NodeLaunchTemplate
         Version: !GetAtt NodeLaunchTemplate.LatestVersionNumber
       MaxSize: !Ref NodeAutoScalingGroupMaxSize
       MinSize: !Ref NodeAutoScalingGroupMinSize
       VPCZoneIdentifier: !Ref Subnets
       Tags:
         - Key: Name
           PropagateAtLaunch: true
           Value: !Sub ${ClusterName}-${NodeGroupName}-Node
         - Key: !Sub kubernetes.io/cluster/${ClusterName}
           PropagateAtLaunch: true
           Value: owned
   ```

1. 成功创建节点组后，请务必记录已创建节点组的 `NodeInstanceRole`。您需要此信息以确保在扩展节点组时，新节点会加入集群，并且 Kubernetes 能够识别节点。有关更多信息，请参阅[创建自行管理的 Amazon Linux 节点](launch-workers.md)中的 AWS 管理控制台说明。

1. 我们建议您为自动扩缩组创建与容量块预留时间保持一致的计划扩缩策略。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的 [Amazon EC2 Auto Scaling 的计划扩展](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-scheduled-scaling.html)。

   您可以在容量块结束时间前 30 分钟使用预留的所有实例。那时仍在运行的实例将开始终止。为了留出足够的时间来正常地耗尽节点，我们建议您在容量块预留结束时间前 30 分钟计划扩展至零。

   如果您想改为在容量预留变为 `Active` 时手动纵向扩展，则需要在容量块预留开始时更新自动扩缩组的所需容量。然后，您还需要在容量块预留结束前 30 多分钟手动缩减。

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

1. 为确保能正常耗尽容器组（pod），我们建议设置 AWS 节点终止处理程序。该处理程序将能够使用 EventBridge 监控来自 Amazon EC2 Auto Scaling 的“ASG 横向缩减”生命周期事件，并允许 Kubernetes 控制面板在实例不可用之前执行所需的操作。否则，容器组（pod）和 Kubernetes 对象将卡在待处理状态。有关更多信息，请参阅 GitHub 上的 [AWS 节点终止处理程序](https://github.com/aws/aws-node-termination-handler)。

   如果您没有设置节点终止处理程序，我们建议您在到达 30 分钟时段之前开始手动耗尽容器组（pod），这样就有充足的时间正常耗尽这些容器组。