為 MIG 中的執行個體設定健康狀態檢查與自動修復

如要提高應用程式的可用性,並且驗證應用程式是否有回應,請設定代管執行個體群組 (MIG) 的自動修復政策。

自動修復政策會利用一種以應用程式為基礎的健康狀態檢查機制,來檢查應用程式的回應是否正常。相較於只驗證執行個體是否處於 RUNNING 狀態,檢查應用程式是否有回應的做法則更為精確。

如果自動修復程式判定應用程式沒有回應,代管執行個體群組會自動重新建立該執行個體。如果是先佔執行個體,只要能再使用必要資源,群組就會重新建立執行個體。

自動修復行為

當自動修復機制重新建立健康狀態不良的執行個體時,會透過原本用以建立虛擬機器 (VM) 執行個體的原始執行個體範本 (不一定是代管執行個體群組中的目前執行個體範本) 來進行修復。例如,如果 VM 執行個體使用 instance-template-a 建立,然後您將代管執行個體群組更新為在 OPPORTUNISTIC 模式下使用 instance-template-b,則自動修復功能仍會使用 instance-template-a 重新建立執行個體。這是因為在自動修復的情況下,重建執行個體的動作並不是使用者自己觸發的,因此 Compute Engine 不會假設 VM 執行個體應使用新的範本。如果您要套用新範本,請參閱變更代管執行個體群組的執行個體範本一節。

無論何時,自動並行修復的執行個體數都會小於代管執行個體群組大小,如以一來,即使自動修復政策不適用於現有的工作負載、防火牆規則設定有誤,或者存在網路連線或基礎架構問題,導致某個健康狀態良好的執行個體被誤判為健康狀態不良,仍然能夠確保代管的群組可以繼續執行一部分的執行個體。但是,如果區域代管執行個體群組只有一個執行個體,或地區代管執行個體群組中的每個區域只有一個執行個體,自動修復功能將在執行個體變為健康狀態不良時,重新建立這些執行個體。

自動修復不會在執行個體初始化期間重新建立該執行個體。詳情請參閱 autoHealingPolicies[].initialDelaySec 屬性。如果執行個體正在啟動中,這個設定會延遲自動修復,使系統無法進行檢查,以避免過早重新建立執行個體的可能性。當執行個體的 currentActionVERIFYING 時,初始延遲計時器會啟動。

自動修復功能與磁碟

根據執行個體的範本對其進行重新建立時,自動修復程式會以不同的方式處理不同類型的磁碟。一些磁碟設定可能會導致自動修復程式在嘗試重新建立代管執行個體時失敗。

磁碟類型 autodelete 自動修復作業期間的行為
新永久磁碟 true 系統會如執行個體範本所指定,重新建立磁碟。重新建立磁碟及其執行個體時,寫入該磁碟的任何資料都會遺失。
新永久磁碟 false 在自動修復程式重新建立執行個體時,系統會保留並重新連結磁碟。
現有的永久磁碟 true 舊磁碟會遭到刪除。VM 執行個體重新建立會失敗,因為 Compute Engine 無法將刪除的磁碟重新連結到執行個體。
現有的永久磁碟 false 系統會如執行個體範本所指定,重新連結舊磁碟。磁碟中的資料會保留。但是,針對現有讀寫磁碟,代管執行個體群組最多只能擁有一個 VM,因為在讀寫模式下,單一永久磁碟無法連結至多個執行個體。
新的本機 SSD 系統會如執行個體範本所指定,重新建立磁碟。重新建立或刪除執行個體時,本機 SSD 中的資料會遺失。

自動修復程式不會重新連結未在執行個體範本中指定的磁碟,例如建立 VM 之後您手動連結至 VM 的磁碟。

如要保留寫入磁碟的重要資料,請採取預防措施,例如:

  • 為一般永久磁碟建立快照

  • 將資料匯出至其他資源,例如 Cloud Storage。

如果執行個體有您要保留的重要設定,Google 也建議您在執行個體範本中使用自訂映像檔。自訂映像檔包含您需要的任何自訂設定。當您在執行個體範本中指定自訂映像檔時,代管執行個體群組 (MIG) 會使用自訂映像檔 (其中含有您所需要的自訂設定項目) 來重新建立執行個體。

設定健康狀態檢查和自動修復政策

