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


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

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

在 MIG 中為 VM 例項個別設定有狀態的中繼資料,方法是在個別例項設定中設定並套用設定。您可以在建立執行個體時,或針對現有的受管理執行個體設定個別執行個體設定。套用每個執行個體設定後,MIG 會將有狀態中繼資料儲存在管理執行個體的保留設定狀態 (preservedStateFromConfig) 欄位中。

事前準備

限制

具備有狀態中繼資料的 MIG 有下列限制:

有狀態設定的 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:要建立的執行個體名稱
  • KEYVALUE:除了在執行個體範本中定義的中繼資料外,您還可以為個別執行個體設定有狀態的中繼資料鍵/值組合
    • 您在此設定的值優先於執行個體範本中的任何衝突值

示例

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

如要建立含有詳細記錄的活動節點 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:activelogging: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 上個別設定有狀態中繼資料,請使用 instanceGroupManagers.createInstances 方法。如果是區域 MIG,請使用 regionInstanceGroupManagers.createInstances 方法

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

更改下列內容:

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

示例

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

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

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

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

該方法會在 example-cluster MIG 中建立 VM node-12,並為新執行個體設定兩個中繼資料鍵值組合:mode:activelogging: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:重新建立執行個體。

    如果省略,系統會使用更新作業所需的干擾程度最低的動作。

示例

您有一個可在兩種模式 (activestandby) 中運作的節點叢集 example-cluster。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的詳細記錄方式,該鍵可設為 basicelaborate。每個節點上的應用程式會使用執行個體中繼資料中的值。

執行個體範本會定義 mode:activelogging:basic 中繼資料,做為所有執行個體的預設值。您已在叢集中的 node-12 VM 中,為每個執行個體設定 logging:elaborate。您現在想將 node-12 切換為待機模式,並將記錄切換至此 VM 的 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. 由於省略了 --instance-update-minimal-action 標記,且預設會為更新選擇最不干擾的動作,因此 VM 會在更新期間持續執行,在本例中為 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 名稱。
  • KEYVALUE:除了在執行個體範本中定義的任何中繼資料外,您還可以為執行個體個別設定具狀態的中繼資料鍵/值組合。
    • 為例項範本中已存在的鍵定義的有狀態中繼資料值,會覆寫例項範本中的值。
    • 執行個體範本中的其他中繼資料項目則不受影響,且仍可供使用。
    • 提供 null 做為值,會從個別執行個體設定中移除鍵。
  • FINGERPRINT:(選填)。指定設定的系統指紋 (如果已存在)。用於樂觀式鎖定。

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

示例

您有一個可在兩種模式 (activestandby) 中運作的節點叢集 example-cluster。您可以使用中繼資料,為叢集中的每個 VM 個別設定模式,例如:mode:active。您也可以使用 logging 中繼資料鍵,設定每個節點的詳細記錄方式,該鍵可設為 basicelaborate。每個節點上的應用程式會使用執行個體中繼資料中的值。

執行個體範本會定義 mode:activelogging: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. 由於 minimalAction 已設為 NONE,因此 VM 會在更新期間持續運作,讓 MIG 可使用更新所需的干擾程度最低的動作。執行個體中繼資料更新作業需要使用 REFRESH 動作,這不會中斷執行中的執行個體。

意見回饋

我們想瞭解您對有狀態 MIG 的使用情境、難題和意見。請前往以下網址,並與我們的團隊分享您的寶貴意見:mig-discuss@google.com

後續步驟