使用地區性代管執行個體群組來分散執行個體

本頁面說明如何針對分散在單一地區的多個執行個體,建立代管執行個體群組 (MIG)。

與隸屬單一區域的區域代管執行個體群組不同,地區代管執行個體群組可將執行個體分散到單一地區內的多個區域之間,因而提高了應用程式的可用性。舉例來說,根據預設,us-east1 地區內的地區代管執行個體群組,會在該地區的 us-east1-bus-east1-cus-east1-d 這三個區域,均勻分布執行個體,並維持這種均衡狀態。

對於包含超過三個區域的地區,地區代管執行個體群組會從中選取三個區域建立執行個體。您也可以刻意挑選要在其中建立執行個體的區域,或者在少於三個區域的地區中建立執行個體。舉例來說,如要使用 GPU 加快處理工作負載速度,您就要刻意選取支援 GPU 的區域。

與區域代管執行個體群組一樣,地區代管執行個體群組也支援自動調度資源、內部負載平衡和外部負載平衡。

事前準備

限制

  • 每個地區代管執行個體群組最多只可包含 2,000 個執行個體。
  • 更新代管執行個體群組時,一個要求中不能指定超過 1,000 個執行個體。
  • 您無法搭配選用 maxRate 平衡選項的負載平衡器來使用地區代管執行個體群組。

選擇地區代管執行個體群組

Google 推薦建立地區代管執行個體群組,不建議區域代管執行個體群組。這是因為地區代管執行個體群組能讓您將應用程式的負載分散到多個區域之間,這樣應用程式就不會受限在單一區域內,而您也不用管理建立在不同區域的多個執行個體群組。這種複製機制能防止發生區域性的故障與意外狀況,也就是單一區域內整個執行個體群組都運作不良。如發生此情形,您的應用程式仍可透過在同地區其他區域運作的執行個體,繼續提供流量。

如果區域發生故障狀況,或者區域中的執行個體群組停止回應,地區代管執行個體群組會繼續支援您的 VM,如下所示:

  • 在其餘區域中,屬於地區代管執行個體群組的執行個體數量,將會繼續提供流量。系統不會新增任何執行個體,也不會重新分配任何執行個體 (除非您設定了自動調度資源功能)。

  • 原本無法運作的區域復原後,執行個體群組就會再次從該區域開始提供流量。

在設計實用且可擴充的應用程式時,請使用地區代管執行個體群組。

主動式執行個體重新分配

根據預設,地區代管執行個體群組會嘗試維持該地區中各區域的 VM 執行個體均勻分布狀態,以便在發生區域層級的故障時,最大化應用程式的可用性。

如果您刪除捨棄群組中的 VM 執行個體,導致區域間分布不均,則該群組會主動重新分配執行個體,以重新建立均勻分布的狀態。

為了要在區域間重新建立均勻分布的狀態,群組會針對 VM 執行個體數量較多的區域,刪除執行個體,然後在 VM 執行個體數量較少的區域,新增執行個體。群組會自動挑選要刪除的執行個體。

主動式重新分配功能可跨區域重建均勻分布的狀態。
主動式重新分配的範例

舉例來說,假設您在 ab、和 c 區域中,各有一個地區代管執行個體群組,每個群組內有 4 個執行個體。如果您刪除了 c 中的 3 個 VM 執行個體,該群組便會嘗試重新平衡,好讓這些執行個體再次均勻地分布於各區域。在這種情況下,該群組會刪除 2 個執行個體 (一個來自 a,另一個來自b),並在區域 c 中建立 2 個執行個體,如此每個區域都會有 3 個執行個體,達成了均勻分布的目標。您無法挑選要刪除的執行個體。群組在新的執行個體啟動時會暫時失去容量。

如要禁止系統自動重新分配執行個體,您可以在建立更新地區代管執行個體群組時,停用主動式執行個體重新分配功能。

如果您需要進行下列操作,這種做法就非常實用:

  • 從群組中刪除或捨棄 VM,但不影響其他正在執行的 VM 執行個體。例如,您可以在工作完成後,刪除相關批次工作站 VM,而不影響其他工作站。
  • 避免主動式重新分配功能不小心自動刪除了有狀態的應用程式 VM。
停用主動式重新分配功能可能會在區域性失敗發生時影響容量。
停用主動式重新分配功能後分布不均的狀態

要是您停用主動式執行個體重新分配功能,代管執行個體群組就不會主動新增或移除執行個體來達成平衡,但在調整大小作業期間,該群組仍有機會趨於平衡,這使得每一次的調整大小作業都是平衡群組的機會。舉例來說,在群組縮減時,群組會自動利用調整大小的機會,從較大區域中移除執行個體;而在群組擴充時,群組則會利用這個機會在較小區域中新增執行個體。