一個代管執行個體群組最多可設定一項自動修復政策。

一項健康狀態檢查最多可以套用到 50 個代管執行個體群組。如果超過 50 個群組,請建立多個健康狀態檢查。

健康狀態檢查設定範例

以下範例顯示如何在代管執行個體群組上使用健康狀態檢查。在這個範例中,您會建立健康狀態檢查,藉此查看通訊埠 80 的網路伺服器回應。為了讓健康狀態檢查探測器能連線到每個網路伺服器,請設定防火牆規則。最後,設定群組的自動修復政策,將健康狀態檢查套用至代管執行個體群組。

主控台

  1. 建立比負載平衡健康狀態檢查更為保守的自動修復健康狀態檢查。

    例如,建立會在通訊埠 80 中尋找回應的健康狀態檢查,且這個檢查必須能容忍幾次失敗,之後才將執行個體標示為 UNHEALTHY 並重新建立。在這個範例中,如果執行個體成功傳回一次,健康狀態就會標示為良好。如果連續 3 次未成功傳回,健康狀態就會標示為不良。

    1. 前往 GCP 主控台的「Create a health check」(建立健康狀態檢查) 頁面。

      前往「Create a health check」(建立健康狀態檢查) 頁面

    2. 為健康狀態檢查指定名稱,例如 example-check
    3. 確認「Protocol」(通訊協定) 欄已選取 HTTP
    4. 在「Port」(通訊埠) 欄中,輸入 80
    5. 在「Check interval」(檢查時間間隔) 欄中,輸入 5
    6. 在「Timeout」(逾時) 欄中,輸入 5
    7. 設定「Healthy threshold」(良好健康狀態判定門檻),決定系統必須連續傳回多少次成功執行的健康狀態檢查結果,才能將不良執行個體標示為健康狀態良好。在這個範例中,請輸入 1
    8. 設定「Unhealthy threshold」(不良健康狀態判定門檻),決定系統必須連續傳回多少次失敗的健康狀態檢查,才能將健康狀態良好的執行個體標示為不良。在這個範例中,請輸入 3
    9. 按一下 [Create] (建立),建立健康狀態檢查。
  2. 建立防火牆規則,允許健康狀態檢查探測器連線至應用程式。

    健康狀態檢查探測器的來源位址範圍介於 130.211.0.0/2235.191.0.0/16 之間,因此請確保網路防火牆規則允許健康狀態檢查連線。在這個範例中,我們的代管執行個體群組使用 default 網路,且執行個體使用通訊埠 80 接聽。如果尚未在預設網路開啟通訊埠 80,請建立防火牆規則。

    1. 前往 GCP 主控台的「Create a firewall rule」(建立防火牆規則) 頁面。

      前往「Create a firewall rule」(建立防火牆規則) 頁面

    2. 在「Name」(名稱) 欄中,輸入防火牆規則的名稱 (例如 allow-health-check)。
    3. 在「Network」(網路) 欄中,選取 default 網路。
    4. 在「Source filter」(來源篩選器) 欄中,選取 IP ranges
    5. 在「Source IP ranges」(來源 IP 範圍) 欄中,輸入 130.211.0.0/2235.191.0.0/16
    6. 在「Protocols and ports」(通訊協定和通訊埠) 欄中,選取 [Specified protocols and ports] (指定的通訊協定和通訊埠),然後輸入 tcp:80
    7. 按一下 [Create] (建立)
  3. 為地區或區域代管執行個體群組設定自動修復政策,藉此套用健康狀態檢查。

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

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

    2. 在清單的「Name」(名稱) 欄底下,按一下要套用健康狀態檢查之執行個體群組的名稱。
    3. 按一下 [Edit Group] (編輯群組),修改這個代管執行個體群組。
    4. 在「Autohealing」(自動修復) 底下,選取您先前建立的健康狀態檢查。
    5. 變更或保留「Initial delay」(初始延遲) 設定。如果執行個體正在啟動中,這個設定會延遲自動修復,避免過早重新建立執行個體的可能性。當執行個體的 currentActionVERIFYING 時,初始延遲計時器會啟動。
    6. 按一下 [Save] (儲存) 套用您的變更。

    自動修復功能可能要過 15 分鐘後,才會開始監控群組中的執行個體。

