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

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

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

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

事前準備

限制

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

  • 如果 MIG 具有有狀態的設定,就無法使用自動調度資源功能。
  • 如要使用自動化輪替更新,請務必將取代方法設為 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。您也可以使用可設為 basic 或 elaborate 的 logging 中繼資料鍵,為每個節點設定詳細程度。節點上的應用程式會使用執行個體中繼資料的值進行設定。

如要建立具有詳細記錄的有效節點 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。您也可以使用可設為 basic 或 elaborate 的 logging 中繼資料鍵,為每個節點設定詳細程度。節點上的應用程式會使用執行個體中繼資料的值進行設定。

如要建立具有詳細記錄的有效節點 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。您也可以使用可設為 basic 或 elaborate 的中繼資料鍵 logging,為每個節點設定詳細程度不同的記錄。每個節點上的應用程式都會取用執行個體中繼資料的值。

執行個體範本會定義 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 相關聯的個別執行個體設定中,設定 mode:standbynode-12 中繼資料。
  2. 從 node-12 執行個體的每個執行個體設定中移除 logging:elaborate 中繼資料。
  3. 將個別執行個體設定變更套用至 node-12 VM:
    • 根據設定,設定 mode:standby 中繼資料。
    • 從執行個體範本設定 logging:basic 中繼資料,因為 logging 鍵的值不再由每個執行個體的設定定義。
  4. 由於省略了 --no-update-instance 標記,變更預設會立即套用至 VM。
  5. 由於省略了 --instance-update-minimal-action 標記,且系統預設會為更新選擇干擾程度最低的動作 (在本例中為 refresh),因此 VM 會在更新期間持續執行。

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。您也可以使用可設為 basic 或 elaborate 的中繼資料鍵 logging,為每個節點設定詳細程度不同的記錄。每個節點上的應用程式都會取用執行個體中繼資料的值。

執行個體範本會定義 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. 在與 VM 相關聯的個別執行個體設定中,設定 example-cluster MIG 中的 node-12 mode:standby 中繼資料。
  2. 從每個執行個體設定中移除 logging:elaborate 中繼資料,因為提供的值為 null。

設定更新尚未套用至 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. 由於 minimalAction 設為 NONE,因此 VM 會在更新期間持續運作,MIG 也能使用更新作業所需的最低干擾動作。更新執行個體中繼資料需要 REFRESH 動作,這不會中斷執行中的執行個體。

意見回饋

我們想瞭解您對有狀態 MIG 的使用案例、面臨的挑戰和意見。歡迎傳送電子郵件至 mig-discuss@google.com,與我們的團隊分享意見。

後續步驟