佈建正確的代管執行個體群組大小以確保可用性

有各種不同事件可能會導致一個或多個執行個體變得無法使用,您可以使用下列幾項 GCP 服務來解決這個問題:

但就算使用了上述服務,若有太多執行個體在同一時間無法使用,您的使用者仍會遭遇困境。

針對某個區域無法運作,或整個執行個體群組停止回應等極端情況,Google 強烈建議超額佈建您的代管執行個體群組,以利未雨綢繆。視您的應用程式需求而定,如果某個區域或執行個體群組無法回應,則超額佈建群組可防止您的系統完全停擺。

Google 建議超額佈建,背後的優先考量是希望您的應用程式不會中斷對使用者的服務。如果採用這些建議,您需要佈建的 VM 執行個體數量和所支付費用,可能會超出您的應用程式保持日常運作所需。請根據應用程式的需求和成本限制,決定超額佈建的設定。

預估建議的執行個體群組大小

Compute Engine 建議佈建足夠的執行個體,如此一來,如果任何一個區域內的所有執行個體同時無法使用,其餘執行個體仍能達到所需的最低執行個體數量。

如需判斷執行個體群組建議的大小下限,請參閱下表:

區域數量 額外 VM 數量 建議 VM 總數
2 +100% 200%
3 +50% 150%
4 +33% 133%

建議的額外 VM 數量,與您的代管執行個體群組所在的區域數量成反比。因此可增加平均分配應用程式的區域數量,藉此降低所需的額外 VM 數量。

在三個以上的區域中佈建地區代管執行個體群組

您在建立地區代管執行個體群組時,如果地區內至少具備三個區域,Google 建議執行個體群組至少要超額佈建 50%。根據預設,地區代管執行個體群組會在三個區域中建立執行個體。將 VM 執行個體分散在三個區域中已協助您保留了至少 2/3 的服務規模,如果單一區域無法運作,該地區中的其他兩個區域可以繼續不間斷地提供流量。透過超額佈建至 150%,便可以確保如果喪失 1/3 的規模,剩餘區域也可以支援 100% 的流量。

舉例來說,如果您在三個區域中的代管執行個體群組需要 20 個 VM 執行個體,我們建議至少再額外增加 50% 的執行個體。以此例而言,20 個的 50% 是 10 個執行個體,也就表示執行個體群組總共要有 30 個執行個體。如果您建立的地區代管執行個體群組具有 30 個執行個體,則執行個體群組會盡可能將這些執行個體平均分配到這三個區域,如下所示:

區域 執行個體數
example-zone-1 10
example-zone-2 10
example-zone-3 10

如果任一區域發生故障,您仍有 20 個執行個體可提供流量。

在兩個區域中佈建地區代管執行個體群組

如果要佈建執行個體的區域是兩個而非三個,Google 建議將執行個體的數量加倍。舉例來說,如果您的服務需要 20 個 VM 執行個體在兩個區域中平均分佈,建議設定含有 40 個執行個體的地區代管執行個體群組,如此一來每個區域就會有 20 個執行個體。如果單一區域發生故障,您仍有 20 個執行個體可提供流量。

區域 執行個體數
example-zone-1 20
example-zone-2 20

如果群組中的執行個體數不易在兩個區域中進行劃分,則 Compute Engine 會盡可能平均劃分這些執行個體,並將剩餘的執行個體隨機置入其中一個區域。

在一個區域中佈建地區代管執行個體群組

您可以建立只包含一個區域的地區代管執行個體群組。這類似於建立區域代管執行個體群組

我們不建議您建立單一區域的地區代管執行個體群組,因為這種做法只能讓高可用性的應用程式獲得最低的保障。如果區域發生故障,整個代管執行個體群組都會無法使用,可能會中斷為使用者提供的服務。

為您的群組選取區域

地區代管執行個體群組的預設設定是盡可能在三個區域中平均分配執行個體。您可能會因各種原因而想要為您的應用程式選擇特定區域。舉例來說,如果執行個體需要 GPU,則您可能只會選擇支援 GPU 的區域。您可能有只在某些區域中提供的永久磁碟,或者您可能只想在幾個區域中啟動 VM 執行個體,而不是隨機在一個地區內的三個區域中啟動。

如要選擇區域的數量,或是選擇執行個體群組應在其中執行的特定區域,那麼在開始建立群組時就必須先行處理。在建立期間選擇特定區域後,日後就無法變更或更新那些區域。

  • 如要在一個地區內選取超過三個區域,則必須明確指定個別區域。舉例來說,如要選取一個地區內的全部共四個區域,就必須在您的要求中明確提供該四個區域。否則根據預設,Compute Engine 會選取三個區域。

  • 如要在一個地區內選取兩個或更少的區域,則必須明確指定個別區域。即使該地區只包含兩個區域,您仍必須在要求中明確指定區域。

