本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 AWS PCS 中設定節點生命週期動作
您可以在運算節點群組組態中定義節點生命週期動作。本主題說明如何定義指令碼、控制是否在重新開機時重新執行、存放指令碼、傳遞引數、處理失敗、快取指令碼、驗證指令碼完整性,以及讀取其日誌。
代理程式版本需求
節點生命週期動作需要 AWS PCS 代理程式 1.5.0-1 版或更新版本。如果您的運算節點使用具有舊版代理程式的自訂 AMI,請在設定生命週期動作之前更新代理程式。如需詳細資訊,請參閱AWS PCS 代理程式版本。
如何定義指令碼
每個指令碼都有 name、scriptSource、選用 、 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。
控制重新啟動行為
設定executionPolicy每個指令碼以控制重新啟動時是否重新執行。
Value |
行為 |
使用情況 |
|---|---|---|
|
在節點第一次開機時執行指令碼一次。每次後續重新開機時,請略過它。 |
一次性設定,例如安裝套件、加入網域或初始化儲存體。您不需要將這些指令碼設為等冪。 |
|
在第一次開機和每次重新開機時執行指令碼。 |
重新啟動後必須重新套用的組態,例如重新掛載暫時性檔案系統或重新宣告節點狀態。 |
指令碼設定為FIRST_BOOT_ONLY執行一次,並在重新啟動時略過。指令碼設定為在每次開機時EVERY_BOOT執行,且應具有等冪性 (以相同結果安全地執行多次)。
指令碼儲存位置
您可以在 Amazon S3 中存放指令碼,或透過 HTTPS 提供指令碼。指令碼無法透過 API 內嵌上傳,而且每個指令碼不得超過 2 MiB — 代理程式會拒絕任何超過此大小的指令碼。
-
Amazon S3 (
s3://) — 執行個體 IAM 描述檔必須在 物件bucket/keys3:GetObject上具有 。透過 S3 閘道 VPC 端點,私有子網路中的節點可以透過 VPC 端點擷取指令碼。使用 固定特定版本scriptSource.s3VersionId(僅限 S3 位置)。 -
HTTPS (
https://) — 主機必須是可公開讀取的 (無身分驗證),且節點需要傳出網際網路存取 (網際網路閘道、NAT 閘道或 HTTP 代理)。這適用於 GitHub 或其他公有儲存庫上託管的指令碼。hostname/path
外部儲存提供版本控制、可稽核性和跨團隊重複使用。不支援內嵌或上傳的指令碼。
將引數傳遞至指令碼
將引數做為排序陣列傳遞。它們會以位置命令列參數的形式到達您的指令碼。
arguments: ["fs-12345678", "/shared", "nfs4"] # script.sh fs-12345678 /shared nfs4 ($1=fs-12345678, $2=/shared, $3=nfs4)
代理程式會將環境變數匯出至每個指令碼。這些變數包含叢集和節點中繼資料。
變數 |
Description |
|---|---|
|
叢集識別符/名稱 |
|
運算節點群組識別符/名稱 |
|
節點識別符 |
|
|
#!/usr/bin/env bash echo "Configuring node $PCS_NODE_ID in cluster $PCS_CLUSTER_NAME"
錯誤處理
每個指令碼都有一個 onError 欄位,可控制指令碼退出非零或被訊號終止時會發生的情況。
Value |
行為 |
使用情況 |
|---|---|---|
|
標記節點失敗並終止它。 |
關鍵設定 (儲存掛載、Active Directory 聯結)。防止支付損壞節點的費用。 |
|
停止階段中剩餘的指令碼;讓節點保持執行狀態。 |
除錯 - 在故障後檢查執行個體。 |
|
記錄錯誤並執行下一個指令碼。 |
選用或盡最大努力的任務。 |
如果指令碼結束非零或被訊號 (例如 ) 刪除,則指令碼會失敗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中為節點生命週期動作使用維護的指令碼。