View a markdown version of this page

在 AWS PCS 中設定節點生命週期動作 - AWS PCS

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

在 AWS PCS 中設定節點生命週期動作

您可以在運算節點群組組態中定義節點生命週期動作。本主題說明如何定義指令碼、控制是否在重新開機時重新執行、存放指令碼、傳遞引數、處理失敗、快取指令碼、驗證指令碼完整性,以及讀取其日誌。

代理程式版本需求

節點生命週期動作需要 AWS PCS 代理程式 1.5.0-1 版或更新版本。如果您的運算節點使用具有舊版代理程式的自訂 AMI,請在設定生命週期動作之前更新代理程式。如需詳細資訊,請參閱AWS PCS 代理程式版本

如何定義指令碼

每個指令碼都有 namescriptSource、選用 、 argumentsonError政策和 executionPolicy。位置和完整性欄位會在 下分組scriptSource

{ "name": "My script", "scriptSource": { "scriptLocation": "s3://my-bucket/my-script.sh", "s3VersionId": "optional, S3 only", "checksum": "optional 64-char SHA-256 hex" }, "arguments": ["arg1", "arg2"], "onError": "TERMINATE", "executionPolicy": "FIRST_BOOT_ONLY" }

將生命週期動作新增至運算節點群組

您可以在建立或更新運算節點群組時新增生命週期動作。使用 AWS 管理主控台 或 AWS CLI。

AWS 管理主控台
使用主控台新增生命週期動作
  1. 開啟 AWS PCS 主控台

  2. 開啟運算節點群組的建立或更新頁面。

  3. 節點生命週期動作區段中,選擇新增指令碼

  4. 選取指令碼來源:

    1. 從 AWS PCS 指令碼程式庫新增 - 參考 AWS維護的指令碼。如需詳細資訊,請參閱在 AWS PCS AWS中為節點生命週期動作使用維護的指令碼

    2. 透過 S3 新增 – 透過其 Amazon S3 URI 參考指令碼。

    3. 透過 HTTPS 新增 - 透過 HTTPS URL 參考指令碼。

  5. 選取節點階段。

  6. 對於您透過 S3 或 HTTPS 新增的指令碼,請指定下列設定:

    1. 指令碼位置 – 輸入指令碼的 S3 URI 或 HTTPS URL。

    2. 名稱 – 輸入指令碼的名稱。

    3. (選用) 檢查總和 – 輸入 SHA-256 檢查總和以驗證指令碼的完整性。如需詳細資訊,請參閱指令碼完整性 (總和檢查)

    4. (選用) 對於您透過 S3 新增的指令碼,輸入版本以參考物件的特定版本。

  7. 對於所有指令碼來源,請指定下列設定:

    1. 錯誤處理行為 – 選取 TERMINATESTOP_SEQUENCECONTINUE

    2. 執行政策 – 選取 FIRST_BOOT_ONLYEVERY_BOOT

    3. (選用) 引數 – 新增要傳遞至指令碼的引數。

  8. 若要新增更多指令碼,請重複這些步驟。

  9. 指令碼會在階段內從上到下執行。若要變更執行順序,請選擇指令碼的動作,然後選擇上移下移

  10. 針對快取政策,選取 CACHE_ONCEREFRESH_ON_REBOOT。快取政策適用於所有指令碼。如需詳細資訊,請參閱指令碼快取和更新

AWS CLI

使用 --node-lifecycle-actions 參數搭配 create-compute-node-groupupdate-compute-node-group命令。如需參數結構,請參閱 AWS PCS API 參考中的 NodeLifecycleActionsRequest。如需範例命令,請參閱 AWS PCS 的節點生命週期動作範例

控制重新啟動行為

設定executionPolicy每個指令碼以控制重新啟動時是否重新執行。

Value

行為

使用情況

FIRST_BOOT_ONLY (default)

在節點第一次開機時執行指令碼一次。每次後續重新開機時,請略過它。

一次性設定,例如安裝套件、加入網域或初始化儲存體。您不需要將這些指令碼設為等冪。

EVERY_BOOT

在第一次開機每次重新開機時執行指令碼。

重新啟動後必須重新套用的組態,例如重新掛載暫時性檔案系統或重新宣告節點狀態。

指令碼設定為FIRST_BOOT_ONLY執行一次,並在重新啟動時略過。指令碼設定為在每次開機時EVERY_BOOT執行,且應具有等冪性 (以相同結果安全地執行多次)。

指令碼儲存位置