在預設情況下,無論您是要選擇特定區域,或者只想選取地區並讓 Compute Engine 在該地區內的所有區域中建立執行個體,系統都會在所有區域中平均分配 VM 執行個體。最佳做法是確保佈建足夠的 VM 執行個體,以支援指定數量的區域中的應用程式。

建立地區代管執行個體群組

gcloud 指令列工具、主控台API 中建立地區代管執行個體群組。

如果各區域中沒有足夠的容量可支援執行個體群組中的執行個體,則 Compute Engine 會盡可能建立最多的執行個體,並在有額外配額可用時繼續嘗試建立其餘執行個體。

由於您要建立的是地區代管執行個體群組,請記得某些資源是屬於區域的,例如永久磁碟。如要在執行個體範本中指定額外的永久磁碟等區域資源,則該磁碟必須存在於所有區域中,這樣才能將其連結到由此地區代管執行個體群組建立的執行個體。

根據預設,如果您沒有在要求中明確指定個別區域,Compute Engine 就會自動選擇三個區域來建立執行個體。如果您需要在超過或少於三個的區域中建立執行個體,或是想選擇要使用的區域,請在要求中提供區域清單。詳情請參閱為您的群組選取區域一節。

根據預設,系統會啟用主動式執行個體重新分配功能。如果您需要手動管理每個區域中的執行個體數量,可以停用主動式執行個體重新分配功能,但無法設定自動調度資源功能。詳情請參閱主動式執行個體重新分配一節。

主控台

  1. 前往 GCP Console 的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 按一下 [Create Instance Group] (建立執行個體群組) 以建立新的執行個體群組。
  3. 在「Location」(位置) 底下,選取 [Multiple zones] (多區域)。
  4. 選擇所需的地區。
  5. 如要選擇特定區域,請按一下 [Configure zones] (設定區域) 以選取要使用的區域。
  6. 如要停用主動式執行個體重新分配功能
    1. 確認「Autoscaling mode」(自動調度資源模式) 已設為 [Off] (關閉)。
    2. 將「Instance redistribution」(執行個體重新分配) 設為 [Off] (關閉)。
  7. 為執行個體群組選擇執行個體範本,或建立新的範本。
  8. 指定這個群組中的執行個體數量。請記得佈建足夠的執行個體,以在發生區域失敗時支援您的應用程式。
  9. 繼續進行其餘的代管執行個體群組建立程序。

gcloud

所有代管執行個體群組都需要執行個體範本。如果您沒有範本,請建立執行個體範本。舉例來說,下列指令會使用預設屬性建立基本的執行個體範本:

gcloud compute instance-templates create example-template

接著,請使用 instance-groups managed create 子指令搭配 --region 旗標。例如,這個指令會在 us-east1 地區內的三個區域中建立地區代管執行個體群組:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --region us-east1

如要選取該群組應使用的特定區域,請提供 --zones 旗標:

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --zones us-east1-b,us-east1-c

如要停用主動式執行個體重新分配功能,請將 --instance-redistribution-type 旗標設為 NONE。由於這項功能目前仍為 Beta 版,因此您必須使用 gcloud beta 工具。啟用自動調度資源功能後,您就無法停用主動式執行個體重新分配功能。

gcloud beta compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --instance-redistribution-type NONE

注意事項:如果您要停用主動式執行個體重新分配功能,請使用 gcloud beta 元件,因為停用主動式執行個體重新分配功能目前仍為 Beta 版。

API

所有代管執行個體群組都需要執行個體範本。如果您沒有範本,請建立執行個體範本

在 API 中,建構對 regionInstanceGroupManagers.insert 方法的 POST 要求。在要求主體中加入所需的群組名稱、群組大小、群組中執行個體的基礎名稱,以及執行個體範本的網址。

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/[ZONE]"},
       {"zone": "zones/[ZONE]"}
      ]
   }
}

其中:

  • [PROJECT_ID] 是這項要求的專案 ID。
  • [REGION] 是執行個體群組的所在地區。
  • [BASE_INSTANCE_NAME] 是建立做為執行個體群組一部分的每個執行個體的執行個體名稱。舉例來說,example-instance 這個基礎執行個體名稱,會建立名稱類似 example-instance-[RANDOM_STRING] 的執行個體,其中 [RANDOM_STRING] 是由伺服器產生。
  • [INSTANCE_TEMPLATE_NAME] 是要使用的執行個體範本。
  • [TARGET_SIZE] 是執行個體群組的執行個體目標數量。

如要選擇特定區域,或是要在具有少於或超過三個區域的地區中建立執行個體,請在要求中加入 distributionPolicy 屬性並提供區域清單。以要在其中建立執行個體的區域名稱取代 [ZONE]

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/[ZONE]"},
       {"zone": "zones/[ZONE]"}
      ]
   }
}

