使用 ODCR(按需容量预留)启动实例 - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 ODCR(按需容量预留)启动实例

通过使用按需容量预留(ODCR),您可以在特定可用区中为Amazon EC2实例预留容量达任意可用区。通过使用这种方式,您可以在Savings Plans 或区域留实例提供的账单账户中创建和管理容量预留。

您可以配置opentargeted按需容量预留(ODCR)。Ope@@ n ODCR 涵盖所有与 ODCR 属性相匹配的实例。这些属性是实例类型、平台和可用区。您必须在群集配置中明确定义目标 ODCR。要确定 ODCopen R 是还是targeted,请运行Amazon CLI EC2 describe-capacity-reservation命令。

您还可以在集群置放群组中创建 ODCR,该群集置放群组按需容量预留 (CPG ODCR)

可以将多个 ODCR 分组到一个资源组中。这可以在集群配置文件中定义。有关资源组的更多信息,请参阅什么是资源组? 在《Res ource Groups 和标签用户指南》中。

将 ODCR 与Amazon ParallelCluster

Amazon ParallelCluster支持打开的 ODCR。使用打开的 ODCR 时,您不需要在中指定任何内容Amazon ParallelCluster。系统会自动为集群选择实例。您可以指定现有置放群组或为自己Amazon ParallelCluster创建新组。

集群配置中的 ODCR

从Amazon ParallelCluster版本 3.3.0 开始,您可以在集群配置文件中定义 ODCR,无需指定 EC2 运行实例替代项。

首先,您可以使用每个预留容量资源组的链接文档中描述的方法创建容量预留和资源组。您必须使用这些Amazon CLI方法来创建容量预留组。如果您使用Amazon Web Services Management Console,则只能创建基于标签或基于堆栈的资源组。启动预留容量的实例Amazon CLI时,也不支持基于标签和基于堆栈的资源组。Amazon ParallelCluster

创建容量预留和资源组后,在 SlurmQueues/CapacityReservationTargetSlurmQueues//中对其进行定义CapacityReservationTargetComputeResources

警告
  • 从Amazon ParallelCluster版本 3.3.0 开始,我们不推荐使用此方法。本节仍然作为使用先前版本实现的参考。

  • 此方法与 Slurm 的多实例类型分配不兼容。

Amazon ParallelCluster3.1.1 中增加了targeted对 ODCR 的Support。在此版本中,引入了一种机制,该机制可覆盖 EC2RunInstances 参数并传递有关预留的信息,以供中每个配置的计算资源使用Amazon ParallelCluster。此机制与targeted ODCR 兼容。但是,在使用targeted ODCR 时,必须指定run-instances替代配置。必须在Amazon CLI EC2 run-instances命令中明确定义@@ 目标 ODCR。要确定 ODCR 是,open还是targeted运行Amazon CLI EC2 命令describe-capacity-reservation

可以将多个 ODCR 分组到一个资源组中。这可以在运行实例重写中使用,以同时将多个 ODCR 作为目标。

如果您使用的是targeted ODCR,则可以指定置放群组。但是,您还需要指定run-instances替代配置。

假设已为您Amazon创建了targeted ODCR 或者您有一组特定的预留实例。然后,您无法指定置放群组。配置的规则Amazon可能与置放群组设置冲突。因此,如果您的应用程序需要置放群组,请使用 CPG ODCR。在上述任何一种情况下,您还必须指定run-instances替代配置。

如果您使用的是 CPG ODCR,则必须指定run-instances替代配置,并且必须在群集配置中指定相同的置放组。

将预留实例与Amazon ParallelCluster

预留实例不同于容量预留 (ODCR)。预留实例有 2 种类型区域预留实例不预留容量。可用区Reserve d Instance可在指定可用区中预留容量。

如果您有区域预留实例,则没有容量预留,并且可能会出现容量不足错误。如果您有区域预留实例,则可以预留容量,但没有run-instances API 参数可用于指定它们。

任何Amazon ParallelCluster版本都支持预留实例。您无需在中指定任何内容Amazon ParallelCluster,即可自动选择实例。

