使用适用于机器学习的容量块创建自行管理的节点 - Amazon EKS

使用适用于机器学习的容量块创建自行管理的节点

机器学习(ML)容量块允许您在未来某个日期预留 GPU 实例,从而支持您的短期 ML 工作负载。有关更多信息,请参阅《Amazon EC2 用户指南(适用于 Linux 实例)》中的适用于 ML 的容量块

注意事项

重要
  • 容量块仅适用于某些 Amazon EC2 实例类型和 AWS 区域。有关兼容性信息,请参阅《Amazon EC2 用户指南(适用于 Linux 实例)》中的使用容量块

  • 容量块目前不支持与 Karpenter 配合使用。

  • 如果您在容量预留变为活动状态之前创建自行管理的节点组,请将所需容量设置为 0

  • 为了留出足够的时间来正常地耗尽节点,我们建议您在容量块预留结束时间前 30 分钟计划扩展至零。

  • 为确保能正常耗尽 Pods,我们建议按照示例步骤中的说明设置 AWS Node Termination Handler。

将容量块与自行管理的节点配合使用

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

  1. 创建适合工作负载的启动模板。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的将容量块用于机器学习工作负载

    确保 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

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

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

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

    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
  3. 成功创建节点组后,请务必记录已创建节点组的 NodeInstanceRole。您需要此信息以确保在扩展节点组时,新节点会加入集群,并且 Kubernetes 能够识别节点。有关更多信息,请参阅创建自行管理的 Amazon Linux 节点中的 AWS Management Console说明。

  4. 我们建议您为 Auto Scaling 组创建与容量块预留时间保持一致的计划扩展策略。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南中的 Amazon EC2 Auto Scaling 的计划扩展

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

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

  5. 节点组现在已准备好计划工作负载和 Pods。

  6. 为了正常地耗尽您的 Pods,我们建议您设置 AWS 节点终止处理程序。该处理程序将能够使用 EventBridge 监视来自 Amazon EC2 Auto Scaling 的“ASG 横向缩减”生命周期事件,并允许 Kubernetes 控制面板在实例不可用之前执行所需的操作。否则,您的 Pods 和 Kubernetes 对象将停留在待处理状态。有关更多信息,请参阅 GitHub 上的 AWS 节点终止处理程序

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