检查点
Provision Lab Environment
/ 20
Container-native Load Balancing Through Ingress
/ 20
Load Testing an Application
/ 20
Readiness and Liveness Probes
/ 20
Create Pod Disruption Budgets
/ 20
GKE 工作負載最佳化
GSP769
總覽
使用 Google Cloud 的其中一項好處,是只需按照實際使用的資源付費。因此,為應用程式和基礎架構配置合理的資源數量,並充分活用資源,對您來說十分重要。GKE 提供了許多工具和策略,可讓您減少不同資源和服務的用量,同時提高應用程式的可用性。
本實驗室將逐步介紹幾個概念,幫助您提升工作負載的資源效率與可用性。藉由瞭解及微調叢集的工作負載,您可以進一步確保只使用需要的資源,讓叢集成本獲得最佳效益。
目標
本實驗室的學習內容包括:
- 透過 Ingress 建立容器原生負載平衡器
- 對應用程式執行負載測試
- 設定 liveness 和 readiness 探測
- 建立 pod disruption budget
設定和需求
點選「Start Lab」按鈕前的須知事項
請詳閱以下操作說明。研究室活動會計時,而且中途無法暫停。點選「Start Lab」 後就會開始計時,讓您瞭解有多少時間可以使用 Google Cloud 資源。
您將在真正的雲端環境中完成實作研究室活動,而不是在模擬或示範環境。為達此目的,我們會提供新的暫時憑證,讓您用來在研究室活動期間登入及存取 Google Cloud。
如要完成這個研究室活動,請先確認:
- 您可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
- 是時候完成研究室活動了!別忘了,活動一開始將無法暫停。
如何開始研究室及登入 Google Cloud 控制台
-
按一下「Start Lab」(開始研究室) 按鈕。如果研究室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個研究室中使用的暫時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也能按一下滑鼠右鍵,然後選取「在無痕式視窗中開啟連結」。
接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:如果頁面中顯示「選擇帳戶」對話方塊,請點選「使用其他帳戶」。 -
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}} 您也可以在「Lab Details」窗格找到 Username。
-
點選「下一步」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}} 您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。 -
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
Google Cloud 控制台稍後會在這個分頁開啟。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
- 點按 Google Cloud 控制台上方的「啟用 Cloud Shell」圖示 。
連線完成即代表已通過驗證,且專案已設為您的 PROJECT_ID。輸出內容中有一行宣告本工作階段 PROJECT_ID 的文字:
gcloud
是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
-
點按「授權」。
-
輸出畫面應如下所示:
輸出內容:
- (選用) 您可以使用下列指令來列出專案 ID:
輸出內容:
輸出內容範例:
gcloud
的完整說明,請前往 Google Cloud 並參閱「gcloud CLI overview guide」(gcloud CLI 總覽指南)。
佈建實驗室環境
- 將預設可用區設為「
」:
-
按一下「授權」。
-
建立三個節點叢集:
其中包含 --enable-ip-alias
旗標,因為如果要透過 Ingress 使用容器原生負載平衡,則需要讓 pod 能使用別名 IP。
在本實驗室中,您要先將一個 HTTP 網頁應用程式部署為單一 pod。
- 為
gb-frontend
pod 建立資訊清單:
- 將新建立的資訊清單套用至叢集:
1 至 2 分鐘
,才能取得這項工作的分數。點選「Check my progress」,確認目標已達成。
工作 1:透過 Ingress 使用容器原生負載平衡功能
容器原生負載平衡功能可讓負載平衡器直接指定 Kubernetes Pod,並將流量平均傳送給 pod。
要是沒有容器原生負載平衡功能,負載平衡器流量會前往節點執行個體群組,並且透過 iptables
規則轉送到多個 pod,而這些 pod 不一定位於同一節點內:
容器原生負載平衡功能可讓 pod 成為負載平衡的核心物件,而可能降低網路躍點的數量:
容器原生負載平衡不但能更有效率地轉送流量,還可以大幅減少網路使用率、提升效能,甚至可以分配 Pod 間的流量,以及進行應用程式層級的健康檢查。
為了充分利用容器原生負載平衡功能,必須在叢集中啟用虛擬私有雲原生設定。當您建立叢集並加入 --enable-ip-alias
旗標,系統會要求您啟用設定。
- 以下資訊清單會建立
ClusterIP
服務,用於將流量轉送至應用程式 pod,進而允許 GKE 建立網路端點群組:
資訊清單包含 annotations
欄位,含有 cloud.google.com/neg
的註解,可在建立 Ingress 時為應用程式啟用容器原生負載平衡功能。
- 將變更套用至叢集:
- 接下來,為應用程式建立 Ingress:
- 將變更套用至叢集:
建立 Ingress 後,HTTP(S) 負載平衡器會建立,NEG (網路端點群組) 也會在叢集執行所在的每個可用區裡建立。幾分鐘後,Ingress 會獲派外部 IP。
建立的負載平衡器會在專案中執行後端服務,定義 Cloud Load Balancing 分配流量的方式。這個後端服務擁有與其相關聯的健康狀態。
- 如要檢查後端服務的健康狀態,請先擷取名稱:
- 取得服務的健康狀態:
健康檢查可能需要幾分鐘,才會傳回「健康狀態良好」狀態。
輸出內容應如下所示:
一旦各執行個體的健康狀態回報為「健康狀態良好」,您就可以透過其外部 IP 存取應用程式。
- 使用下列指令擷取狀態:
- 在瀏覽器視窗中輸入外部 IP,即可載入應用程式。
點選「Check my progress」,確認目標已達成。
工作 2:對應用程式進行負載測試
在為應用程式的 pod 選擇資源要求和限制,以及決定最佳的自動調度資源策略時,瞭解應用程式容量是很重要的步驟。
您已在本實驗室一開始就將應用程式部署為單一 pod。如果對在單一 pod 上執行的應用程式進行負載測試,且不設定自動調度資源策略,您就能瞭解應用程式可處理多少並行要求、需要多少 CPU 和記憶體,以及應用程式可能如何回應大量負載。
如要對 pod 進行負載測試,請使用 Locust,此為開放原始碼負載測試架構。
- 在 Cloud Shell 中,為 Locust 下載 Docker 映像檔:
提供的 locust-image
目錄中包含 Locust 設定檔。
- 為 Locust 建構 Docker 映像檔,然後將其儲存在專案的 Container Registry:
- 確認 Docker 映像檔已位於專案的 Container Registry:
預期輸出內容:
Locust 包含一個主要機器與幾個工作站機器,用於產生負載。
- 複製並套用資訊清單,為工作站的主要 Deployment 和 5 個備用資源 Deployment 建立單一 pod 的 Deployment:
- 如要存取 Locust UI,請擷取與其相對應的 LoadBalancer 服務的外部 IP 位址:
如果外部 IP 的值為 <pending>,請稍後並重新執行上述指令,直到畫面顯示有效的值。
- 在新的瀏覽器視窗中前往
[EXTERNAL_IP_ADDRESS]:8089
,開啟 Locust 網頁:
點選「Check my progress」,確認目標已達成。
Locust 可讓您與多位使用者同時「群集處理」應用程式。您可以輸入以特定頻率產生的使用者數量,藉此模擬流量。
-
舉例來說,如要表示一般負載,請輸入 200 做為要模擬的使用者數量,產生率則輸入 20。
-
按一下「Start Swarming」。
幾秒後,「status」應該會顯示「Running」,使用者人數為 200 位,每秒要求數 (RPS) 則約 150 次。
-
切換至 Cloud 控制台,然後依序點選「導覽選單」圖示 >「Kubernetes Engine」。
-
在左側面板中選取「工作負載」。
-
接著按一下您部署的 gb-frontend pod。
您會前往「Pod 詳細資料」頁面,您可以在其中查看 pod 的 CPU 和記憶體使用率圖表。請觀察「已使用」和「已要求」的值。
目前的負載測試是每秒約 150 次要求,您可以看到 CPU 使用率最低為 .04,最高則為 .06.。這表示單一 pod 的 CPU 要求為 40 到 60%。另一方面,記憶體使用率保持在約 80Mi,遠低於要求的 256Mi。此為每個 pod 的容量。在設定叢集自動配置器、資源要求和限制,以及選擇導入水平/垂直 Pod 自動配置器的方式和時機時,這項資訊就能派上用場。
在得出基準後,您也應該思考,若流量突然激增或達到尖峰,應用程式會如何因應。
-
返回 Locust 瀏覽器視窗,然後按一下頁面頂端狀態下方的「Edit」。
-
這次將要模擬的使用者人數輸入 900,產生率則輸入 300。
-
按一下「Start Swarming」。
您的 pod 會在 2 到 3 秒內突然收到 700 個其他要求。在 RPS 值達到約 150,而狀態指出有 900 位使用者後,請返回「Pod 詳細資料」頁面,然後觀察圖表的變化。
記憶體的使用率不變,而 CPU 的峰值約為 .07,也就是 pod 的 CPU 要求百分比為 70%。如果這個應用程式是 Deployment,您或許可以安全地減少記憶體總要求數,並且設定依據 CPU 使用率觸發的水平自動配置器。
工作 3:readiness 和 liveness 探測
設定 liveness 探測
如果在 Kubernetes pod 或 Deployment 規格中設定 liveness 探測,它會繼續執行,偵測容器是否需要重新啟動,並且觸發重新啟動作業。這麼做可將處於死結狀態,但仍在繼續執行的應用程式自動重新啟動。舉例來說,只有所有容器傳送的 readiness 探測結果為成功,Kubernetes 代管的負載平衡器 (例如服務) 才會將流量傳送到 pod 後端。
- 為了說明 liveness 探測,以下指令將為含有 liveness 探測的 pod 產生資訊清單,liveness 探測是以建立檔案時所執行的 cat 指令為基礎:
- 將資訊清單套用至叢集,以便建立 pod:
initialDelaySeconds
值代表的是在容器啟動後,要過多久才執行第一次探測。periodSeconds 值表示系統執行探測的頻率。
startupProbe
,用於指出容器中的應用程式是否啟動。如果指令中有 startupProbe
,則在傳回 Success
狀態前,系統不會執行其他探測。若應用程式的啟動時間可能會變動,建議採用這種做法,以免 liveness 探測中斷。基本上,在本示例中,liveness 探測會檢查容器中的檔案系統是否存在「/tmp/alive」檔案。
- 如想驗證 pod 容器的健康狀態,可以檢查 pod 的事件:
在輸出內容底部的「Events」部分,應該會有 pod 最新的 5 個事件。這時,pod 的事件應該只會含有與建立和啟動 pod 相關的事件:
此事件記錄包含 liveness 探測的所有失敗結果,以及因此而觸發的重新啟動作業。
- 手動刪除 liveness 探測所用的檔案:
-
檔案移除後,liveness 探測所用的
cat
指令應該會傳回非零結束代碼。 -
再次檢查 pod 的事件:
liveness 探測失敗後,記錄中會新增事件,顯示一系列啟動步驟。開頭是 liveness 探測失敗 (Liveness probe failed: cat: /tmp/alive: No such file or directory
),結尾則是容器再次啟動 (Started container
):
livenessProbe
的指令,取決於指定指令的結束代碼。除了指令探測之外,livenessProbe
也可以設為 HTTP 探測,根據 HTTP 回應來取得結果,或設為 TCP 探測,根據是否可在特定通訊埠上進行 TCP 連線來取得結果。設定 readiness 探測
雖然 pod 可以成功啟動,且 liveness 探測結果顯示為健康狀態良好,pod 有可能還無法立即接收流量。如果將 Deployment 做為負載平衡器等服務的後端,則這是很常見的情形。readiness 探測是用於決定 pod 和其容器何時可以開始接收流量。
- 為了方便說明,請建立資訊清單,用於建立單一 pod,做為測試網路伺服器及負載平衡器:
- 將資訊清單套用至叢集,然後用它建立負載平衡器:
- 擷取指派給負載平衡器的外部 IP 位址。這項作業要先由上一個指令指派位址,因此可能需要一分鐘才能完成:
-
在瀏覽器視窗中輸入 IP 位址,您會發現收到錯誤訊息,指出無法存取網站。
-
檢查 pod 的事件:
輸出內容顯示 readiness 探測失敗:
與 liveness 探測不同,健康狀態不良的 readiness 探測不會使 pod 重新啟動。
- 使用下列指令,產生 readiness 探測要檢查的檔案:
現在 pod 說明的「Conditions
」部分中,「Ready
」的值應該會顯示為「True
」。
輸出內容:
- 現在重新整理包含 readiness-demo-svc 外部 IP 的瀏覽器分頁。您應該會看到畫面上正常顯示「Welcome to nginx!」訊息。
為應用程式容器設定有意義的 readiness 探測,確保 pod 只會在準備就緒時接收流量。檢查應用程式仰賴的快取是否在啟動時載入,就是一種具有意義的 readiness 探測。
點選「Check my progress」,確認目標已達成。
工作 4:Pod disruption budget
如想確保 GKE 應用程式的可靠性和運作時間,也可以使用 Pod disruption budget (pdp)。PodDisruptionBudget
為 Kubernetes 資源,可針對因自願中斷而可以同時執行的備用應用程式,限制其 pod 數量。
自願中斷包括各種管理動作,例如刪除 Deployment、更新 Deployment 的 pod 範本和執行滾動式更新、排除應用程式 pod 所在的節點,或是將 pod 移至不同節點。
首先,您必須將應用程式部署為 Deployment。
- 刪除單一 pod 應用程式:
- 接著產生資訊清單來建立應用程式,做為 5 個備用資源的 Deployment:
- 將這個 Deployment 套用至叢集:
點選「Check my progress」,確認目標已達成。
建立 PDB 前,您要排除叢集的節點,然後觀察若沒有 PDB,應用程式會有何種行為。
- 如要排除節點,請循環執行
default-pool
的節點輸出內容,然後在每個節點上執行kubectl drain
指令:
上述指令會從指定節點剔除並限制 pod,因此無法在指定節點上建立新 pod。如果可用資源允許,系統會在不同節點上重新部署 pod。
- 如果節點遭到排除,請檢查
gb-frontend
Deployment 的備用資源數量:
輸出內容可能如下所示:
如上述的輸出內容所示,排除節點後,Deployment 可用的備用資源最少為 0。如果沒有可用的 pod,應用程式的效能會顯著下降。讓我們再次嘗試排除節點,但這次要為應用程式使用 Pod disruption budget。
- 首先取消對節點的限制,恢復遭排除的節點。以下指令可重新在節點上安排 pod:
- 再次檢查 Deployment 狀態:
輸出內容應類似以下結果,包含所有 5 個可用的備用資源:
- 建立 Pod disruption budget,宣告可用 pod 的數量下限為 4。
- 再次排除叢集的其中一個節點,然後觀察輸出內容:
成功剔除應用程式的其中一個 pod 後,系統會循環執行下列指令:
-
按下 CTRL+C 以結束指令。
-
再次確認 Deployment 狀態:
現在輸出內容應如下所示:
在 Kubernetes 能在不同節點上部署第 5 個 pod,藉此剔除下一個 pod 之前,其餘的 pod 依然可用,以便符合 PDB 要求。在本示例中,Pod disruption budget 設定指定的是可用數量下限,但您也可以透過 PDB 設定來定義無法使用數量的上限。每個值皆能以整數表示,代表 pod 數量或 pod 總數的百分比。
恭喜!
您已瞭解如何透過 Ingress 建立容器原生負載平衡器,更有效率地善用負載平衡和轉送功能。您對 GKE 應用程式執行了簡易負載測試,並且觀察應用程式的基準 CPU 和記憶體使用率,以及應用程式如何因應流量高峰。此外,您也設定了 liveness 探測、readiness 探測和 Pod disruption budget,確保應用程式的可用性。將這些工具與技術搭配使用,能夠盡量減少多餘的網路流量、定義有意義的應用程式良好行為指標,並且強化應用程式的可用性,進而提升應用程式在 GKE 上執行的整體效率。
後續行動/瞭解詳情
查看下列資源,進一步瞭解本實驗室涵蓋的主題:
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2024 年 3 月 12 日
實驗室上次測試日期:2024 年 3 月 12 日
Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。