gcloud

如要使用本指南提供的指令列範例,請安裝 gcloud 指令列工具或是使用 Cloud Shell

  1. 建立比負載平衡健康狀態檢查更為保守的自動修復健康狀態檢查。

    例如,建立會在通訊埠 80 中尋找回應的健康狀態檢查,且這個檢查必須能容忍幾次失敗,之後才將執行個體標示為 UNHEALTHY 並重新建立。在這個範例中,如果執行個體成功傳回一次,健康狀態就會標示為良好。如果連續 3 次未成功傳回,健康狀態就會標示為不良。

    gcloud compute health-checks create http example-check --port 80 \
        --check-interval 30s \
        --healthy-threshold 1 \
        --timeout 10s \
        --unhealthy-threshold 3
    
  2. 建立防火牆規則,允許健康狀態檢查探測器連線至應用程式。

    健康狀態檢查探測器的來源位址範圍介於 130.211.0.0/2235.191.0.0/16 之間,因此請確認防火牆規則允許健康狀態檢查連線。在這個範例中,我們的代管執行個體群組使用 default 網路,且執行個體使用通訊埠 80 接聽。如果預設網路尚未開啟通訊埠 80,請建立防火牆規則。

    gcloud compute firewall-rules create allow-health-check \
        --allow tcp:80 \
        --source-ranges 130.211.0.0/22,35.191.0.0/16 \
        --network default
    
  3. 為地區或區域代管執行個體群組設定自動修復政策,藉此套用健康狀態檢查。

    使用 update 指令,將健康狀態檢查套用至代管執行個體群組。

    如果執行個體正在啟動中,initial-delay 設定會延遲自動修復,以避免過早重新建立執行個體的可能性。當執行個體的 currentActionVERIFYING 時,初始延遲計時器會啟動。

    例如:

    gcloud compute instance-groups managed update my-mig \
        --health-check example-check \
        --initial-delay 300 \
        --zone us-east1-b
    

    自動修復功能可能要過 15 分鐘後,才會開始監控群組中的執行個體。

API

如要使用本指南中的 API 範例,請設定 API 存取權

  1. 建立比負載平衡健康狀態檢查更為保守的自動修復健康狀態檢查

    例如,建立會在通訊埠 80 中尋找回應的健康狀態檢查,且這個檢查必須能容忍幾次失敗,之後才將執行個體標示為 UNHEALTHY 並重新建立。在這個範例中,如果執行個體成功傳回一次,健康狀態就會標示為良好。如果連續 3 次未成功傳回,健康狀態就會標示為不良。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks
    
    {
     "name": "example-check",
     "type": "http",
     "port": 80,
     "checkIntervalSec": 30,
     "healthyThreshold": 1,
     "timeoutSec": 10,
     "unhealthyThreshold": 3
    }
    
  2. 建立防火牆規則,允許健康狀態檢查探測器連線至應用程式。

    健康狀態檢查探測器的來源位址範圍介於 130.211.0.0/2235.191.0.0/16 之間,因此請確認防火牆規則允許健康狀態檢查連線。在這個範例中,我們的代管執行個體群組使用 default 網路,且執行個體使用通訊埠 80 接聽。如果尚未在預設網路開啟通訊埠 80,請建立防火牆規則。

    POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls
    
    {
     "name": "allow-health-check",
     "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
     "sourceRanges": [
      "130.211.0.0/22",
      "35.191.0.0/16"
     ],
     "allowed": [
      {
       "ports": [
        "80"
       ],
       "IPProtocol": "tcp"
      }
     ]
    }
    
  3. 為地區或區域代管執行個體群組設定自動修復政策,藉此套用健康狀態檢查。

    自動修復政策是 instanceGroupManager 資源或 regionInstanceGroupManager 資源的一部分。

    您可以使用 insertpatch 方法設定自動修復政策。

    下列範例使用 instanceGroupManagers.patch 方法設定自動修復政策。

    PATCH https://www.googleapis.com/compute/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP]
    {
      "autoHealingPolicies": [
        {
          "healthCheck": "global/healthChecks/example-check",
          "initialDelaySec": 300
        }
      ],
    }
    

    如果執行個體正在啟動中,initialDelaySec 設定會延遲自動修復,以避免過早重新建立執行個體的可能性。當執行個體的 currentActionVERIFYING 時,初始延遲計時器會啟動。

    自動修復功能可能要過 15 分鐘後,才會開始監控群組中的執行個體。

    如要關閉以應用程式為基礎的自動修復功能,請將自動修復政策設為空白值 (autoHealingPolicies[])。如果使用 autoHealingPolicies[],則代管執行個體群組僅會重新建立非 RUNNING 狀態的執行個體。

    您可以讀取 instanceGroupManagers.autoHealingPolicies 欄位來取得代管執行個體群組的自動修復政策,並使用下列其中一種方法取得代管執行個體群組資源:

檢查狀態

您可以在每個執行個體上檢查目前的動作或查看群組狀態,藉此驗證是否已建立執行個體,以及其應用程式是否有回應。

首次為代管執行個體群組附加健康狀態檢查時,監控作業可能要過 15 分鐘後才會開始進行。

目前對執行個體的動作

如果正在建立代管執行個體,則其 currentActionCREATING。如果該群組已附加自動修復政策,則當代管執行個體建立完成且開始運作時,執行個體的 currentAction 將變成 VERIFYING,且健康狀態檢查工具會開始探測執行個體的應用程式。如果應用程式在啟動期間內通過這項初始健康狀態檢查,則執行個體會通過驗證,且其 currentAction 會變成 NONE

如要查看代管執行個體群組中每個執行個體正在執行的 currentAction 及其 status,請使用 gcloud 指令列工具API

gcloud

gcloud compute instance-groups managed list-instances [INSTANCE_GROUP_NAME] [--filter="zone:([ZONE])" | --filter="region:([REGION])"]

gcloud 傳回執行個體群組中的執行個體清單,以及其各自的狀態和目前動作。例如:

NAME               ZONE           STATUS   ACTION    INSTANCE_TEMPLATE  VERSION_NAME  LAST_ERROR
vm-instances-9pk4  us-central1-f           CREATING  my-new-template
vm-instances-h2r1  us-central1-f           DELETING  my-old-template
vm-instances-j1h8  us-central1-f  RUNNING  NONE      my-old-template
vm-instances-ngod  us-central1-f  RUNNING  NONE      my-old-template

API

在 API 中,對 regionInstanceGroupManagers.listManagedInstances 方法提出 POST 要求:針對區域代管執行個體群組,請使用 instanceGroupManagers.listManagedInstances 方法。

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

API 傳回群組的執行個體清單,其中包含每個執行個體的 instanceStatuscurrentAction

{
 "managedInstances": [
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-prvp",
   "id": "5317605642920955957",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
   "currentAction": "REFRESHING"
  },
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-pz5j",
   "currentAction": "DELETING"
  },
  {
   "instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/vm-instances-w2t5",
   "id": "2800161036826218547",
   "instanceStatus": "RUNNING",
   "instanceTemplate": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
   "currentAction": "REFRESHING"
  }
 ]
}

對於代管執行個體群組中的每個執行個體,執行個體的狀態將由其 instanceStatus 欄位描述。如要查看有效 instanceStatus 欄位值的清單,請參閱檢查執行個體狀態

假如執行個體正在經歷某種類型的變更,則系統會用下列任一動作填入 currentAction 欄位,協助您追蹤變更進度。否則,currentAction 欄位為 NONE

可能的 currentAction 值如下:

  • ABANDONING:執行個體正從代管執行個體群組中移除。
  • CREATING:執行個體目前正在建立。
  • CREATING_WITHOUT_RETRIES:執行個體目前正在建立,且不會重試;如果執行個體在第一次嘗試時無法建立,則代管執行個體群組將不會嘗試再次取代執行個體。
  • DELETING:執行個體目前正在刪除。
  • RECREATING:執行個體已遭刪除,目前正被取代。
  • REFRESHING:執行個體正從其目前目標集區中移除,並正讀入至現有的目標集區清單中 (此清單可能會與現有目標集區相同或不同)。
  • RESTARTING:正在使用 stopstart 方法重新啟動執行個體。
  • VERIFYING:執行個體已建立,目前正受到驗證。
  • NONE:目前並未對執行個體執行任何動作。

執行個體成功更新後,其中 instanceStatus 欄位會反映執行個體的目前狀態。

群組狀態