例如,下列指令會建立一個名為 example-rmig 的執行個體群組,而其中的 10 個執行個體會分布於 us-east1-bus-east1-c 兩個區域:

POST https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers
{

  "baseInstanceName": "example-instance",
  "instanceTemplate": "global/instanceTemplates/example-instance",
  "name": "example-rmig",
  "targetSize": 10,
  "distributionPolicy": {
      "zones": [
        {"zone": "zones/us-east1-b"},
        {"zone": "zones/us-east1-c"}
      ]
   }
}

如要停用主動式執行個體重新分配功能,請在要求中加入 updatePolicy 屬性,並將 instanceRedistributionType 設為 NONE。由於此功能目前仍為 Beta 版,因此您必須使用 Beta API。啟用自動調度資源功能後,您就無法停用主動式執行個體重新分配功能。

POST https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "updatePolicy": {
     "instanceRedistributionType": "NONE"
   },
}

列出地區代管執行個體群組中的執行個體

如要取得地區代管執行個體群組的執行個體清單,請使用 GCP Consolegcloud 指令列工具中的 instance-groups managed list-instances 指令,或是對 regionInstanceGroupManagers.listManagedInstances 方法提出要求。

主控台

  1. 前往 GCP Console 的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 按一下您要查看其執行個體的地區代管執行個體群組名稱。

執行個體群組詳細資料頁面會載入執行個體群組中的執行個體清單。

gcloud

執行 instance-groups managed list-instances 指令:

gcloud compute instance-groups managed list-instances [INSTANCE_GROUP_NAME] --region [REGION]

其中:

  • [INSTANCE_GROUP_NAME] 是執行個體群組的名稱。
  • [REGION] 是執行個體群組的所在地區。

例如,下列指令會列出在 us-east1 地區中,隸屬於名為 example-rmig 之執行個體群組的執行個體:

gcloud compute instance-groups managed list-instances example-rmig --region us-east1

API

在 API 中,對 regionInstanceGroupManagers.listManagedInstances 方法建構一個空的 GET 要求。

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

例如:

GET https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers/example-rmig

更新地區代管執行個體群組

您可以使用 Instance Group Updater 功能來更新地區代管執行個體群組。此 Updater 功能可讓您將群組內的部分或所有執行個體更新為新的執行個體範本。您也可以使用 Updater 功能來執行初期測試更新以及控制更新的速度。

同時,您也可以使用 gcloud 中的 set-instance-template 指令,或 API 中的 setInstanceTemplate 方法,來變更執行個體群組的執行個體範本,而無需更新現有的執行個體。請注意,變更執行個體範本並不會將現有的執行個體自動更新為新的執行個體範本。您必須重新建立個別執行個體或執行 Instance Group Updater 才能套用變更。但是,該群組的新 VM 執行個體將會使用新的執行個體範本。

停用及重新啟用主動式執行個體重新分配功能

主動式執行個體重新分配功能會在地區中的所選區域間維持平均的執行個體數量。這項設定可在發生區域層級的故障時,最大化應用程式的可用性。

根據預設,系統會啟用地區代管執行個體群組的主動式執行個體重新分配功能,但您可以停用非自動調度資源代管執行個體群組的主動式執行個體重新分配功能。停用主動式執行個體重新分配功能後,群組就不會嘗試主動重新分配區域間的執行個體。如果您需要進行下列操作,這種做法就非常實用:

  • 從群組中手動刪除或捨棄 VM 執行個體,但不影響其他正在執行的執行個體。
  • 在工作完成時自動刪除相關批次工作站執行個體,而不影響其他工作站。
  • 保護內含有狀態應用程式的執行個體,以免不小心因主動式執行個體重新分配功能而遭到自動刪除。

如果您從群組中刪除或捨棄 VM 執行個體,並造成區域間執行個體的不平衡狀態,那麼您必須先手動重新平衡群組,才能重新啟用主動式重新分配功能。如要手動重新平衡群組,請調整群組大小,或從執行個體數量較多的區域刪除執行個體。

當您針對已停用主動式執行個體重新分配功能的代管執行個體群組調整大小時,該群組仍有「機會」趨於平衡,這使得每一次的調整大小作業都是平衡群組的機會:當群組擴大時,群組一律會嘗試在 VM 數量最少的區域新增執行個體;當群組縮減時,群組一律會從執行個體數量最多的區域中移除執行個體。

手動調整群組大小以達成重新平均分配的範例

您可透過主控台、gcloud 工具或 API 來建立停用主動式執行個體重新分配功能的執行個體群組,或是為現有群組停用或啟用主動式執行個體重新分配功能。

建立停用主動式重新分配功能的群組

