在 MIG 中設定有狀態中繼資料

執行個體中繼資料可用於設定屬性,以及透過中繼資料伺服器與應用程式通訊。例如,您可以使用中繼資料設定虛擬機器 (VM) 執行個體的身分、環境變數、叢集架構相關資訊,或 VM 負責的資料範圍。

在代管執行個體群組 (MIG) 中設定有狀態的中繼資料,即可確保代管執行個體在自動修復、更新和重新建立事件中,保留執行個體專屬的中繼資料。

如要為 MIG 中的 VM 執行個體個別設定有狀態中繼資料,請在各執行個體設定中設定,然後套用設定。您可以在建立執行個體時,或針對現有的代管執行個體,設定個別執行個體。套用個別執行個體設定後,MIG 會將有狀態中繼資料儲存在代管執行個體的「preserved state from configuration」(從設定保留的狀態) (preservedStateFromConfig) 欄位中。

事前準備

  • 請參閱使用有狀態 MIG 的時機和有狀態 MIG 的運作方式。
  • 如果尚未設定驗證,請先完成設定。驗證機制會確認您的身分,以便授予 Google Cloud 服務和 API 的存取權。如要從本機開發環境執行程式碼或範例,您可以選取下列其中一個選項,向 Compute Engine 進行驗證:

    請根據您打算如何使用本頁範例,選取對應的分頁標籤:

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後,請執行下列指令,初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。
  • Terraform

    如要在本機開發環境中使用本頁的 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。

    1. 安裝 Google Cloud CLI。

    2. 若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    3. 如果您使用的是本機殼層,請為使用者帳戶建立本機驗證憑證:

      gcloud auth application-default login

      如果您使用的是 Cloud Shell,則不必執行這項操作。

      如果系統傳回驗證錯誤,且您使用的是外部識別資訊提供者 (IdP),請確認您已使用聯合身分登入 gcloud CLI。

    詳情請參閱「為本機開發環境設定驗證機制」。

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」一節。

限制

具有有狀態設定的 MIG (有狀態 MIG) 有下列限制:

  • 如果 MIG 具有有狀態設定,則無法使用自動調度資源或調度排程。如要排定有狀態 MIG 的啟動和停止作業,可以使用外部自動化工作流程。例如,使用 Cloud Scheduler 觸發 Cloud Run 函式,呼叫 MIG 專屬的 stopInstances 和 startInstances 方法。
  • 如要使用自動滾動式更新,請務必將替換方法設為 RECREATE。
  • 對於有狀態區域 MIG,您必須停用主動式重新分配 (將重新分配類型設為 NONE),以免自動跨可用區重新分配功能刪除有狀態執行個體。
  • 如果您使用所有執行個體通用的設定覆寫執行個體範本屬性,則無法在任何個別執行個體設定中指定這些屬性,同時在群組的所有執行個體通用設定中指定這些屬性。

  • 當您永久刪除執行個體 (手動或調整大小) 時,MIG 不會保留執行個體的有狀態中繼資料。

在建立執行個體時設定有狀態中繼資料

在 MIG 中手動建立執行個體時,設定有狀態的中繼資料。這項功能適用於將獨立 VM 上的有狀態應用程式遷移至有狀態 MIG,以及建立有狀態執行個體。

在 MIG 中手動建立執行個體並提供有狀態中繼資料時,MIG 會執行下列工作:

  1. 使用提供的執行個體名稱,根據執行個體範本建立代管執行個體。
  2. 使用提供的有狀態中繼資料建立個別執行個體設定,並在執行個體上設定該中繼資料。
  3. 將有狀態中繼資料儲存在相關聯代管執行個體設定 (preservedStateFromConfig) 的保留狀態中。

gcloud

如要建立自訂名稱的代管執行個體,並在該 VM 上設定有狀態的中繼資料,請使用 gcloud compute instance-groups managed create-instance 指令搭配 --stateful-metadata 旗標。

gcloud compute instance-groups managed create-instance NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...]

