學習路徑:將單體式應用程式轉換為 GKE 應用程式 - 將應用程式部署至 GKE 叢集


這是學習路徑的第五個也是最後一個教學課程,將說明如何將單體式應用程式模組化及容器化。

這個學習路徑包含下列教學課程:

  1. 總覽
  2. 瞭解單體式架構
  3. 將單體應用程式模組化
  4. 準備將模組化應用程式容器化
  5. 將模組化應用程式容器化
  6. 將應用程式部署至 GKE 叢集 (本教學課程)

在先前的教學課程「將模組化應用程式容器化」中,您已準備好部署模組化 Cymbal Books 應用程式。您已將應用程式的模組容器化、測試產生的容器,並將容器映像檔推送至 Artifact Registry

在本教學課程中,您會將容器化應用程式部署至 Google Kubernetes Engine 叢集。這個步驟完成後,Cymbal Books 應用程式就會轉換為可在 Kubernetes 叢集上執行的模組化可擴充系統。

費用

按照本教學課程的步驟操作,會導致您的 Google Cloud帳戶產生費用。啟用 GKE 並部署 Cymbal Books 範例應用程式後,就會開始產生費用。這些費用包括 GKE 的叢集費用 (如定價頁面所述),以及執行 Compute Engine VM 的費用。

為避免產生不必要的費用,請務必在完成本教學課程後停用 GKE 或刪除專案。

事前準備

開始本教學課程前,請確認您已完成本系列先前的教學課程。如要查看整個系列課程的總覽,以及特定教學課程的連結,請參閱「學習路徑:將單體式應用程式轉換為 GKE 應用程式 - 總覽」。

具體來說,您必須先完成前一個教學課程「將模組化應用程式容器化」中的步驟。

設定 GKE 叢集

部署模組化 Cymbal Books 應用程式前,請先建立 GKE 叢集。這個叢集提供基礎架構,應用程式的容器將在其中執行。

在本教學課程中,您將使用 gcloud CLI 建立叢集。您也可以使用Google Cloud 控制台,透過圖形使用者介面 (GUI) 建立及管理 Google CloudGKE 叢集等資源。

建立及驗證 GKE 叢集

GKE 叢集提供在 Kubernetes 中執行容器所需的運算資源。請按照下列步驟,使用 gcloud CLI 建立叢集。

  1. 前往Google Cloud 控制台

  2. 在控制台中,按一下「啟用 Cloud Shell」按鈕:啟用 Cloud Shell

    此時 Cloud Shell 工作階段會在控制台底部的頁框中開啟,

  3. 在 Google Cloud CLI 中設定預設專案:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替換成您在上一篇教學課程的「選取或建立專案」 Google Cloud 一節中建立或選取的專案 ID。專案 ID 是專屬字串,可將專案與 Google Cloud中的所有其他專案區分開來。如要找出專案 ID,請前往專案選取器。您可以在該頁面查看每個專案的專案 ID。 Google Cloud

  4. 建立 GKE 叢集:

    gcloud container clusters create CLUSTER_NAME \
        --zone=ZONE \
        --num-nodes=2
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱,例如 cymbal-cluster

    • ZONE:要建立叢集的區域,例如 us-central1-aeurope-west1-b。如需可用區域的完整清單,請參閱地區和區域一文。

  5. 擷取叢集憑證,讓 kubectl CLI 可以連線至叢集:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=ZONE
    

    這項指令會更新 Kubernetes 設定檔,預設儲存在 ~/.kube/config 中。這個設定檔包含 kubectl 與 GKE 叢集互動時所需的憑證。

  6. 列出叢集節點,確認 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 叢集:

  1. 前往容器化應用程式的根目錄:

    cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
    
  2. 套用 Kubernetes 資訊清單:

    kubectl apply -f kubernetes_manifest.yaml
    

前一個指令會指示 Kubernetes 建立 kubernetes-manifest.yaml 檔案中指定的資源。這些資源包括服務、部署作業和 Pod。

您在「準備將模組化應用程式容器化」教學課程的「變更模組化程式碼」一節中,首次接觸到服務。在該教學課程中,您更新了應用程式的程式碼,改用服務名稱而非 localhost。這項更新可讓 Kubernetes 在模組之間轉送要求,並確保模組可以在叢集內彼此通訊。現在套用資訊清單時,Kubernetes 會在叢集內建立 Service。

Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集的節點中。下一節將說明 Pod。

什麼是 Kubernetes Pod?

在先前的教學課程中,您已為 Cymbal Books 應用程式的每個模組建立容器映像檔。舉例來說,您已根據 home_appbook_details_app 模組建立容器映像檔。

使用 kubectl apply 指令部署 Kubernetes 資訊清單時,Kubernetes 會將容器映像檔從 Artifact Registry 提取至叢集。在叢集中,容器映像檔會變成容器,而容器會在 Pod 內執行。

Pod 是容器執行的獨立環境,可執行下列工作:

  • 分配 CPU 和記憶體:Pod 提供容器運作所需的資源。
  • 提供網路:每個 Pod 都有自己的 IP 位址。這可讓 Pod 與其他 Pod 通訊。

Pod 會在節點上執行,節點是為叢集提供運算能力的機器。Kubernetes 會自動將 Pod 指派給節點,並將 Pod 分散到叢集的節點中,以降低任何單一節點過載的風險。這項分配作業有助於叢集有效運用運算和記憶體資源。