主控台

  1. 前往 GCP Console 的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 按一下 [Create Instance Group] (建立執行個體群組) 以建立新的執行個體群組。
  3. 在「Location」(位置) 底下,選取 [Multiple zones] (多區域)。
  4. 選擇所需的地區。
  5. 如要選擇特定區域,請按一下 [Configure zones] (設定區域) 以選取要使用的區域。
  6. 如要停用主動式執行個體重新分配功能,請如下操作:
    1. 確認「Autoscaling mode」(自動調度資源模式) 已設為 [Off] (關閉)。
    2. 將「Instance redistribution」(執行個體重新分配) 設為 [Off] (關閉)。
  7. 為執行個體群組選擇執行個體範本,或建立新的範本。
  8. 指定這個群組中的執行個體數量。請記得佈建足夠的執行個體,以在發生區域失敗時支援您的應用程式。
  9. 繼續進行其餘的代管執行個體群組建立程序。

gcloud

如要建立不執行主動式執行個體重新分配功能的新地區代管執行個體群組,請使用 gcloud beta compute instance-groups managed create 指令,並將 --instance-redistribution-type 旗標設為 NONE

gcloud beta compute instance-groups managed create [INSTANCE_GROUP_NAME] \
    --template [TEMPLATE] \
    --size [SIZE] \
    --zones [ZONES] \
    --instance-redistribution-type NONE

其中:

  • [INSTANCE_GROUP_NAME] 是執行個體群組的名稱。
  • [TEMPLATE] 是要用於群組的執行個體範本名稱。
  • [SIZE] 是執行個體群組的目標大小。
  • [ZONES] 是您需要部署 VM 執行個體所在單一地區內的區域清單。

例如:

gcloud beta compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --instance-redistribution-type NONE

API

如要建立不執行主動式執行個體重新分配的非自動調度資源地區代管執行個體群組,請建構 POST 要求以叫用 regionInstanceGroupManagers.insert 方法。在要求主體中加入 updatePolicy 屬性,並將其 instanceRedistributionType 欄位設為 NONE

POST
https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]
{
    "name": "[INSTANCE_GROUP_NAME]",
    "baseInstanceName": "[BASE_INSTANCE_NAME]",
    "instanceTemplate": "global/instanceTemplates/[TEMPLATE]",
    "targetSize": "[TARGET_SIZE]",
    "distributionPolicy": {
        "zones": [
            {"zone": "zones/[ZONE]"},
            {"zone": "zones/[ZONE]"}
        ]
    },
    "updatePolicy": {
        "instanceRedistributionType": "NONE"
    }
}

其中:

  • [PROJECT_ID] 是這項要求的專案 ID。
  • [REGION] 是執行個體群組的所在地區。
  • [INSTANCE_GROUP_NAME] 是執行個體群組的名稱。
  • [BASE_INSTANCE_NAME] 是每個執行個體的名稱前置字元。系統會自動產生執行個體名稱尾碼。
  • [TEMPLATE] 是要用於群組的執行個體範本名稱。
  • [TARGET_SIZE] 是執行個體群組的目標大小。
  • [ZONE] 是您需要部署 VM 執行個體所在單一地區內的特定區域名稱。

停用主動式執行個體重新分配功能

您必須先停用自動調度資源功能,才能停用主動式執行個體重新分配功能。

主控台

  1. 前往 GCP Console 的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 選取要更新的執行個體群組,然後按一下 [Edit group] (編輯群組)。
  3. 確認「Autoscaling mode」(自動調度資源模式) 已設為 [Off] (關閉)。
  4. 將「Instance redistribution」(執行個體重新分配) 設為 [Off] (關閉),以停用自動重新分配功能。
  5. 按一下 [Save] (儲存)。

gcloud

如要停用非自動調度資源地區代管執行個體群組的主動式執行個體重新分配功能,請使用 compute instance-groups managed update 指令,並將 --instance-redistribution-type 旗標設為 NONE

 gcloud beta compute instance-groups managed update [INSTANCE_GROUP_NAME]
    --instance-redistribution-type NONE \
    --region [REGION]

其中:

  • [INSTANCE_GROUP_NAME] 是執行個體群組的名稱。
  • [REGION] 是執行個體群組的所在地區。

注意事項:如果您要停用主動式執行個體重新分配功能,請使用 gcloud beta 元件,因為停用主動式執行個體重新分配功能目前仍為 Beta 版。

API

在 API 中,建構對 regionInstanceGroupManagers.patch 方法的 PATCH 要求。在要求主體中加入 updatePolicy 屬性,並將其 instanceRedistributionType 欄位設為 NONE

PATCH
https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP]

{
    "updatePolicy": {
         "instanceRedistributionType": "NONE"
    }
}

其中:

  • [PROJECT_ID] 是這項要求的專案 ID。
  • [REGION] 是執行個體群組的所在地區。
  • [INSTANCE_GROUP] 是非自動調度資源代管執行個體群組的名稱。

