IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 Cymbal Bank 範例微服務應用程式:
- 建立叢集並部署範例應用程式
- 使用 Google Cloud Managed Service for Prometheus 監控
- 擴充工作負載
- 模擬失敗情形 (本教學課程)
總覽和目標
應用程式應能容許中斷和故障。這項功能可讓使用者在發生問題時,繼續存取您的應用程式。Cymbal Bank 範例應用程式的設計宗旨是處理故障情形並繼續執行,您不必進行疑難排解和修正。為提供這項復原能力,GKE 區域叢集會在各個可用區分配運算節點,而 Kubernetes 控制器會自動回應叢集內的服務問題。
在本教學課程中,您將瞭解如何模擬 Google Cloud 中的故障,並查看 GKE 叢集中的應用程式服務如何回應。您將瞭解如何完成下列工作:
- 查看節點和服務的分配情形。
- 模擬節點或區域故障情形。
- 確認服務是否繼續在剩餘節點上執行。
費用
啟用 GKE 並部署本系列教學課程的 Cymbal Bank 範例應用程式,表示您必須支付 GKE 叢集費用,直到停用 GKE 或刪除專案為止。如需相關費用,請參閱定價頁面。 Google Cloud
您也必須支付執行 Cymbal Bank 範例應用程式時產生的其他 Google Cloud 費用,例如 Compute Engine VM 的費用。
事前準備
如要瞭解如何模擬故障,您必須完成第一個教學課程,建立使用 Autopilot 的 GKE 叢集,並部署 Cymbal Bank 範例微服務型應用程式。
建議您依序完成這組可擴充應用程式的教學課程。完成一系列教學課程後,您將學到新技能,並使用其他 Google Cloud 產品和服務。
查看節點和服務的分配情形
在 Google Cloud中,「區域」是可供您託管資源的特定地理位置。具有三個以上的可用區。舉例來說,us-central1
地區是指美國中西部地區,其中包含多個區域,例如 us-central1-a
、us-central1-b
和 us-central1-c
。區域會有高頻寬、低延遲的網路連線至同一地區中的其他區域。
如要部署具有高可用性的容錯應用程式,Google 建議跨多個區域和多個地區部署應用程式。這有助於防範元件發生非預期失敗,確保最多只有單一區域或地區會受到影響。
在第一個教學課程中建立 GKE 叢集時,系統會使用一些預設的設定值。根據預設,使用 Autopilot 的 GKE 叢集會建立並執行節點,這些節點會跨越您指定的區域。這種做法表示 Cymbal Bank 範例應用程式已部署到多個區域,有助於預防發生非預期失敗的情形。
檢查 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
檢查 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 控制器會監控叢集中的節點、Service 和 Deployment 狀態。如果發生非預期的服務中斷,控制器會重新啟動受影響的資源,並將流量轉送到正常運作的節點。
在本教學課程中,如要模擬中斷情形,請在其中一個區域中隔離並排空節點。這種做法可模擬節點故障或整個區域發生問題時的情況。Kubernetes 控制器應會發現部分服務已無法使用,因此必須在其他區域的節點上重新啟動:
隔離並排空其中一個區域中的節點。以下範例會以
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 叢集會自動回應模擬中斷。受影響節點上的任何服務都會在剩餘節點上重新啟動。
再次檢查 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
Kubernetes 控制器會辨識出有兩個節點無法再使用,並在可用節點之間重新分配服務。所有服務都應繼續執行。
檢查 Cymbal Bank 範例應用程式服務在 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
查看「服務」的
AGE
。在先前的輸出範例中,部分服務的年齡比 Cymbal Bank 範例應用程式中的其他服務年輕。這些較新的服務先前是在您模擬故障的其中一個節點上執行。Kubernetes 控制器已在可用節點上重新啟動這些服務。
在實際情況中,您會排解問題,或等待解決相關維護問題。如果您已設定 Prometheus,讓系統根據快訊傳送 Slack 訊息,就會看到這些通知。您也可以選擇重複上一個教學課程中的步驟來調度資源,瞭解當區域中只有兩個可用區域時,GKE 叢集如何因應負載增加的情況。叢集應會擴充,並使用其餘兩個可用區。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除您建立的專案。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
後續步驟
開始建立自己的 GKE 叢集環境 (類似於本系列教學課程中介紹的環境) 前,請先查看一些實際工作環境考量事項。