這是學習路徑的第五個也是最後一個教學課程,說明如何將單體式應用程式模組化及容器化。
這個學習路徑包含下列教學課程:
- 總覽
- 瞭解單體應用程式
- 將單體應用程式模組化
- 準備要進行容器化的模組化應用程式
- 將模組化應用程式容器化
- 將應用程式部署至 GKE 叢集 (本教學課程)
在先前的教學課程「將模組化應用程式容器化」中,您已準備好部署模組化 Cymbal Books 應用程式。您已將應用程式模組容器化、測試產生的容器,並將容器映像檔推送至 Artifact Registry。
在本教學課程中,您會將容器化應用程式部署至 Google Kubernetes Engine 叢集。完成這個步驟後,Cymbal Books 應用程式就會轉換為模組化且可擴充的系統,並在 Kubernetes 叢集上運作。
費用
按照本教學課程的步驟操作,會導致您的 Google Cloud帳戶產生費用。啟用 GKE 並部署 Cymbal Books 範例應用程式後,就會開始產生費用。這些費用包括 GKE 的每叢集費用 (如定價頁面所述),以及執行 Compute Engine VM 的費用。
為避免產生不必要的費用,請務必在本教學課程結束後停用 GKE 或刪除專案。
事前準備
開始本教學課程前,請確認您已完成本系列先前的教學課程。如需整個系列的總覽和特定教學課程的連結,請參閱「學習路徑:將單體式應用程式轉換為 GKE 應用程式 - 總覽」。
特別是您必須已完成上一個教學課程「將模組化應用程式容器化」中的步驟。
設定 GKE 叢集
您必須先建立 GKE 叢集,才能部署模組化 Cymbal Books 應用程式。這個叢集提供基礎架構,可供應用程式的容器執行。
在本教學課程中,您將使用 gcloud CLI 建立叢集。或者,您也可以使用Google Cloud 控制台,這個圖形使用者介面 (GUI) 可用於建立及管理 Google Cloud資源,例如 GKE 叢集。
建立及驗證 GKE 叢集
GKE 叢集提供在 Kubernetes 中執行容器所需的運算資源。請按照下列步驟,使用 gcloud CLI 建立叢集。
前往 Google Cloud 控制台。
在控制台中,點選「啟用 Cloud Shell」按鈕:

此時 Cloud Shell 工作階段會在控制台底部的頁框中開啟。
在 Google Cloud CLI 中設定預設專案:
gcloud config set project PROJECT_ID將
PROJECT_ID替換成您在先前教學課程的「選取或建立專案」 Google Cloud 部分中建立或選取的專案 ID。專案 ID 是專屬字串,可將您的專案與 Google Cloud中的所有其他專案區分開來。如要找出專案 ID,請前往專案選取器。 在該頁面中,您可以查看每個 Google Cloud專案的專案 ID。建立 GKE 叢集:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --num-nodes=2更改下列內容:
CLUSTER_NAME:叢集名稱,例如cymbal-cluster。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。提供區域叢集的區域,或可用區叢集的可用區,例如us-central1或europe-west1-b。
擷取叢集的憑證,讓
kubectlCLI 可以連線至叢集:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION這項指令會更新 Kubernetes 設定檔 (預設儲存在
~/.kube/config中)。這個設定檔包含kubectl與 GKE 叢集互動所需的憑證。列出叢集節點,確認
kubectl已連線至叢集:kubectl get nodes如果設定成功,這項指令會列出 GKE 叢集中的節點。由於您使用
--num-nodes=2建立叢集,因此應該會看到兩個節點的相關資訊,如下所示:NAME STATUS ROLES AGE VERSION gke-nov18-default-pool-6a8f9caf-bryg Ready <none> 30s v1.30.8-gke.1128000 gke-nov18-default-pool-6a8f9caf-ut0i Ready <none> 30s v1.30.8-gke.1128000在本例中,兩個節點都處於
Ready狀態。這個狀態表示 GKE 叢集已準備好代管容器化工作負載!
部署應用程式
您已建立 GKE 叢集,現在可以將 Cymbal Books 應用程式部署至該叢集。如要將應用程式部署至叢集,請將 Kubernetes 資訊清單套用至叢集。
套用 Kubernetes 資訊清單
在 Cloud Shell 執行下列指令,將應用程式部署至 GKE 叢集:
前往容器化應用程式的根目錄:
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/套用 Kubernetes 資訊清單:
kubectl apply -f kubernetes_manifest.yaml
上一個指令會指示 Kubernetes 建立 kubernetes-manifest.yaml 檔案中指定的資源。這些資源包括 Service、Deployment 和 Pod。
您在「準備將模組化應用程式容器化」教學課程的「變更模組化程式碼」一節中,首次遇到服務。在該教學課程中,您更新了應用程式的程式碼,改用服務名稱而非 localhost。這項更新可讓 Kubernetes 在模組之間傳送要求,並確保模組可在叢集內彼此通訊。現在套用資訊清單時,Kubernetes 會在叢集內建立 Service。
Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,這些副本會分散在叢集的節點中。下一節將說明什麼是 Pod。
什麼是 Kubernetes Pod?
在先前的教學課程中,您已為 Cymbal Books 應用程式的每個模組建立容器映像檔。舉例來說,您根據 home_app 和 book_details_app 模組建立了容器映像檔。
使用 kubectl apply 指令部署 Kubernetes 資訊清單時,Kubernetes 會將容器映像檔從 Artifact Registry 提取到叢集。在叢集中,容器映像檔會變成容器,而容器會在 Pod 中執行。
Pod 是容器執行的隔離環境,可執行下列工作:
- 分配 CPU 和記憶體:Pod 會提供容器運作所需的資源。
- 提供網路:每個 Pod 都有自己的 IP 位址。這樣 Pod 就能與其他 Pod 通訊。
Pod 會在節點上執行,這些機器會為叢集提供運算能力。Kubernetes 會自動將 Pod 指派給節點,並將 Pod 分散到叢集的節點中,以降低任何單一節點過載的風險。這項分配作業有助於叢集有效運用運算和記憶體資源。
驗證 Deployment
使用 kubectl apply 指令套用 Kubernetes 資訊清單後,請確認應用程式已成功部署至叢集。如要驗證 Deployment,請確認 Pod 和 Service 是否正常運作。
檢查 Pod
如要查看叢集中的 Pod,請執行下列指令:
kubectl get pods
這個指令會列出 Pod 和目前狀態。查看「STATUS」欄位,確認所有 Pod 都標示為 Running,表示這些 Pod 成功執行,可處理要求。預期的輸出內容如下所示:
NAME READY STATUS RESTARTS AGE
home-app-67d59c6b6d-abcde 1/1 Running 0 30s
book-details-app-6d8bcbc58f-xyz 1/1 Running 0 30s
book-reviews-app-75db4c4d7f-def 1/1 Running 0 30s
images-app-7f8c75c79c-ghi 1/1 Running 0 30s
Pod 的狀態最初會顯示為 Pending,因為系統正在建立 Pod,且容器正在啟動。如果 Pod 長時間維持在 Pending 狀態,叢集可能沒有足夠的資源,讓 Pod 進入健康的 Running 狀態。如果 Pod 的狀態為 CrashLoopBackOff,容器可能發生問題。疑難排解步驟會在教學課程的後續階段提供。
檢查服務
Service 可讓 Pod 之間進行通訊,並允許外部用戶端 (例如使用者、自動化指令碼或監控工具) 存取應用程式。如要查看叢集中的 Service,請執行下列指令:
kubectl get services
這個指令的輸出內容如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
home-app-service LoadBalancer 10.12.3.4 35.185.1.2 80:30837/TCP 30s
details-service ClusterIP 10.12.3.5 <none> 80/TCP 30s
reviews-service ClusterIP 10.12.3.6 <none> 80/TCP 30s
images-service LoadBalancer 10.12.3.7 34.125.6.3 80:32014/TCP 30s
輸出內容中應觀察的重要欄位如下:
TYPE:這個欄位會指出服務的公開方式。LoadBalancer類型的服務可提供應用程式的外部存取權。EXTERNAL-IP:如果是LoadBalancer類型的 Service,EXTERNAL-IP欄位會顯示公開 IP 位址,使用者只要在網路瀏覽器中輸入該位址,即可存取應用程式。如果是ClusterIP類型的 Service,這個欄位會留空,因為ClusterIPService 只能在叢集內存取。
測試部署作業
將 Cymbal Books 應用程式部署至 GKE 叢集後,請確認應用程式可供存取,且容器之間可以互相通訊。
存取應用程式
請按照下列步驟,確認應用程式可供存取:
擷取
home-app-service的外部 IP 位址:kubectl get services在輸出內容中尋找
**EXTERNAL-IP**欄,並記下與home-app-service相關聯的 IP 位址。開啟網路瀏覽器,然後輸入下列網址:
http://EXTERNAL-IP將
EXTERNAL-IP替換為您在上一個步驟中找到的 IP 位址。確認 Cymbal Books 應用程式的首頁能正確載入。
驗證服務間的通訊
Cymbal Books 應用程式中的容器會透過服務交換資訊。 請按照下列步驟操作,確保容器能有效通訊:
按照前述步驟,擷取
home-app-service的外部 IP 位址。使用應用程式的介面測試容器之間的互動。如要確認這些功能是否正常運作,請在應用程式介面中點選所有可用的連結:
- 檢查書籍封面圖片:確認書籍封面圖片在首頁和書籍詳細資料頁面都能正確載入。如果可以,表示
home_app和book_details_app容器已成功與images_app容器通訊。 - 查看書籍詳細資料:從首頁前往書籍詳細資料頁面。如果看到書籍詳細資料,表示
home_app容器與book_details_app之間的通訊正常。 - 查看書評:按一下書評連結,確認
home_app容器可以與book_reviews_app容器通訊。
- 檢查書籍封面圖片:確認書籍封面圖片在首頁和書籍詳細資料頁面都能正確載入。如果可以,表示
您的應用程式現已在 GKE 叢集上執行!
恭喜!您已瞭解如何將單體式應用程式轉換為模組化容器化系統,並在運作中的 GKE 叢集上執行。過程中,您學會如何將緊耦合的程式碼拆分為獨立模組、建構容器映像檔並推送至存放區、定義 Kubernetes 資訊清單,以及將應用程式從登錄檔部署至 GKE。這是一項重大成就,反映了團隊為雲端應用程式現代化所採取的實際步驟!
疑難排解
如果應用程式沒有回應,或容器無法通訊,請按照下列疑難排解步驟診斷及解決常見問題。
查看 Pod 狀態
請先列出叢集中的所有 Pod,判斷這些 Pod 是否如預期般執行:
kubectl get pods
查看輸出內容,確認每個 Pod 都處於 Running 狀態。如果任何 Pod 未執行,請記下其名稱以供進一步檢查。
檢查 Pod 記錄
如果 Pod 無法正確處理要求,請查看記錄檔,找出錯誤訊息:
kubectl logs POD_NAME
將 POD_NAME 替換為要檢查的 Pod 名稱。這項指令有助於找出啟動問題或執行階段錯誤。
取得 Pod 詳細資訊
如果 Pod 處於非 Running 狀態超過五分鐘 (例如 Pending、ContainerCreating 或 CrashLoopBackOff 狀態),您可以使用下列指令查看 Pod 狀態和事件的詳細資訊:
kubectl describe pod POD_NAME
將 POD_NAME 替換為要取得詳細資訊的 Pod 名稱。
輸出內容中的 Events 區段可能會指出,資源限制或映像檔提取問題導致 Pod 無法正常啟動。
驗證服務設定
請確認 Service 設定正確,尤其是透過外部 IP 位址公開主頁模組的 Service。使用下列指令列出服務:
kubectl get services
如果發現住家服務模組的 EXTERNAL-IP 地址列為 Pending,請執行下列指令:
kubectl describe service SERVICE_NAME
將 SERVICE_NAME 替換為主畫面模組服務的名稱。
這個指令會提供服務設定的詳細資料,協助您找出指派外部 IP 位址時的延遲問題,或是其他設定問題。
檢查叢集事件
您可以檢查叢集事件,判斷問題是否影響叢集的數個元件:
kubectl get events
這個指令可判斷更廣泛的資源或網路問題是否影響部署作業。
清除所用資源
執行 GKE 叢集會產生費用。完成本教學課程後,請清除資源,以免產生額外費用。請按照下列步驟移除叢集,並視需要移除整個專案。
刪除 GKE 叢集
如要刪除 GKE 叢集,請使用下列指令:
gcloud container clusters delete CLUSTER_NAME
--location=CONTROL_PLANE_LOCATION
更改下列內容:
CLUSTER_NAME:您建立的叢集名稱,例如cymbal-cluster。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。提供區域叢集的區域,或可用區叢集的可用區。
在系統提示時確認刪除。
確認叢集已刪除
執行下列指令,確認叢集已刪除:
gcloud container clusters list
輸出內容中應該不會再顯示該叢集。如果是的話,請稍候片刻,然後再試一次。
(選用) 刪除 Google Cloud 專案
如果您特地為本教學課程建立 Google Cloud 專案,且已不再需要,可以刪除整個 Google Cloud 專案。刪除專案會移除所有資源,並停止產生專案費用:
- 開啟 Google Cloud 控制台的「管理資源」頁面。
- 選取要刪除的專案。
- 按一下「刪除專案」,然後按照提示確認操作。
系列摘要
恭喜!完成這項學習路徑後,您已瞭解如何將單體式應用程式轉換為模組化容器化應用程式,並在 Kubernetes 叢集上執行。以下步驟概略說明整個流程:
-
- 探索 Cymbal Books 單體式應用程式的結構。
- 設定本機 Python 環境來執行單體,並測試其端點。
- 瞭解應用程式的程式碼集,為模組化做好準備。
-
- 瞭解如何將單體式程式碼拆分為獨立模組。每個模組負責處理不同的功能,例如顯示書籍詳細資料或評論。
- 瞭解如何將這些模組實作為獨立的 Flask 應用程式,並在不同通訊埠上執行。
- 測試模組化應用程式。
-
- 得知您必須更新
home.py中的網址,才能使用服務名稱,而非localhost。 - 瞭解 Kubernetes 資訊清單如何定義 Service,讓應用程式模組 (已彼此通訊) 在 Kubernetes 叢集環境中找到彼此。
- 得知您必須更新
-
- 設定 Google Cloud 專案,並將應用程式從 GitHub 複製到 Cloud Shell。
- 使用 Docker 為每個模組建構容器映像檔,並在本機測試容器。
- 將容器映像檔推送至 Artifact Registry,準備將應用程式部署至叢集。
- 更新 Kubernetes 資訊清單,參照 Artifact Registry 中的容器映像檔路徑。
將應用程式部署至 GKE 叢集 (即您目前所在的教學課程):
- 建立 GKE 叢集。
- 將 Artifact Registry 中的容器映像檔部署至 GKE 叢集。
- 測試應用程式的最終版本,現在可擴充,並在 Kubernetes 環境中執行!
後續步驟
如要進一步瞭解如何建立叢集,請參閱「學習路徑:可擴展的應用程式」系列課程。