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

本頁面說明如何建立執行個體分散在單一地區的代管執行個體群組

與屬於單一區域的區域代管執行個體群組不同,地區代管執行個體群組可透過在單一地區內的多個區域之間分散執行個體來提高應用程式可用性。舉例來說,根據預設,us-east1 地區中的地區代管執行個體群組將會維持執行個體在該地區內的三個區域中均分的狀態:us-east1-b、us-east1-c 與 us-east1-d。

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

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

事前準備

限制

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

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

Google 建議建立地區代管執行個體群組,而非建立區域代管執行個體群組。因為地區代管執行個體群組能讓您在多個區域之間分散應用程式的負載,而不會將您的應用程式限制在單一區域內。您也不必在不同區域之間管理多個執行個體群組。這種複製機制能防止單一區域故障時整個執行個體群組發生區域失敗與意外狀況。如發生此情形,您的應用程式仍可繼續從在同一地區的另一個區域中運作的執行個體提供流量。

如果發生區域失敗的情形,或者區域中的執行個體群組停止回應,地區代管執行個體群組將會繼續支援您的 VM,如下所示:

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

  • 等失敗的區域復原後,執行個體群組將會再次從該區域開始提供流量。

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

自動重新平衡

地區代管執行個體群組會嘗試在指定數量的區域之間維持 VM 執行個體的平衡,以支援高可用性工作負載。如果執行了另一個動作 (例如 deleteInstancesabandonInstances 的方法呼叫) 而導致各區域之間的 VM 執行個體不平衡,則該群組將會主動運作以重新建立正確的平衡。這可能會導致群組刪除執行個體或新增執行個體以恢復平衡。

舉例來說,如果您的地區代管執行個體群組在 us-central1-a 區域中有 2 個執行個體,在 us-central1-b 區域中有 1 個執行個體,在 us-central1-c 區域中有 1 個執行個體,則刪除了 us-central1-c 中的 VM 執行個體時,該群組將會嘗試進行重新平衡,以便讓執行個體再次平均分散在各個區域中。

在這種情況下,該群組將會從 us-central1-a 區域移除 1 個執行個體,並在 us-central1-c 區域新增 1 個執行個體,讓每個區域都有 1 個執行個體。您無法選擇性地決定要刪除哪個執行個體。

系統預設會啟用此行為,以讓地區代管執行個體群組能夠支援高可用性工作負載,但是當您從地區代管執行個體群組中刪除或移除執行個體時也必須注意這一點。

佈建正確的代管執行個體群組大小

為了針對某個區域發生失敗或整個執行個體群組停止回應這類極端情況預先做好準備,Compute Engine 強烈建議超額佈建您的代管執行個體群組。視您的應用程式需求而定,如果某個區域或執行個體群組無法回應,則超額佈建群組將可防止您的系統完全失敗。

Google 建議超額佈建是以讓您的應用程式能持續供使用者使用為優先考量。這些建議需要佈建的 VM 執行個體數量和支付的費用比您的應用程式每天可能需要的還多。您應根據應用程式需求和成本限制,對超額佈建做出最佳判斷。

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

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

舉例來說,如果您的代管執行個體群組跨越三個區域,且其中需要 20 個虛擬機器執行個體,我們建議至少在執行個體的數量上額外增加 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 主控台的「執行個體群組」頁面。

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

  2. 按一下 [建立執行個體群組] 以建立新的執行個體群組。
  3. 位置底下,選取 [多區域]
  4. 選擇所需的地區。
  5. 如要選擇特定區域,請按一下 [Configure zones] (設定區域) 以選取要使用的區域。
  6. 為執行個體群組選擇執行個體範本,或建立新的範本。
  7. 指定這個群組中的執行個體數量。請記得佈建足夠的執行個體,以在發生區域失敗時支援您的應用程式。
  8. 繼續進行其餘的代管執行個體群組建立程序。

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

API

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

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

POST https://www.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://www.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://www.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"}
      ]
   }
}

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

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

主控台

  1. 前往 GCP 主控台的「執行個體群組」頁面。

    前往「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://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

例如:

GET https://www.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 執行個體將會使用新的執行個體範本。

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

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

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

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

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

  • 如果某個區域發生失敗,或者某個區域內的執行個體群組發生失敗,則可能會喪失 1/3 的規模,但 2/3 的規模將會保留在其他區域中。建議您將自動調度資源政策設定為超額佈建自動調度過資源的代管執行個體群組,以避免在喪失區域期間使其他現存伺服器超載。

自動配置器最多只會新增群組指定上限的 1/3 的執行個體至該區域。舉例來說,如果為自動調度資源功能設定的 maxNumReplicas 是 15,則自動配置器最多只能為執行個體群組的每個區域新增 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 主控台的「執行個體群組」頁面。

    前往「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://www.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 負載平衡器時不能缺少後端服務。後端服務包含個別後端,每個個別後端又包含一個代管或非代管的執行個體群組。執行個體群組中的執行個體會回應負載平衡器的流量,因此後端服務知道它可以使用哪些執行個體,或是執行個體能夠處理的流量,以及目前處理中的流量為多少。此外,後端服務會監控健康狀態檢查,停止向健康狀態不良的執行個體傳送新連線。

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

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

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

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

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

主控台

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

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

  2. 按一下您要新增執行個體群組的目標集區。
  3. 按一下 [Edit] (編輯) 按鈕。
  4. 向下捲動至「VM instances」(VM 執行個體) 部分,然後點選 [Select instance group] (選取執行個體群組)
  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://www.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 說明文件