注意事項:如果您要停用主動式執行個體重新分配功能,請使用 Beta 版 API,因為停用執行個體重新分配功能目前仍為 Beta 版。

啟用主動式執行個體分配功能

如要啟用主動式執行個體分配功能,請使用與停用主動式執行個體重新分配功能類似的指令,但將執行個體重新分配類型設為 PROACTIVE

如果您手動刪除或捨棄部分執行個體,因而造成地區間執行個體分布不均的狀態,那麼您必須先手動重新平衡群組,才能重新啟用主動式執行個體重新分配功能。任兩個區域之間的 VM 執行個體數量不應相差超過 1 個 VM。

您可以手動從執行個體數量較多的區域中刪除 VM,或是為執行個體較少的群組調整大小,直到分布均勻為止,藉此在各區域間達到執行個體平均分布的狀態。

地區代管執行個體群組不允許在區域間執行個體分布不均的狀態下 (兩個區域之間的 VM 執行個體數量相差 2 個以上) 啟用主動式執行個體重新分配。這是為了防止系統從含有較多執行個體的區域意外自動刪除 VM (系統會觸發這項作業來達成分布均勻的狀態)。

針對地區代管執行個體群組自動調度資源

Compute Engine 可為代管執行個體群組提供自動調度資源功能,讓您的執行個體群組能根據負載的增減自動新增或移除執行個體。

如果為地區代管執行個體群組啟用自動調度資源功能,該功能的運作方式如下:

  • 自動調度資源政策會套用至整個群組 (而非個別區域)。舉例來說,如果您啟用自動配置器以達到 66% 的 CPU 使用率,則自動配置器將會持續追蹤群組中所有執行個體的動態,以在所有區域的所有執行個體中維持平均 66% 的使用率。

  • 自動調度資源功能會嘗試盡可能在可用的區域之間平均分配執行個體。一般而言,自動配置器會透過擴大較小的區域並期望負載會從較大的區域重新導向來保持區域大小的平衡 (例如透過負載平衡器)。我們不建議設定偏重一個區域的自訂負載平衡器,因為這可能會導致未預期的行為。

  • 如果您的工作流程是在 3 個區域中平均使用執行個體,而某個區域發生了故障,或是某個區域內的執行個體群組發生故障,便可能喪失 1/3 的容量,但 2/3 的容量將會保留在其他區域中。建議您將自動調度的地區代管執行個體群組設為超額佈建,以避免在某個區域無法使用的期間內,導致其他仍能使用的伺服器超載。

  • 如果區域中有資源暫時無法使用 (例如先占執行個體),則群組會在該區域中繼續嘗試建立這些代管執行個體。等到資源再度可供使用後,該群組即可取得執行所需的執行個體數量。

  • 如果啟用了負載平衡,而某個區域中的資源無法使用,導致該區域現存資源的使用率較高,則系統可能會在使用率較低的區域中建立新執行個體,如此一來會產生暫時性的不平均分布。

自動配置器最多只會在區域中新增該群組指定最大值的 1/n 個執行個體,其中 n 是已佈建區域的數量。舉例來說,如果您使用預設的 3 個區域,而 15 是設為自動調度資源的 maxNumReplicas,則自動配置器最多只能為執行個體群組的每個區域新增最多 1/3 * 15 = 5 個執行個體。如果其中一個區域發生故障,自動配置器最多只能擴充至其餘兩個區域中 maxNumReplicas 加起來的 2/3。

佈建自動配置器的設定

與超額佈建代管執行個體群組的建議類似,您應超額佈建自動配置器設定,以達成下列目的:

  • 自動調度資源使用率的目標是所需使用率目標的 2/3。
  • 為了因應降低的使用率目標,自動配置器將會新增更多執行個體,因此您應將 maxNumReplicas 增加到比您會設定的數量多 50%,而無需考慮超額佈建的問題。

舉例來說,如果您預期 20 個執行個體可以處理您的尖峰負載,且目標使用率為 80%,那麼請將自動配置器設為:

  • 目標使用率為 2/3 * 0.8 = 0.53 或 53% 而非 80%
  • 執行個體數量上限為 3/2 * 20 = 30 個而非 20 個

此設定可確保在單一區域發生故障時,您的執行個體群組不會耗盡容量,因為其餘 2/3 的執行個體應該能夠處理來自離線區域而增加的負載 (因為您降低了目標使用率使其遠低於其容量)。自動配置器也將會新增執行個體最多達到您指定的執行個體數量上限,以維持 2/3 的使用率目標。

但是,您不應僅依賴超額佈建代管執行個體群組來處理增加的負載。Google 建議的最佳做法是,定期對您的應用程式進行負載測試,以確保它可以處理可能因區域服務中斷移除了 1/3 的執行個體而增加的使用率。