更改下列內容:

  • NAME:要在其中建立執行個體的 MIG 名稱
  • INSTANCE_NAME:要建立的執行個體名稱
  • KEY 和 VALUE:有狀態中繼資料鍵/值組合,除了執行個體範本中定義的中繼資料外,還可為執行個體個別設定
    • 您在這裡設定的金鑰值,優先於執行個體範本中任何衝突的金鑰值

範例

您需要部署節點叢集 example-cluster,該叢集可在 active 或 standby 兩種模式之一運作。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的記錄詳細程度,可設為 basic 或 elaborate。節點上的應用程式是使用執行個體中繼資料的值設定。

如要建立具有詳細記錄功能的作用中節點 node-12,請執行下列指令:

gcloud compute instance-groups managed create-instance example-cluster \
  --instance node-12 \
  --stateful-metadata mode=active,logging=elaborate

這個指令會在 example-cluster MIG 中建立 VM node-12,並為新執行個體設定兩個中繼資料鍵/值組合:mode:active 和 logging:elaborate。

Terraform

如要建立具有自訂名稱的代管執行個體,並在該 VM 上設定有狀態中繼資料,請使用 google_compute_per_instance_config 資源。

下列範例使用可用區 MIG。如果您還沒有可用區 MIG,請建立可用區 MIG,並將 VM 限制在單一可用區。

resource "google_compute_per_instance_config" "default" {
  instance_group_manager = google_compute_instance_group_manager.default.name
  zone                   = google_compute_instance_group_manager.default.zone
  name                   = "node-12"
  preserved_state {
    metadata = {
      mode    = "active"
      logging = "elaborate"
    }
  }
}

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

REST

如要在 MIG 中建立一或多個具有自訂 VM 名稱的代管執行個體,並在這些 VM 上個別設定有狀態中繼資料,請使用下列其中一種方法:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/createInstances
{
  "instances": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY" : "VALUE",
          ...
        }
      }
    },
    ...
  ]
}

更改下列內容:

  • PROJECT_ID:要求的專案 ID
  • ZONE:MIG 所在的可用區 (適用於可用區 MIG)
    • 如果是區域 MIG,請將 zones/ZONE 替換為 regions/REGION,並指定 MIG 的區域
  • NAME:要在其中建立執行個體的 MIG 名稱
  • INSTANCE_NAME:要建立的執行個體名稱
  • KEY 和 VALUE:有狀態中繼資料鍵/值組合,除了執行個體範本中定義的中繼資料外,還可為執行個體個別設定
    • 您在這裡設定的金鑰值,優先於執行個體範本中任何衝突的金鑰值

範例

您需要部署節點叢集 example-cluster,該叢集可在 active 或 standby 兩種模式之一運作。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的記錄詳細程度,可設為 basic 或 elaborate。節點上的應用程式是使用執行個體中繼資料的值設定。

如要建立具有詳細記錄檔的有效節點 node-12,請執行下列方法:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/createInstances

{
  "instances": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode":"active",
          "logging":"elaborate"
        }
      }
    }
  ]
}

這個方法會在 example-cluster MIG 中建立 VM node-12,並為新的執行個體設定兩個中繼資料鍵/值組合:mode:active 和 logging:elaborate。

為現有 VM 執行個體個別設定、修改及移除有狀態中繼資料

如要設定、修改或移除 MIG 中現有執行個體的有狀態中繼資料,請在相關聯的各執行個體設定中進行設定,然後更新執行個體來套用設定。

gcloud

如要為 MIG 中的 VM 執行個體個別設定有狀態中繼資料,請在相關聯的各執行個體設定中,設定或移除有狀態中繼資料。如果您同時將設定套用至執行個體 (--update-instance),可以選擇要讓執行個體保持運作、重新啟動或重新建立。如果不套用設定 (--no-update-instance),變更要等到重新建立或更新執行個體後才會生效。

如果特定執行個體沒有個別執行個體設定,請使用 gcloud compute instance-groups managed instance-configs create 指令,並搭配下列其中一個旗標:

gcloud compute instance-groups managed instance-configs create NAME \
  --instance INSTANCE_NAME \
  --stateful-metadata KEY=VALUE[,KEY=VALUE,...] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

如果特定執行個體已有個別執行個體設定,請使用 gcloud compute instance-groups managed instance-configs update 指令搭配:

  • 用於設定或修改中繼資料的 --stateful-metadata 旗標,或
  • 用於移除執行個體專屬有狀態中繼資料的 --remove-stateful-metadata 旗標。
gcloud compute instance-groups managed instance-configs update NAME \
  --instance INSTANCE_NAME \
  [--stateful-metadata KEY=VALUE[,KEY=VALUE,...]] \
  [--remove-stateful-metadata KEY[,KEY,...]] \
  [--no-update-instance | --update-instance] \
  [--instance-update-minimal-action MINIMAL_ACTION]

更改下列內容:

  • NAME:代管執行個體群組的名稱。
  • INSTANCE_NAME:要設定有狀態中繼資料的執行個體名稱。
  • KEY=VALUE:除了執行個體範本中定義的中繼資料外,還要為執行個體個別設定的有狀態中繼資料鍵/值組合。您在此設定的鍵值會優先於執行個體範本中任何衝突的鍵值。
  • KEY:要從各執行個體設定中移除的執行個體專屬有狀態中繼資料鍵。
    • 如果執行個體範本未定義鍵的值,則套用變更時,系統會從執行個體中完全移除鍵/值組合。
    • 如果執行個體範本定義了索引鍵的值,則套用變更時,系統會將執行個體範本的值設為執行個體的值。
  • MINIMAL_ACTION:將個別執行個體設定更新套用至執行個體時,至少執行指定動作。只有在使用 --update-instance 旗標時,才能設定 MINIMAL_ACTION。這個值必須是下列其中一項:

    • none:不採取任何行動。
    • refresh:套用可在不停止執行個體的情況下套用的更新。
    • restart:停止執行個體,然後重新啟動。
    • replace:重新建立執行個體。

    如未指定,系統會採用更新作業所需、干擾程度最低的動作。

範例

您有一個節點叢集 example-cluster,可在 active 或 standby 兩種模式之一運作。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的記錄詳細程度,可設為 basic 或 elaborate。每個節點上的應用程式都會取用執行個體中繼資料的值。

執行個體範本會定義 mode:active 和 logging:basic 中繼資料,做為所有執行個體的預設值。您已在叢集中 node-12 VM 的個別執行個體設定中設定 logging:elaborate。現在,您想將這部 VM 的 node-12 切換為待機模式,並將記錄功能切換為 basic。

如要將 node-12 執行個體切換為待命狀態,並將記錄功能切換為基本模式,請執行下列指令:

gcloud compute instance-groups managed instance-configs update example-cluster \
  --instance node-12 \
  --stateful-metadata mode=standby \
  --remove-stateful-metadata logging

這項指令會執行以下作業:

  1. 在與 example-cluster MIG 中 VM node-12 相關聯的個別執行個體設定中,設定 mode:standby 中繼資料。
  2. 從 node-12 執行個體的個別執行個體設定中,移除 logging:elaborate 中繼資料。
  3. 將個別執行個體設定變更套用至 node-12 VM:
    • 根據設定,設定 mode:standby 中繼資料。
    • 從執行個體範本設定 logging:basic 中繼資料,因為 logging 鍵的值不再由各執行個體設定定義。
  4. 由於省略了 --no-update-instance 旗標,變更預設會立即套用至 VM。
  5. VM 在更新期間會持續運作,因為系統會省略 --instance-update-minimal-action 旗標,並預設選擇干擾最少的動作進行更新,在本例中為 refresh。

REST

如要為 MIG 中現有的 VM 執行個體個別設定有狀態中繼資料,請在相關聯的各執行個體設定中設定或移除中繼資料。接著更新執行個體,套用設定。

如果指定執行個體尚未設定個別執行個體,請使用 instanceGroupManagers.updatePerInstanceConfigs 方法和有狀態中繼資料:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/updatePerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint": "FINGERPRINT"
    },
    ...
  ]
}

