使用适用于机器学习的容量块创建自行管理的节点
机器学习(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 节点。
-
创建适合工作负载的启动模板。有关更多信息,请参阅《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
由于容量块是区域性的,因此必须将子网传递到进行预留的可用区。
-
-
使用启动模板创建自行管理的节点组。如果您在容量预留变为活动状态之前执行此操作,请将所需容量设置为
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
-
成功创建节点组后,请务必记录已创建节点组的
NodeInstanceRole
。您需要此信息以确保在扩展节点组时,新节点会加入集群,并且 Kubernetes 能够识别节点。有关更多信息,请参阅创建自行管理的 Amazon Linux 节点中的 AWS Management Console说明。 -
我们建议您为 Auto Scaling 组创建与容量块预留时间保持一致的计划扩展策略。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南中的 Amazon EC2 Auto Scaling 的计划扩展。
您可以在容量块结束时间前 30 分钟使用预留的所有实例。那时仍在运行的实例将开始终止。为了留出足够的时间来正常地耗尽节点,我们建议您在容量块预留结束时间前 30 分钟计划扩展至零。
如果您想改为在容量预留变为
Active
时手动纵向扩展,则需要在容量块预留开始时更新自动扩缩组的所需容量。然后,您还需要在容量块预留结束前 30 多分钟手动缩减。 -
节点组现在已准备好计划工作负载和 Pods。
-
为了正常地耗尽您的 Pods,我们建议您设置 AWS 节点终止处理程序。该处理程序将能够使用 EventBridge 监视来自 Amazon EC2 Auto Scaling 的“ASG 横向缩减”生命周期事件,并允许 Kubernetes 控制面板在实例不可用之前执行所需的操作。否则,您的 Pods 和 Kubernetes 对象将停留在待处理状态。有关更多信息,请参阅 GitHub 上的 AWS 节点终止处理程序
。 如果您没有设置节点终止处理程序,我们建议您在到达 30 分钟时段之前开始手动耗尽Pods,这样就有充足的时间正常地耗尽这些节点。