這是學習路徑的第三個教學課程,說明如何將單體式應用程式模組化及容器化。
這個學習路徑包含下列教學課程:
- 總覽
- 瞭解單體應用程式
- 將單體應用程式模組化
- 準備要容器化的模組化應用程式 (本教學課程)
- 將模組化應用程式容器化
- 將應用程式部署至 GKE 叢集
在先前的「將單體應用程式模組化」教學課程中,您已瞭解如何將 Cymbal Books 應用程式拆分成獨立的 Flask 模組。在本教學課程中,您將瞭解模組化應用程式需要進行的單一變更,為容器化做好準備。
費用
完成本教學課程不會產生任何費用。不過,如果您按照本系列最後一個教學課程的步驟操作,系統會向您的Google Cloud 帳戶收費。啟用 GKE 並將 Cymbal Books 應用程式部署至 GKE 叢集後,系統就會開始計費。這些費用包括 GKE 的叢集費用 (如定價頁面所述),以及執行 Compute Engine VM 的費用。
為避免產生不必要的費用,請務必在本教學課程結束後停用 GKE 或刪除專案。
事前準備
開始本教學課程前,請務必先完成本系列先前的教學課程。如要查看整個系列課程的總覽,以及特定教學課程的連結,請參閱「學習路徑:將單體應用程式轉換為 GKE 應用程式 - 總覽」。
如果您已完成第一個教學課程,應該已複製 GitHub 存放區。Cymbal Books 應用程式的三個版本都位於該存放區的下列資料夾中:
monolith/modular/containerized/
請先確認這些資料夾位於電腦上,再繼續操作。
變更模組化程式碼
在前一個教學課程中,您已瞭解首頁模組會與其他模組通訊。這個模組會將要求傳送至其他模組的端點,以擷取書籍詳細資料、評論和圖片,然後在 HTML 網頁中呈現這些資料。
在 modular/ 資料夾中,端點會使用 localhost 硬式編碼在 home.py 中,如下所示:
BOOK_SERVICE_URL = "http://localhost:8081" # Book details module listens on port 8081
REVIEW_SERVICE_URL = "http://localhost:8082" # Book reviews module listens on port 8082
IMAGE_SERVICE_URL = "http://localhost:8083" # Image module listens on port 8083
如果所有模組都在同一部機器上執行,這些網址就能正常運作。但在 Kubernetes 環境中,模組可以移至不同機器來處理故障或平衡負載,這表示模組的 IP 位址可能會變更。
為確保首頁模組仍可連線至其他模組,網址必須使用 Kubernetes 服務名稱,而非 localhost。服務名稱就像別名,Kubernetes 會使用這個別名將要求轉送至正確的模組,無論模組在哪裡執行都一樣。舉例來說,當首頁模組將要求傳送至 http://book-details-service/book/1 時,Kubernetes 會確保要求送達 book-details 模組。
您不需要自行更新這些網址。containerized/ 資料夾中的應用程式版本已包含這項變更:硬式編碼的 localhost 網址已替換為 Kubernetes 服務名稱。您可以在 containerized/home_app/home_app.py 中查看更新版本:
BOOK_SERVICE_URL = "http://book-details-service"
REVIEW_SERVICE_URL = "http://book-reviews-service"
IMAGE_SERVICE_URL = "http://images-service"
這項更新可確保應用程式在 Kubernetes 環境中執行時能正常運作。
Kubernetes 資訊清單
在上一節中,您已瞭解如何更新模組的端點,以使用 Kubernetes 服務名稱。您可以在 Kubernetes 資訊清單中定義 Service 名稱。
Kubernetes 資訊清單是設定檔,用於定義要建立哪種 Kubernetes 叢集來代管模組化應用程式。資訊清單是以 YAML 或 JSON 格式編寫而成。您可以在其中定義服務 (用於模組間的路由)、每個模組的副本 (執行個體) 數量,以及每個模組可使用的 CPU 和記憶體量。
Kubernetes 資訊清單可撰寫一整系列的教學課程。
資訊清單定義了 Kubernetes 叢集的所有內容,包括結構、行為和功能,因此相當複雜。在本教學課程中,您只會瞭解資訊清單中的服務名稱,如何與模組端點中使用的名稱相符。在後續教學課程中,您會執行 kubectl apply 指令,根據資訊清單中定義的設定建立 GKE 叢集,但在本教學課程中,您只會查看資訊清單。
查看資訊清單
在本節中,您將檢查為您編寫的 Kubernetes 資訊清單中,Service 的定義方式。資訊清單檔案 (YAML 檔案) 位於 GitHub 存放區的 containerized/ 資料夾中,您已在本系列的第一個教學課程中複製該存放區。請按照下列步驟查看服務定義:
在終端機中,前往複製存放區中的容器化目錄:
cd containerized在文字編輯器中開啟 Kubernetes 資訊清單檔案:
cat kubernetes_manifest.yaml找出
book-details模組的服務定義。如下列範例所示:apiVersion: v1 kind: Service metadata: name: book-details-service spec: selector: app: book-details-app ports: - protocol: TCP port: 80 # External traffic on port 80 targetPort: 8080 # Targeting container port 8080 type: ClusterIP
資訊清單中的 book-details-service 服務名稱與模組端點中使用的名稱相符:http://book-details-service。應用程式在 Kubernetes 中執行時,Kubernetes 會使用這些服務名稱,將要求轉送至正確的模組。
Kubernetes 資訊清單會定義 Kubernetes 叢集的特徵,包括處理要求路由的服務。應用程式中的每個模組都有對應的服務,這些服務是在資訊清單中定義。更新模組化程式碼中的網址,使其與這些服務名稱相符,即可確保應用程式在叢集中執行時,Kubernetes 能將要求轉送至正確的模組。
摘要
在本教學課程中,您已瞭解模組化程式碼中的網址如何更新,以使用 Kubernetes 服務名稱,例如 http://book-details-service。即使模組在叢集中的位置有所變更,Kubernetes 也能透過這些 Service 名稱在模組之間轉送要求。您也檢查了 Kubernetes 資訊清單,並瞭解模組化程式碼中的服務名稱與資訊清單中定義的名稱相符。
後續步驟
在下一個教學課程「將模組化應用程式容器化」中,您將瞭解如何將模組封裝到所謂的容器映像檔,藉此將模組容器化。接著,您會瞭解如何將容器映像檔做為容器執行、測試其功能,以及將容器映像檔推送至 Google 的 Artifact Registry。