學習路徑:可擴充的應用程式 - 模擬失敗

IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 Cymbal Bank 範例微服務應用程式:

  1. 建立叢集並部署範例應用程式
  2. 使用 Google Cloud Managed Service for Prometheus 監控
  3. 擴充工作負載
  4. 模擬失敗 (本教學課程)
  5. 集中管理變更

總覽和目標

應用程式應能容許中斷和故障。這項功能可讓使用者在發生問題時,繼續存取應用程式。Cymbal Bank 範例應用程式的設計宗旨是處理失敗狀況並繼續執行,您不需要排解及修正問題。為提供這項復原能力,GKE 區域叢集會在可用區之間分配運算節點,而 Kubernetes 控制器會自動回應叢集內的服務問題。

在本教學課程中,您將瞭解如何模擬 Google Cloud 中的故障,並查看 GKE 叢集中的應用程式服務如何回應。您將瞭解如何完成下列工作:

  • 查看節點和服務的分配情形。
  • 模擬節點或可用區故障。
  • 確認服務是否繼續在剩餘節點上執行。

費用

啟用 GKE 並部署 Cymbal Bank 範例應用程式,以進行本系列教學課程,代表您必須支付 Google Cloud 上 GKE 的叢集費用,如定價頁面所列,直到您停用 GKE 或刪除專案為止。

您也須負責執行 Cymbal Bank 範例應用程式時產生的其他 Google Cloud 費用,例如 Compute Engine VM 的費用。

事前準備

如要瞭解如何模擬故障,請先完成第一個教學課程,建立使用 Autopilot 的 GKE 叢集,並部署 Cymbal Bank 範例微服務型應用程式。

建議您依序完成這組可擴充應用程式的教學課程。完成一系列教學課程後,您將學到新技能,並使用其他 Google Cloud 產品和服務。

查看節點和 Service 的分布情形

在 Google Cloud中,「區域」是指可供您託管資源的特定地理位置。具有三個以上的可用區。舉例來說,us-central1 區域是指美國中西部區域,其中有多個可用區,例如 us-central1-a、us-central1-b 和 us-central1-c。同一區域中的各個可用區會以高頻寬且低延遲的網路相互連線。

如要部署高可用性的容錯應用程式,Google 建議您在多個可用區和多個區域部署應用程式。這有助於防範元件意外故障,確保最多只有單一可用區或區域會受到影響。

在第一個教學課程中建立 GKE 叢集時,系統會使用一些預設設定值。根據預設,使用 Autopilot 的 GKE 叢集會建立及執行節點,這些節點會橫跨您指定區域的可用區。這表示 Cymbal Bank 範例應用程式已部署至多個可用區,有助於防範非預期的故障。

  1. 檢查 GKE 叢集中的節點分布情形:

    kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    結果類似於下列範例輸出內容,顯示節點分散在區域中的所有三個可用區:

    NAME                         ZONE            INT_IP
    scalable-apps-pool-2-node5   us-central1-c   10.148.0.6
    scalable-apps-pool-2-node6   us-central1-c   10.148.0.7
    scalable-apps-pool-2-node2   us-central1-a   10.148.0.8
    scalable-apps-pool-2-node1   us-central1-a   10.148.0.9
    scalable-apps-pool-2-node3   us-central1-b   10.148.0.5
    scalable-apps-pool-2-node4   us-central1-b   10.148.0.4
    
  2. 檢查 Cymbal Bank 範例應用程式服務在 GKE 叢集節點中的分布情形:

    kubectl get pods -o wide
    

    下列範例輸出內容顯示服務分散在叢集中的節點。從上一個步驟檢查節點的分配方式,這個輸出內容顯示服務在區域的各個地帶執行:

    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          6m30s   10.28.1.5   scalable-apps-pool-2-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          6m30s   10.28.5.6   scalable-apps-pool-2-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          6m29s   10.28.4.6   scalable-apps-pool-2-node2
    frontend-747b84bff4-xvjxq             1/1     Running   0          6m29s   10.28.3.6   scalable-apps-pool-2-node6
    ledger-db-0                           1/1     Running   0          6m29s   10.28.5.7   scalable-apps-pool-2-node1
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          6m29s   10.28.1.6   scalable-apps-pool-2-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          6m29s   10.28.4.7   scalable-apps-pool-2-node2
    transactionhistory-5dd7c7fd77-cmc2w   1/1     Running   0          6m29s   10.28.3.7   scalable-apps-pool-2-node6
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          6m28s   10.28.5.8   scalable-apps-pool-2-node1
    

模擬服務中斷

