

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

# 使用按需容量预留（ODCR）启动实例
<a name="launch-instances-odcr-v3"></a>

使用[按需容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html)（ODCR），您可以为特定可用区中的集群 Amazon EC2 实例预留容量。通过这种方式，您可以独立于由[节省计划](https://aws.amazon.com/savingsplans/)或[区域性预留实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/reserved-instances-scope.html)提供的账单账户创建和管理容量预留。

您可以配置`open`或`targeted` ODCR。*开放式* ODCR 涵盖与 ODCR 属性匹配的所有实例。这些属性包括实例类型、平台和可用区。您必须在集群配置中显式定义*定向* ODCR。要确定 ODCR 是`open`还是`targeted`，请运行 AWS CLI Amazon EC2 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 命令。

您还可以在集群置放群组中创建 ODCR，称为[集群置放群组按需容量预留 (CPG ODCR)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html)。

 ODCRs 可以将多个资源分组到一个资源组中。这可以在集群配置文件中定义。有关资源组的更多信息，请参阅 *Resource Groups and Tags User Guide* 中的 [What are resource groups?](https://docs.aws.amazon.com/ARG/latest/userguide/resource-groups.html)。

## 将 ODCR 与 AWS ParallelCluster
<a name="odcr-parallelcuster-v3"></a>

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

### 集群配置中的 ODCR
<a name="odcr-parallelcuster-config-v3"></a>

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

您首先使用各自链接文档中描述的方法创建[容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-using.html)和[资源组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-cr-group.html)。您必须使用这些 AWS CLI 方法来创建容量预留组。如果您使用 AWS 管理控制台，则只能创建基于标签或基于堆栈的资源组。启动带有容量预留的实例 AWS CLI 时， AWS ParallelCluster 或不支持基于标签和基于堆栈的资源组。

创建容量预留和资源组后，在 [`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`CapacityReservationTarget`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-CapacityReservationTarget) 或 [`SlurmQueues`](Scheduling-v3.md#Scheduling-v3-SlurmQueues)/[`ComputeResources`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-ComputeResources)/[`CapacityReservationTarget`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-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}}
```

### 过时/不推荐 - 使用 Amazon EC2 实例覆盖的定向 ODCR
<a name="odcr-parallelcuster-override-v3"></a>

**警告**  
从 3.3.0 AWS ParallelCluster 版开始，我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
此方法与 Slurm 的多实例类型分配不兼容。

 AWS ParallelCluster 3.1.1 中增加了`targeted` ODCRs 对 Support 的支持。此版本中引入了一种机制，可覆盖 EC2 `RunInstances` 参数并传递有关要对 AWS ParallelCluster中配置的每个计算资源使用的预留的信息。该机制与`targeted` ODCR 兼容。但在使用`targeted` ODCR 时，必须指定 `run-instances` 覆盖配置。 ODCRs 必须在 AWS CLI Amazon EC2 [https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)命令中明确定义@@ *目标*。要确定 ODCR 是`open`还是`targeted`运行 AWS CLI Amazon EC2 命令[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html)。

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

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

假设为您 AWS 创建了一个 `targeted` ODCR，或者您有一组特定的预留实例。则您无法指定置放群组。由配置的规则 AWS 可能与置放群组设置冲突。因此，如果您的应用程序需要置放群组，请使用 [CPG ODCR](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html)。在任何一种情况下，您还必须指定 `run-instances` 覆盖配置。

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

### 将预留实例与 AWS ParallelCluster
<a name="odcr-reserved-instances"></a>

预留实例[不同于](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html#capacity-reservations-differences)容量预留 (ODCR)。预留实例有[两种类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/reserved-instances-scope.html)。*区域性*预留实例不预留容量。分区预留实例可在指定可用区中预留容量。

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

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

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

### 已过时/不推荐-使用 AWS ParallelCluster 3 中的`RunInstances`自定义功能进行`targeted`按需容量预留 (ODCR)
<a name="odcr-run-instances"></a>

**警告**  
从 3.3.0 AWS ParallelCluster 版开始，我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
此方法与 Slurm 的多实例类型分配不兼容。

您可以覆盖集群队列中配置的每个计算资源的 Amazon EC2 `RunInstances` 参数。为此，请在集群的头节点上创建包含以下代码片段内容的 `/opt/slurm/etc/pcluster/run_instances_overrides.json` 文件：
+ `${queue_name}` 是要对其应用覆盖的队列的名称。
+ `${compute_resource_name}` 是要对其应用覆盖的计算资源。
+ `${overrides}`是一个任意 JSON 对象，其中包含用于队列和实例类型特定组合的`RunInstances`替代列表。覆盖语法必须遵循与 [run\_instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.run_instances) boto3 调用中记录的规范相同的规范。

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

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

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

生成此 JSON 文件后，负责集群扩展的 AWS ParallelCluster 守护程序会自动使用覆盖配置启动实例。要确认实例预置是否使用了指定的参数，请查看以下日志文件：
+ `/var/log/parallelcluster/clustermgtd`（对于静态容量）
+ `/var/log/parallelcluster/slurm_resume.log`（对于动态容量）

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

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

### 过时/不推荐 - 创建包含 `targeted` 按需容量预留（ODCR）的集群
<a name="odcr-create-cluster"></a>

**警告**  
从 3.3.0 AWS ParallelCluster 版开始，我们不建议使用这种方法。本节仍然是使用先前版本的实施参考。
此方法与 [Slurm 的多实例类型分配](slurm-multiple-instance-allocation-v3.md)不兼容。

1. **创建资源组以对容量分组。**

   ```
   $ aws resource-groups create-group --name {{EC2CRGroup}} \ 
       --configuration '{"Type":"AWS::EC2::CapacityReservationPool"}' '{"Type":"AWS::ResourceGroups::Generic", "Parameters": [{"Name": "allowed-resource-types", "Values": ["AWS::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}}`您的 AWS 区域 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}}` AWS 区域 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
   ```

1. ** AWS 账户 使用您创建的 json 文件在您的上创建 IAM 策略。**

   ```
   $ aws iam create-policy --policy-name {{RunInstancesCapacityReservation}} --policy-document file://policy.json
   ```

1. **在实例上本地创建以下安装后脚本并将其命名为 `postinstall.sh`。**

   `{{ACCOUNT_ID}}`替换为你的 AWS 账户 身份证和`{{REGION_ID}}`你的 AWS 区域 身份证（例如 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
   ```

1. **创建本地集群配置，将占位符替换为您自己的值。**

   ```
   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}}
   ```

1. **创建集群。**

   使用以下命令来创建集群。`{{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` 的调用，以将分区强制预置为完成按需容量预留。

   负责集群扩展的 AWS ParallelCluster 守护程序会自动将此配置用于启动的新实例。要确认是否将指定的参数用于预置实例，您可以查看以下日志文件：
   + `/var/log/parallelcluster/clustermgtd`（对于静态容量 - [`MinCount`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-MinCount)` > 0`）
   + `/var/log/parallelcluster/slurm_resume.log`（对于动态容量）

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

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

 **更新 `RunInstances` 覆盖** 

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

使用以下命令将 Slurm 节点设置为 `DOWN` 或 `DRAIN`。

```
$ 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}}
```