如果指定執行個體已有個別執行個體設定,請使用 instanceGroupManagers.patchPerInstanceConfigs 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/NAME/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "metadata": {
          "KEY": "VALUE",
          ...
        }
      },
      "fingerprint": "FINGERPRINT"
    },
    ...
  ]
}

更改下列內容:

  • PROJECT_ID:要求的專案 ID。
  • ZONE:MIG 所在的可用區 (適用於可用區 MIG)。
    • 如果是區域 MIG,請將 zones/ZONE 替換為 regions/REGION,並指定 MIG 的區域。
  • NAME:MIG 的名稱。
  • INSTANCE_NAME:要設定有狀態中繼資料的 VM 名稱。
  • KEY 和 VALUE:除了執行個體範本中定義的中繼資料外,還要為執行個體個別設定的有狀態中繼資料鍵/值組合。
    • 為執行個體範本中既有金鑰定義的有狀態中繼資料值,會覆寫執行個體範本中的值。
    • 執行個體範本中的其他中繼資料項目則不受影響,仍可使用。
    • 如果提供 null 做為值,系統會從各執行個體設定中移除該鍵。
  • FINGERPRINT:(選用)。指定設定的指紋 (如果已存在)。用於樂觀鎖定。

updatePerInstanceConfigs 和 patchPerInstanceConfigs 方法會更新指定的個別執行個體設定,但不會將設定更新套用至相關聯的 VM 執行個體。更新或重新建立執行個體時,變更會套用至 VM。如要將變更套用至 VM,您可以手動套用更新,或在主動或機會模式下使用更新器。

範例

您有一個節點叢集 example-cluster,可在 active 或 standby 兩種模式之一運作。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的記錄詳細程度,可設為 basic 或 elaborate。每個節點上的應用程式都會取用執行個體中繼資料的值。

執行個體範本會定義 mode:active 和 logging:basic 中繼資料,做為所有執行個體的預設值。您已在叢集中 node-12 VM 的個別執行個體設定中設定 logging:elaborate。現在,您想將 node-12 切換為待機模式,並將這個執行個體的記錄功能切換為 basic。

如要將 node-12 VM 切換為待命狀態,並將記錄功能設為基本,請使用 patchPerInstanceConfigs 方法修補相關聯的個別執行個體設定:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "node-12",
      "preservedState" : {
        "metadata": {
          "mode": "standby",
          "logging": null
        }
      }
    }
  ]
}

這個方法會執行下列動作:

  1. 在 example-cluster MIG 中,為與 VM node-12 相關聯的個別執行個體設定,設定 mode:standby 中繼資料。
  2. 由於提供的值為 null,因此從每個執行個體設定中移除 logging:elaborate 中繼資料。

設定更新尚未套用至 node-12 VM 執行個體。下次重新建立或更新執行個體時,或使用主動自動更新時,系統就會套用設定更新。

如要將個別執行個體設定更新套用至 node-12 VM 執行個體,請為該執行個體呼叫 instanceGroupManagers.applyUpdatesToInstances 方法:

POST https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-east1-c/instanceGroupManagers/example-cluster/applyUpdatesToInstances

{
  "instances": ["/zones/us-east1-c/instances/node-12"],
  "minimalAction": "NONE"
}

這個方法會將更新後的個別執行個體設定套用至 node-12 VM:

  1. 根據每個執行個體的設定,設定 mode:standby 中繼資料。
  2. 從執行個體範本設定 logging:basic 中繼資料,因為 logging 鍵的值不再由個別執行個體設定定義。
  3. VM 在更新期間會持續運作,因為 minimalAction 設為 NONE,允許 MIG 採用干擾程度最低的動作來執行更新。執行個體中繼資料更新需要 REFRESH 動作,這不會中斷執行中的執行個體。

意見回饋

我們想瞭解您的用途、遇到的難題,以及對有狀態 MIG 的意見。歡迎透過 mig-discuss@google.com 與我們的團隊分享意見。

後續步驟