使用区域预留实例时,您可以通过在集群配置中省略置放群组规格来避免潜在的容量不足错误。

警告
  • 从Amazon ParallelCluster版本 3.3.0 开始,我们不推荐使用此方法。本节仍然作为使用先前版本实现的参考。

  • 此方法与 Slurm 的多实例类型分配不兼容。

您可以重写集群队列中配置的每种计算资源的 EC2RunInstances 参数。为此,请在集群的头节点上创建包含以下代码片段内容的/opt/slurm/etc/pcluster/run_instances_overrides.json文件:

  • ${queue_name}是您要对其应用替代的队列的名称。

  • ${compute_resource_name}是您要对其应用重写的计算资源。

  • ${overrides}是一个任意 JSON 对象,其中包含用于队列和实例类型的特定组合的RunInstances覆盖列表。替代语法需要遵循与 run_ instances boto3 调用中记录的相同规范。

{     "${queue_name}": {         "${compute_resource_name}": {             ${overrides}         },         ...     },     ... }

例如,以下 JSON 将 ODCR 组配置group_arn为用于在my-queue和中配置的p4d.24xlarge实例my-compute-resource

{     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationResourceGroupArn": "group_arn"                 }             }         }     } }

生成此 JSON 文件后,负责集群扩展的Amazon ParallelCluster守护程序会自动使用替代配置来启动实例。要确认指定参数用于实例配置,请查看以下日志文件:

  • /var/log/parallelcluster/clustermgtd(用于静态容量)

  • /var/log/parallelcluster/slurm_resume.log(用于动态容量)

如果参数正确,你会发现一个包含以下内容的日志条目:

Found RunInstances parameters override. Launching instances with: <parameters_list>
警告
  • 从Amazon ParallelCluster版本 3.3.0 开始,我们不推荐使用此方法。本节仍然作为使用先前版本实现的参考。

  • 此方法与不兼容使用 Slurm 分配多实例类型

  1. 创建资源组,对容量进行分组。

    $ aws resource-groups create-group --name EC2CRGroup \   --configuration '{"Type":"Amazon::EC2::CapacityReservationPool"}' '{"Type":"Amazon::ResourceGroups::Generic", "Parameters": [{"Name": "allowed-resource-types", "Values": ["Amazon::EC2::CapacityReservation"]}]}'
    注意

    资源组不支持其他账户共享的资源。

    如果目标 ODCR 由其他账户共享,则无需创建资源组。在步骤 3 中使用CapacityReservationId代替资源组。

    #!/bin/bash set -e # Override run_instance attributes cat > /opt/slurm/etc/pcluster/run_instances_overrides.json << EOF {     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationId": "cr-abcdef01234567890"                 }             }         }     } } EOF

    向资源组添加容量预留。每次创建新的 ODCR 时,都要将其添加到群组预留中。ACCOUNT_ID替换为您的账户 ID、PLACEHOLDER_CAPACITY_RESERVATION容量预留 ID 和REGION_ID您的Amazon Web Services 区域 ID(例如 us-east-1)。

    $ aws resource-groups group-resources --region REGION_ID --group EC2CRGroup \   --resource-arns arn:aws:ec2:REGION_ID:ACCOUNT_ID:capacity-reservation/PLACEHOLDER_CAPACITY_RESERVATION

    在本地计算机中创建策略文档。ACCOUNT_ID替换为您的账户 ID REGION_ID和您的Amazon Web Services 区域 ID(例如 us-east-1)。

    cat > policy.json << EOF {     "Version": "2012-10-17",     "Statement": [         {             "Sid": "RunInstancesInCapacityReservation",             "Effect": "Allow",             "Action": "ec2:RunInstances",             "Resource": [                 "arn:aws:ec2:REGION_ID:ACCOUNT_ID:capacity-reservation/*",                 "arn:aws:resource-groups:REGION_ID:ACCOUNT_ID:group/*"             ]         }     ] } EOF
  2. Amazon Web Services 账户使用您创建的 json 文件为您创建 IAM 策略。

    $ aws iam create-policy --policy-name RunInstancesCapacityReservation --policy-document file://policy.json
  3. 在实例上本地创建以下安装后脚本并将其命名postinstall.sh

    ACCOUNT_ID替换为你的Amazon Web Services 账户 IDREGION_ID 和你的Amazon Web Services 区域 ID(例如 us-east-1)。

    #!/bin/bash set -e # Override run_instance attributes cat > /opt/slurm/etc/pcluster/run_instances_overrides.json << EOF {     "my-queue": {         "my-compute-resource": {             "CapacityReservationSpecification": {                 "CapacityReservationTarget": {                     "CapacityReservationResourceGroupArn": "arn:aws:resource-groups:REGION_ID:ACCOUNT_ID:group/EC2CRGroup"                 }             }         }     } } EOF

    将文件上载到 Amazon S3 存储桶。将 S3_NAME_BU CKET 替换为您的特定 S3 存储桶名称。

    $ aws s3 mb s3://S3_NAME_BUCKET aws s3 cp postinstall.sh s3://S3_NAME_BUCKET/postinstall.sh
  4. 创建本地集群配置,用您自己的值替换占位符。

    Region: REGION_ID Image:   Os: alinux2 HeadNode:   InstanceType: c5.2xlarge   Ssh:     KeyName: YOUR_SSH_KEY   Iam:     S3Access:       - BucketName: S3_NAME_BUCKET     AdditionalIamPolicies:       - Policy: arn:aws:iam::ACCOUNT_ID:policy/RunInstancesCapacityReservation   ## This post-install script is executed after the node is configured.   ## It is used to install scripts at boot time and specific configurations   ## In the script below we are overriding the calls to RunInstance to force   ## the provisioning of our my-queue partition to go through   ## the On-Demand Capacity Reservation   CustomActions:     OnNodeConfigured:       Script: s3://S3_NAME_BUCKET/postinstall.sh   Networking:     SubnetId: YOUR_PUBLIC_SUBNET_IN_TARGET_AZ Scheduling:   Scheduler: slurm   SlurmQueues:     - Name: my-queue       ComputeResources:         - MinCount: 0           MaxCount: 100           InstanceType: p4d.24xlarge           Name: my-compute-resource           Efa:             Enabled: true       Networking:         ## PlacementGroup:         ##   Enabled: true ## Keep PG disabled if using targeted ODCR         SubnetIds:           - YOUR_PRIVATE_SUBNET_IN_TARGET_AZ
  5. 创建集群。

    使用以下命令创建集群。cluster-config.yaml替换为配置文件名和集群名称,将 REGION _ID 替换为区域 ID(例如 us-east-1)。cluster-dl

    $ pcluster create-cluster --cluster-configuration cluster-config.yaml --cluster-name cluster-dl --region REGION_ID

    创建集群后,安装后脚本将在头节点中运行。该脚本创建run_instances_overrides.json文件并覆盖强制通过按需容量预留来配置分区的调用。RunInstances

    负责集群扩展的Amazon ParallelCluster守护程序会自动将此配置用于启动的新实例。要确认指定参数用于预置实例,您可以查看以下日志文件:

    • /var/log/parallelcluster/clustermgtd(用于静态容量-MinCount > 0

    • /var/log/parallelcluster/slurm_resume.log(用于动态容量)

    如果参数正确,您会发现日志条目包含以下内容。

    Found RunInstances parameters override. Launching instances with: <parameters_list>

更新RunInstances替代项

您可以随时更新生成的 JSON 配置,而无需停止计算队列。应用更改后,所有新实例将使用更新的配置启动。如果您需要将更新的配置应用于正在运行的节点,请通过强制终止实例Amazon ParallelCluster来回收节点,然后等待替换这些节点。为此,您可以从 EC2 控制台终止实例Amazon CLI,或者将 Slurm 节点设置为DOWNDRAIN状态。

使用以下命令将Slurm节点设置为DOWNDRAIN

$ scontrol update nodename=my-queue-dy-my-compute-resource-1 state=down reason=your_reason scontrol update nodename=my-queue-dy-my-compute-resource-1 state=drain reason=your_reason