您可以在 Amazon S3 中存放指令碼,或透過 HTTPS 提供指令碼。指令碼無法透過 API 內嵌上傳,而且每個指令碼不得超過 2 MiB — 代理程式會拒絕任何超過此大小的指令碼。

  • Amazon S3 (s3://bucket/key) — 執行個體 IAM 描述檔必須在 物件s3:GetObject上具有 。透過 S3 閘道 VPC 端點,私有子網路中的節點可以透過 VPC 端點擷取指令碼。使用 固定特定版本 scriptSource.s3VersionId(僅限 S3 位置)。

  • HTTPS (https://hostname/path) — 主機必須是可公開讀取的 (無身分驗證),且節點需要傳出網際網路存取 (網際網路閘道、NAT 閘道或 HTTP 代理)。這適用於 GitHub 或其他公有儲存庫上託管的指令碼。

外部儲存提供版本控制、可稽核性和跨團隊重複使用。不支援內嵌或上傳的指令碼。

將引數傳遞至指令碼

將引數做為排序陣列傳遞。它們會以位置命令列參數的形式到達您的指令碼。

arguments: ["fs-12345678", "/shared", "nfs4"] # script.sh fs-12345678 /shared nfs4 ($1=fs-12345678, $2=/shared, $3=nfs4)

代理程式會將環境變數匯出至每個指令碼。這些變數包含叢集和節點中繼資料。

變數

Description

PCS_CLUSTER_ID / PCS_CLUSTER_NAME

叢集識別符/名稱

PCS_COMPUTE_NODE_GROUP_ID / PCS_COMPUTE_NODE_GROUP_NAME

運算節點群組識別符/名稱

PCS_NODE_ID

節點識別符

PCS_IS_FIRST_BOOT

1 節點第一次開機時,每次後續重新開機0時。用來在EVERY_BOOT指令碼中分支行為。

#!/usr/bin/env bash echo "Configuring node $PCS_NODE_ID in cluster $PCS_CLUSTER_NAME"

錯誤處理

每個指令碼都有一個 onError 欄位,可控制指令碼退出非零或被訊號終止時會發生的情況。

Value

行為

使用情況

TERMINATE (default)

標記節點失敗並終止它。

關鍵設定 (儲存掛載、Active Directory 聯結)。防止支付損壞節點的費用。

STOP_SEQUENCE

停止階段中剩餘的指令碼;讓節點保持執行狀態。

除錯 - 在故障後檢查執行個體。

CONTINUE

記錄錯誤並執行下一個指令碼。

選用或盡最大努力的任務。

如果指令碼結束非零或被訊號 (例如 ) 刪除,則指令碼會失敗SIGSEGV指令碼不會重試。如果操作可能遇到暫時性失敗,請在指令碼內新增重試邏輯。不過,指令碼擷取 (下載) 會重試,在onError行為套用之前,最多 3 次嘗試呈指數退避 (最多約 17 秒)。

指令碼快取和更新

代理程式會在第一次開機時將每個指令碼下載到執行個體,並將其存放在本機。兩個欄位控制重新啟動時的行為:scriptCachingPolicy控制重新下載和executionPolicy控制重新執行。

  • CACHE_ONCE (預設) — 第一次開機時下載一次;永遠不要重新擷取。重新啟動時的行為相同。更新指令碼內容需要替換執行個體。

  • REFRESH_ON_REBOOT — 每次重新開機時重新下載,覆寫快取。這可讓您透過重新啟動來運送指令碼修正。它在每次開機時都需要網路存取權;如果重新整理失敗,下載會被視為擷取失敗,並且指令碼onError的行為適用 (快取複本沒有後援)。重新整理的指令碼只有在其executionPolicy為 時,才會在重新啟動時實際重新執行EVERY_BOOT

生命週期組態 (指令碼執行的項目、其引數、錯誤處理和執行政策) 永遠不會改變每個執行個體。透過 變更它只會UpdateComputeNodeGroup影響新的執行個體,並觸發DRAIN策略,讓執行中的任務在取代節點之前完成。

指令碼完整性 (總和檢查)

選擇性地在指令碼的 checksum中提供 SHA-256scriptSource,做為 64 個字元的十六進位字串。代理程式在下載時驗證它;不相符會被視為下載失敗並觸發 onError。我們建議生產的檢查總和,尤其是來自共用或外部來源的指令碼。

sha256sum mount-efs.sh # use the 64-char hex hash as the checksum value

記錄和偵錯

每個指令碼都會寫入自己的日誌檔案,而代理程式會保留自己的操作日誌。

# agent: download, caching, checksum, orchestration /var/log/amazon/pcs/lifecycle/actions/executor.log # each script's stdout/stderr /var/log/amazon/pcs/lifecycle/actions/<stage>/<script-name>.log

日誌檔案名稱會使用您定義的指令碼名稱。保留空間。例如,名為 的指令碼會Mount EFS home directory寫入 Mount EFS home directory.log。與 SSH 或 AWS Systems Manager Session Manager 連線以讀取它們,這兩者都可由nodeBootstrapped階段使用。由於TERMINATE取代了 故障的節點,因此請在終止後轉送日誌關閉執行個體以進行偵錯:新增節點引導指令碼,將 Amazon CloudWatch 代理程式設定為將生命週期日誌目錄傳送至 Amazon CloudWatch Logs。 AWS維護的configure-cloudwatch-logs.sh指令碼會執行此操作。如需詳細資訊,請參閱在 AWS PCS AWS中為節點生命週期動作使用維護的指令碼