啟用自動調度資源功能

主控台

  1. 前往 GCP Console 的「Instance Groups」(執行個體群組) 頁面。

    前往「Instance Groups」(執行個體群組) 頁面

  2. 如果您沒有執行個體群組,請建立一個執行個體群組。或者,在清單中按一下現有地區代管執行個體群組的名稱。
  3. 在執行個體群組詳細資料頁面上,按一下 [Edit Group] (編輯群組) 按鈕。
  4. 在「自動調度資源」底下,勾選 [開啟]
  5. 填寫自動調度資源設定的屬性。
  6. 儲存變更。

gcloud

請以 gcloud 指令列工具,使用 set-autoscaling 子指令加上 --region 旗標來啟用地區自動調度資源功能。如要深入瞭解如何建立自動配置器,請參閱自動調度資源說明文件

例如,下列程式碼片段會替名為 example-rmig 的執行個體群組範例設定自動配置器。將 us-east1 替換為代管執行個體群組的地區,將 example-autoscaler 替換為您想要的自動配置器名稱,並將 example-rmig 替換為地區代管執行個體群組的名稱:

gcloud compute instance-groups managed set-autoscaling example-rmig \
    --target-cpu-utilization 0.8 --max-num-replicas 5 --region us-east1

API

如要在 API 中設定地區自動調度資源功能,請使用您自己的專案 ID 和代管執行個體群組的地區,對下列網址提出 POST 要求:

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/regionAutoscalers/

您的要求主體必須包含 nametargetautoscalingPolicy 欄位,而 autoscalingPolicy 必須定義 cpuUtilizationmaxNumReplicas

{
 "name": "[AUTOSCALER_NAME]",
 "target": "regions/us-east1/instanceGroupManagers/[INSTANCE_GROUP_NAME]",
 "autoscalingPolicy": {
    "maxNumReplicas": [MAX_NUM_INSTANCES],
    "cpuUtilization": {
       "utilizationTarget": [TARGET_UTILIZATION]
     },
    "coolDownPeriodSec": [SECONDS]
  }
}

例如:

{
 "name": "example-autoscaler",
 "target": "regions/us-east1/instanceGroupManagers/example-rmig",
 "autoscalingPolicy": {
    "maxNumReplicas": 10,
    "cpuUtilization": {
       "utilizationTarget": 0.8
     },
    "coolDownPeriodSec": 30
  }
}

更新自動配置器

更新地區自動配置器的方式與更新區域自動配置器相同。請參閱更新自動配置器的說明文件。

新增地區代管執行個體群組至負載平衡器

Google Cloud Platform 負載平衡功能會使用執行個體群組來提供流量。視您使用的負載平衡器類型而定,您可以將執行個體群組新增至目標集區或後端服務。如要進一步瞭解代管執行個體群組和負載平衡,請參閱執行個體群組總覽

您可以指派地區代管執行個體群組做為外部負載平衡內部負載平衡後端服務的目標,或者做為網路負載平衡目標集區的一部分。

對於 HTTP(S) 負載平衡,區域代管執行個體群組僅支援 maxRatePerInstancemaxUtilization

新增地區代管執行個體群組至後端服務

建立 HTTP(S)、安全資料傳輸層 (SSL) Proxy、TCP Proxy 或內部負載平衡器時不能缺少後端服務。後端服務可包含多個後端。執行個體群組是一種後端類型。執行個體群組中的執行個體會回應來自負載平衡器的流量,因此後端服務知道它可以使用哪些執行個體、執行個體能夠處理的流量,以及目前處理中的流量為多少。此外,後端服務會監控健康狀態檢查,停止向健康狀態不良的執行個體傳送新連線。

請參閱新增執行個體群組至後端服務一節,瞭解如何將執行個體群組新增至後端服務。

新增地區代管執行個體群組至目標集區

目標集區是包含一或多個虛擬機器執行個體的物件。目標集區用於網路負載平衡,其中網路負載平衡器會將使用者的要求轉送至連結的目標集區。屬於該目標集區的執行個體會處理這些要求並傳回回應。您可以新增代管執行個體群組至目標集區,這樣一來,在執行個體群組新增或移除執行個體時,目標集區也會隨著相關變更自動更新。

目標集區必須先存在,您才能新增代管執行個體群組至目標集區。如需詳細資訊,請參閱新增目標集區的說明文件。

如要新增現有的代管執行個體群組至目標集區,請按照以下操作說明進行。這種做法會將屬於代管執行個體群組的所有 VM 執行個體全數新增至目標集區。