在群組層級中,Compute Engine 會在名稱為 status 的唯讀欄位中填入值,其中該欄位包含 isStable 標記。如要存取此標記,請使用 gcloud 工具API

如果群組中的所有執行個體均為執行中且健康狀態良好 (也就是說,每個代管執行個體的 currentAction 都是 NONE),則狀態值將顯示為 status.isStable==true。請注意,代管執行個體群組的穩定性取決於自動修復政策以外的群組設定;舉例來說,假設您的群組能自動調度資源且目前正在擴充資源,則因為自動配置器作業的關係,狀態值將顯示為 isStable==false

查看相關聯 instanceGroupManagersregionInstanceGroupManagers 資源的 status.isStable 欄位值,即可驗證代管執行個體群組是否正在執行中且健康狀態良好。

status.isStable 設為 false 時,代表變更已生效、待處理或代管執行個體群組本身遭到修改。

status.isStable 設為 true 時則表示:

  • 代管執行個體群組中沒有任何執行個體遭到任何類型的變更,且所有執行個體的 currentAction 都顯示 NONE
  • 代管執行個體群組中的執行個體沒有任何待處理的變更。
  • 代管執行個體群組本身未經修改。

您可以透過多種方式來修改代管執行個體群組,例如:

  • 由您發出推出新執行個體範本的要求。
  • 由您發出建立、刪除、調整大小或更新群組中執行個體的要求。
  • 自動配置器要求調整群組的大小。
  • 自動修復程式資源正在取代代管執行個體群組中一或多個健康狀態不良的執行個體。
  • 在地區代管執行個體群組中,部分執行個體正在重新分配

完成所有動作後,該代管執行個體群組的 status.isStable 將再次設為 true

您也可以使用帶有 --stable 標記的 gcloud beta compute instance-groups managed wait-until 指令,等候該群組的 status.isStable 設為 true

gcloud beta compute instance-groups managed wait-until INSTANCE_GROUP_NAME \
    --stable \
    [--zone [ZONE] | --region [REGION]]

查看自動修復作業記錄

您可以使用 gcloud 工具或 API 查看過去的自動修復事件。

gcloud

使用 gcloud compute operations list 指令搭配篩選器,即可單獨查看專案中的自動修復事件。

gcloud compute operations list --filter='operationType~compute.instances.repair.*'

如要進一步瞭解特定修復作業,請使用 describe 指令。例如:

gcloud compute operations describe repair-1539070348818-577c6bd6cf650-9752b3f3-1d6945e5 --zone us-east1-b

API

如果是地區代管執行個體群組,請向 regionOperations 資源提交 GET 要求並加入篩選器,將輸出清單範圍限縮至 compute.instances.repair.* 事件。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/region/[REGION]/operations?filter=operationType+%3D+%22compute.instances.repair.*%22

如果是區域代管執行個體群組,請使用 zoneOoperations 資源。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations?filter=operationType+%3D+%22compute.instances.repair.*%22

如要進一步瞭解特定修復作業,請針對該作業提交 GET 要求。例如:

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/operations/repair-1539070348818-577c6bd6cf650-9752b3f3-1d6945e5

什麼是良好的自動修復健康狀態檢查

用於自動修復功能的健康狀態檢查必須較為保守,這樣才不會預先刪除及重新建立執行個體。如果自動修復程式的健康狀態檢查過於嚴格,自動修復程式可能會將忙碌的執行個體誤判為失敗的執行個體,不必要地加以重新啟動,因而降低了可用性。

  • unhealthy-threshold:應大於 1。最好將此值設為 3 或更大的值。這樣可防止發生如網路封包遺失等罕見失敗狀況。
  • healthy-threshold:值為 2 可以滿足大多數應用程式的需求。
  • timeout:將此時間值遠大於 (五倍以上) 預期回應時間。這樣可防止意外的延遲狀況 (例如執行個體忙碌運作或網路連線速度緩慢)。
  • check-interval:此值應介於 1 秒和兩倍的逾時值之間 (不會過長也不會過短)。當值過長時,就無法及時找出失敗的執行個體。如果過短,執行個體和網路可能會因每秒發送的大量健康狀態檢查探測器而變得非常忙碌。

後續步驟

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

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

這個網頁
Compute Engine 說明文件