驗證部署作業

使用 kubectl apply 指令套用 Kubernetes 資訊清單後,請確認應用程式已成功部署至叢集。如要驗證 Deployment,請檢查 Pod 和服務是否正常運作。

檢查 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 長時間處於 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 類型的服務,EXTERNAL-IP 欄位會顯示公開 IP 位址,使用者可以在網頁瀏覽器中輸入該位址來存取應用程式。如果是 ClusterIP 類型的服務,這個欄位會空白,因為 ClusterIP 服務只能在叢集內存取。

測試部署作業

將 Cymbal Books 應用程式部署至 GKE 叢集後,請確認應用程式可存取,且容器可以相互通訊。

存取應用程式

請按照下列步驟確認應用程式是否可存取:

  1. 擷取 home-app-service 的外部 IP 位址:

    kubectl get services
    

    在輸出內容中找出 **EXTERNAL-IP** 欄,並記下與 home-app-service 相關聯的 IP 位址。

  2. 開啟網路瀏覽器並輸入下列網址:

    http://EXTERNAL-IP
    

    EXTERNAL-IP 替換為您在上一個步驟中找到的 IP 位址。

  3. 確認 Cymbal Books 應用程式首頁是否正常載入。

驗證服務間的通訊

Cymbal Books 應用程式中的容器會依賴服務交換資訊。 請按照下列步驟操作,確保容器能有效通訊:

  1. 如先前所述,擷取 home-app-service 的外部 IP 位址。

  2. 使用應用程式的介面測試容器之間的互動。如要進行這項操作,請在應用程式介面中點選所有可用的連結,確認下列功能是否正常運作:

    • 檢查書籍封面圖片:確認首頁和書籍詳細資料頁面都能正確載入書籍封面圖片。如果可以,表示 home_appbook_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 狀態的時間超過五分鐘 (例如處於 PendingContainerCreatingCrashLoopBackOff 狀態),您可以使用下列指令查看 Pod 狀態和事件的詳細資訊:

kubectl describe pod POD_NAME

POD_NAME 替換為要取得詳細資訊的 Pod 名稱。

輸出內容中的 Events 區段可能指出資源限制或圖片提取問題,導致 Pod 無法正常啟動。

驗證服務設定

確認服務設定正確無誤,尤其是透過外部 IP 位址公開住家模組的服務。使用下列指令列出服務:

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
    --zone=ZONE

更改下列內容:

  • CLUSTER_NAME:您建立的叢集名稱,例如 cymbal-cluster

  • ZONE:叢集建立所在的區域,例如 us-central1-a

系統提示時,請確認刪除。

確認叢集已刪除

如要確認叢集已刪除,請執行下列指令:

gcloud container clusters list

輸出內容中應該不會再顯示該叢集。如果出現,請稍候片刻,然後再試一次。

(選用) 刪除 Google Cloud 專案

如果您特地為此教學課程建立 Google Cloud 專案,且已不再需要此專案,請刪除整個 Google Cloud 專案。刪除專案會移除所有資源,並停止對專案計費:

  1. 在 Google Cloud 控制台中,開啟「Manage Resources」(管理資源) 頁面。
  2. 選取要刪除的專案。
  3. 按一下「Delete Project」(刪除專案),然後按照提示確認。

系列摘要

恭喜!完成這項學習路徑後,您已瞭解如何將單體式應用程式轉換為模組化容器化應用程式,並在 Kubernetes 叢集上執行。以下步驟會概略說明此流程:

  1. 瞭解單體式架構

    • 探索 Cymbal Books 單體式應用程式的結構。
    • 設定本機 Python 環境,執行單體式應用程式並測試其端點。
    • 瞭解應用程式的程式碼集,為模組化做好準備。
  2. 將單體應用程式模組化

    • 瞭解如何將單體式程式碼分割為獨立模組。每個模組都會處理不同的功能,例如顯示書籍詳細資料或評論。
    • 您已瞭解這些模組如何以獨立的 Flask 應用程式形式實作,並在不同通訊埠上執行。
    • 測試模組化應用程式。
  3. 準備用於容器化的模組化程式碼

    • 得知您必須在 home.py 中更新網址,改用服務名稱而非 localhost
    • 瞭解 Kubernetes 資訊清單如何定義 Service,讓已彼此通訊的應用程式模組在 Kubernetes 叢集環境中找到彼此。
  4. 將模組化應用程式容器化

    • 設定 Google Cloud 專案,並將應用程式從 GitHub 複製到 Cloud Shell。
    • 使用 Docker 為每個模組建構容器映像檔,並在本機測試容器。
    • 將容器映像檔推送至 Artifact Registry,準備將應用程式部署至叢集。
    • 更新 Kubernetes 資訊清單,以參照 Artifact Registry 中的容器映像檔路徑。
  5. 將應用程式部署至 GKE 叢集 (您目前正在閱讀的教學課程):

    • 已建立 GKE 叢集。
    • 將 Artifact Registry 中的容器映像檔部署至 GKE 叢集。
    • 測試應用程式最終版本,現在可擴充,並在 Kubernetes 環境中執行!

後續步驟

如要進一步瞭解如何建立叢集,請參閱「學習路徑:可擴充的應用程式」系列文章。