主控台

  1. 前往 GCP Console 的「Target Pools」(目標集區) 頁面。

    前往「Target Pools」(目標集區) 頁面

  2. 按一下您要新增執行個體群組的目標集區。
  3. 按一下 [Edit] (編輯) 按鈕。
  4. 向下捲動至「VM instances」(VM 執行個體) 部分,然後按一下 [Select instance groups] (選取執行個體群組)。
  5. 從下拉式選單中選擇一個執行個體群組。
  6. 儲存變更。

gcloud

透過 gcloud 指令列工具使用 set-target-pools 指令:

gcloud beta compute instance-groups managed set-target-pools [INSTANCE_GROUP] \
    --target-pools [TARGET_POOL,..] [--region REGION]

其中:

  • [INSTANCE_GROUP] 是執行個體群組的名稱。
  • [TARGET_POOL] 是要新增此執行個體群組的一或多個目標集區的名稱。
  • [REGION] 是執行個體群組的所在地區。

API

在 API 中,對下列 URI 提出 POST 要求:

POST https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/[REGION]/regionInstanceGroupManagers/[INSTANCE_GROUP]/setTargetPools

其中:

  • [PROJECT_ID] 是這項要求的專案 ID。
  • [REGION] 是執行個體群組的所在地區。
  • [INSTANCE_GROUP] 是執行個體群組的名稱。

要求主體應包含要新增此群組之目標集區的 URI 清單。例如:

{
  "targetPools": [
    "regions/us-central1/targetPools/example-targetpool-1",
    "regions/us-central1/targetPools/example-targetpool-2"
  ]
}

模擬地區代管執行個體群組發生區域服務中斷的情形

如要測試地區代管執行個體群組超額佈建是否足夠,並且可以在區域服務中斷後繼續保持正常運作,您可以使用以下範例來模擬單一區域失敗的情形。

這個指令碼會停止和啟動 Apache 來做為預設案例。如果這個指令碼不適用於您的應用程式,請以您自己的失敗和復原案例取代停止和啟動 Apache 的指令。

  1. 在執行個體群組的每個虛擬機器執行個體中持續部署並執行這個指令碼。您可透過將此指令碼新增至執行個體範本,或將此指令碼加入自訂映像檔並在執行個體範本中使用該映像檔的方式,來進行這項作業。

    #!/usr/bin/env bash
    
    # Copyright 2016 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o nounset
    set -o errexit
    set -o pipefail
    
    function GetMetadata() {
      curl -s "$1" -H "Metadata-Flavor: Google"
    }
    
    PROJECT_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/project/attributes"
    INSTANCE_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance"
    ZONE=$(GetMetadata "$INSTANCE_METADATA_URL/zone" | cut -d '/' -f 4)
    INSTANCE_NAME=$(hostname)
    
    # We keep track of the state to make sure failure and recovery is triggered only once.
    STATE="healthy"
    while true; do
      if [[ "$ZONE" = "$(GetMetadata $PROJECT_METADATA_URL/failed_zone)" ]] && \
         [[ "$INSTANCE_NAME" = *"$(GetMetadata $PROJECT_METADATA_URL/failed_instance_names)"* ]]; then
        if [[ "$STATE" = "healthy" ]]; then
          STATE="failure"
          # Do something to simulate failure here.
          echo "STARTING A FAILURE"
          /etc/init.d/apache2 stop
        fi
      else
        if [[ "$STATE" = "failure" ]] ; then
          STATE="healthy"
          # Do something to recover here.
          echo "RECOVERING FROM FAILURE"
          /etc/init.d/apache2 start
        fi
      fi
      sleep 5
    done
    
    
  2. 透過設定下列兩個專案中繼資料欄位來模擬區域故障的情形:

    • failed_zone:設定您要模擬服務中斷的區域 (將故障範圍限制在單一區域)。
    • failed_instance_names:依名稱選擇要使其離線的執行個體 (將故障範圍限制於只包含此字串的執行個體名稱)。

    您可使用 gcloud 指令列工具來設定此中繼資料。例如,下列指令會將區域服務中斷設為 europe-west1-b 區域,並影響名稱以 instance-base-name 開頭的執行個體:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='instance-base-name-'
    
  3. 完成模擬服務中斷後,請透過移除中繼資料鍵從故障中復原:

    gcloud compute project-info remove-metadata --keys failed_zone,failed_instance_names
    

以下提供一些可讓您使用此指令碼執行故障情況的建議:

  • 完全停止應用程式以查看代管執行個體群組的回應方式。
  • 讓您的執行個體在進行負載平衡健康狀態檢查時傳回「健康狀態不良」。
  • 修改 iptables 以封鎖進出該執行個體的部分流量。
  • 關閉虛擬機器執行個體。根據預設,地區代管執行個體群組將會在不久之後重新建立那些執行個體,但只要設定了中繼資料值,新的執行個體將在該指令碼執行時立即自行關閉。如此將會導致重複當機。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件