電力、冷卻或網路系統等實體基礎架構服務中斷時,可能會導致多個元件/系統同步故障,而 Google 的可用區經過特別設計,能將這類風險降至最低。不過,有時可能會發生非預期的問題。如果節點或可用區無法使用,您希望服務繼續在同一區域的其他節點或可用區中執行。

Kubernetes 控制器會監控叢集中的節點、服務和部署作業狀態。如果發生非預期的服務中斷,控制器會重新啟動受影響的資源,並將流量導向正常運作的節點。

在本教學課程中,您將封鎖並排空其中一個可用區中的節點,藉此模擬服務中斷。這種做法可模擬節點故障或整個區域發生問題時的情況。Kubernetes 控制器應會辨識出部分 Service 已無法使用,且必須在其他可用區的節點上重新啟動:

  • 封鎖並排空其中一個可用區中的節點。以下範例會以 us-central1-a 中的兩個節點為目標:

    kubectl drain scalable-apps-pool-2-node1 \
        --delete-emptydir-data --ignore-daemonsets
    
    kubectl drain scalable-apps-pool-2-node2 \
        --delete-emptydir-data --ignore-daemonsets
    

    這個指令會將節點標示為無法排程,因此 Pod 無法再於這些節點上執行。Kubernetes 會將 Pod 重新排定至正常運作的可用區中的其他節點。

查看模擬失敗回應

在本系列的前一個教學課程中,您已瞭解如何為 GKE 叢集設定代管 Prometheus 執行個體,以監控部分服務,並在發生問題時產生快訊。如果 Pod 正在您模擬中斷的區域節點上執行,您會收到 Prometheus 產生的快訊 Slack 通知訊息。這個行為示範如何建構現代應用程式環境,監控 Deployment 的健康狀態、在發生問題時發出警示,並自動因應負載變化或故障情形進行調整。

GKE 叢集會自動回應模擬中斷。 受影響節點上的任何服務都會在剩餘節點上重新啟動。

  1. 再次檢查 GKE 叢集中的節點分布情形:

    kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    結果會與下列範例輸出內容相似,顯示節點現在只分布在區域中的兩個可用區:

    NAME                         ZONE            INT_IP
    scalable-apps-pool-2-node5   us-central1-c   10.148.0.6
    scalable-apps-pool-2-node6   us-central1-c   10.148.0.7
    scalable-apps-pool-2-node3   us-central1-b   10.148.0.5
    scalable-apps-pool-2-node4   us-central1-b   10.148.0.4
    
  2. Kubernetes 控制器會辨識出有兩個節點無法再使用,並在可用節點之間重新分配服務。所有服務都應繼續執行。

    查看 Cymbal Bank 範例應用程式 Service 在 GKE 叢集節點中的分布情形:

    kubectl get pods -o wide
    

    以下範例輸出內容顯示服務分散在叢集中的其餘節點。從上一個步驟檢查節點的分佈情形,這項輸出內容顯示服務現在只在區域中的兩個可用區執行:

    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          28m     10.28.1.5   scalable-apps-pool-2-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          9m21s   10.28.5.6   scalable-apps-pool-2-node5
    contacts-7ddc76d94-qv4x5              1/1     Running   0          9m20s   10.28.4.6   scalable-apps-pool-2-node4
    frontend-747b84bff4-xvjxq             1/1     Running   0          28m     10.28.3.6   scalable-apps-pool-2-node6
    ledger-db-0                           1/1     Running   0          9m24s   10.28.5.7   scalable-apps-pool-2-node3
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          28m     10.28.1.6   scalable-apps-pool-2-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          9m21s   10.28.4.7   scalable-apps-pool-2-node5
    transactionhistory-5dd7c7fd77-cmc2w   1/1     Running   0          28m     10.28.3.7   scalable-apps-pool-2-node6
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          9m20s   10.28.5.8   scalable-apps-pool-2-node1
    
  3. 查看「服務」的AGE。在先前的範例輸出內容中,部分服務的年齡比 Cymbal Bank 範例應用程式中的其他服務年輕。這些較新的服務先前在您模擬故障的其中一個節點上執行。Kubernetes 控制器會在可用的節點上重新啟動這些 Service。

在實際情境中,您會排解問題,或等待解決基礎維護問題。如果您已設定 Prometheus,讓系統根據快訊傳送 Slack 訊息,就會收到這些通知。您也可以選擇重複上一個教學課程中的步驟來調度資源,瞭解當區域只有兩個可用地帶時,GKE 叢集如何因應負載增加的情況。叢集應會擴大,並使用其餘兩個可用區。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除您建立的專案。

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

後續步驟

請參閱下一個教學課程,瞭解如何使用 Config Sync 集中管理變更。