

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用隨需容量預留 (ODCR) 啟動執行個體
<a name="launch-instances-odcr-v3"></a>

使用[隨需容量保留 (ODCR)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html)，您可以為特定可用區域中的叢集 Amazon EC2 執行個體保留容量。如此一來，您就可以獨立於 [Savings Plans](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)命令。

您也可以在稱為叢集置放群組[隨需容量保留 (CPG ODCR) 的叢集置放群組中建立 ODCR](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html)。

多個 ODCRs 可以在資源群組中分組。這可以在叢集組態檔案中定義。如需資源群組的詳細資訊，請參閱[《資源群組和標籤使用者指南》中的什麼是](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>

從 3.3.0 AWS ParallelCluster 版開始，您可以在叢集組態檔案中定義 ODCRs，而不需要指定 Amazon EC2 run-instances 覆寫。

您可以從使用每個 連結文件中描述的方法建立[容量保留](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)，如下列範例叢集組態所示。以您的有效*值*取代以紅色反白顯示的值。

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

### OBSOLETE/不建議 - 具有 Amazon EC2 執行個體覆寫的目標 ODCR
<a name="odcr-parallelcuster-override-v3"></a>

**警告**  
從 3.3.0 AWS ParallelCluster 版開始，我們不建議使用此方法。本節會保留為使用舊版的實作參考。
此方法與 Slurm 的多個執行個體類型配置不相容。

 AWS ParallelCluster 3.1.1 中新增了對 `targeted` ODCRs支援。在此版本中，推出了一種機制，可覆寫 EC2 `RunInstances` 參數並傳遞有關保留的資訊，以用於 中每個設定的運算資源 AWS ParallelCluster。此機制與 `targeted` ODCR 相容。不過，當您使用 `targeted` ODCR 時，您必須指定`run-instances`覆寫組態。必須在 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)命令中明確定義*目標 *ODCRs。判斷 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 可以在資源群組中分組。這可用於 Run-instances 覆寫，以同時鎖定多個 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>

預留執行個體與容量預留 (ODCR) [不同](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html#capacity-reservations-differences)。預留執行個體有 [2 種類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/reserved-instances-scope.html)。*區域*預留執行個體不會保留容量。*區域*預留執行個體會在指定的可用區域中保留容量。

如果您有區域預留執行個體，則不會保留容量，而且可能會收到容量不足的錯誤。如果您有區域預留執行個體，您有容量保留，但沒有可用於指定它們的 `run-instances` API 參數。

任何 AWS ParallelCluster 版本都支援預留執行個體。您不需要在 中指定任何內容， AWS ParallelCluster 而且會自動選取執行個體。

使用區域預留執行個體時，您可以省略叢集組態中的置放群組規格，以避免潛在的容量不足錯誤。

### OBSOLETE/不建議 - 使用`RunInstances`自訂 in AWS ParallelCluster 3 進行隨需容量保留 `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\$1instances](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`和 中設定的`p4d.24xlarge`執行個體`my-compute-resource`。

```
{
    "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>
```

### OBSOLETE/不建議 - 使用隨`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 帳戶 ID，並將 `REGION_ID`取代為您的 AWS 區域 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 儲存貯體。將 *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\$1ID* 取代為您的區域 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
```