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

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

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

通过按需容量预留 (ODCR),您可以在特定可用区为集群 Amazon EC2 实例预留容量。通过这种方式,您可以独立于由节省计划区域性预留实例提供的账单账户创建和管理容量预留。

您可以配置opentargeted ODCR。开放式 ODCR 涵盖与 ODCR 属性匹配的所有实例。这些属性包括实例类型、平台和可用区。您必须在集群配置中显式定义定向 ODCR。要确定 ODC open R 是还是targeted,请运行 Amazon CLI Amazon EC2 describe-capacity-reservation命令。

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

ODCRs 可以将多个资源分组到一个资源组中。这可以在集群配置文件中定义。有关资源组的更多信息,请参阅 Resource Groups and Tags User Guide 中的 What are resource groups?

将 ODCR 与 Amazon ParallelCluster

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

集群配置中的 ODCR

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

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

创建容量预留和资源组后,在 SlurmQueues/CapacityReservationTargetSlurmQueues/ComputeResources/CapacityReservationTarget 中指定它们,如以下集群配置示例所示。用您的有效值替换以红色values突出显示的内容。

Image: Os: os HeadNode: InstanceType: head_node_instance Networking: SubnetId: public_subnet_id Ssh: KeyName: key_name Scheduling: Scheduler: scheduler SlurmQueues: - Name: queue1 Networking: SubnetIds: - private_subnet_id ComputeResources: - Name: cr1 Instances: - InstanceType: instance MaxCount: max_queue_size MinCount: max_queue_size Efa: Enabled: true CapacityReservationTarget: CapacityReservationResourceGroupArn: capacity_reservation_arn
警告
  • 从 3.3.0 Amazon ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

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

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

ODCRs 可以将多个资源分组到一个资源组中。这可以用在运行实例覆盖中,以同时定位多个 ODCRs 实例。

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

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

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

将预留实例与 Amazon ParallelCluster

预留实例不同于容量预留 (ODCR)。预留实例有两种类型区域性预留实例不预留容量。分区预留实例可在指定可用区中预留容量。

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

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

使用分区预留实例时,您可以不在集群配置中指定置放群组,从而避免潜在的容量不足错误。

警告
  • 从 3.3.0 Amazon ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

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

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

  • ${queue_name} 是要对其应用覆盖的队列的名称。

  • ${compute_resource_name} 是要对其应用覆盖的计算资源。

  • ${overrides} 是包含用于队列和实例类型特定组合的 RunInstances 覆盖列表的任意 JSON 对象。覆盖语法必须遵循与 run_instances boto3 调用中记录的规范相同的规范。

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

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

{     "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>
警告
  • 从 3.3.0 Amazon ParallelCluster 版开始,我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。

  • 此方法与 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 账户 身份证和REGION_ID你的 Amazon Web Services 区域 身份证(例如 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 存储桶。amzn-s3-demo-bucket替换为您特定的 S3 存储桶名称。

    $ aws s3 mb s3://amzn-s3-demo-bucket aws s3 cp postinstall.sh s3://amzn-s3-demo-bucket/postinstall.sh
  4. 创建本地集群配置,将占位符替换为您自己的值。

    Region: REGION_ID Image:   Os: alinux2 HeadNode:   InstanceType: c5.2xlarge   Ssh:     KeyName: YOUR_SSH_KEY   Iam:     S3Access:       - BucketName: amzn-s3-demo-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://amzn-s3-demo-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替换为配置文件名、cluster-dl集群REGION_ID名称和区域 ID(例如 us-east-1)。

    $ 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 来回收节点,然后等待替换这些节点。为此,您可以从 Amazon 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