IT 管理員和營運人員可以透過這個系列的教學課程,瞭解如何部署、執行及管理 Google Kubernetes Engine (GKE) 中運作的現代化應用程式環境。在本系列教學課程中,您將瞭解如何設定監控和快訊、擴充工作負載,以及模擬失敗,所有操作都使用 Cymbal Bank 範例微服務應用程式:
總覽和目標
應用程式應能容許中斷和故障。這項功能可讓使用者在發生問題時,繼續存取應用程式。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 範例應用程式已部署至多個可用區,有助於防範非預期的故障。
檢查 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 控制器會監控叢集中的節點、服務和部署作業狀態。如果發生非預期的服務中斷,控制器會重新啟動受影響的資源,並將流量導向正常運作的節點。
在本教學課程中,您將封鎖並排空其中一個可用區中的節點,藉此模擬服務中斷。這種做法可模擬節點故障或整個區域發生問題時的情況。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 叢集會自動回應模擬中斷。 受影響節點上的任何服務都會在剩餘節點上重新啟動。
再次檢查 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.4Kubernetes 控制器會辨識出有兩個節點無法再使用,並在可用節點之間重新分配服務。所有服務都應繼續執行。
查看 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查看「服務」的
AGE。在先前的範例輸出內容中,部分服務的年齡比 Cymbal Bank 範例應用程式中的其他服務年輕。這些較新的服務先前在您模擬故障的其中一個節點上執行。Kubernetes 控制器會在可用的節點上重新啟動這些 Service。
在實際情境中,您會排解問題,或等待解決基礎維護問題。如果您已設定 Prometheus,讓系統根據快訊傳送 Slack 訊息,就會收到這些通知。您也可以選擇重複上一個教學課程中的步驟來調度資源,瞭解當區域只有兩個可用地帶時,GKE 叢集如何因應負載增加的情況。叢集應會擴大,並使用其餘兩個可用區。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除您建立的專案。
- 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
後續步驟
請參閱下一個教學課程,瞭解如何使用 Config Sync 集中管理變更。