學習路徑:將單體式應用程式轉換為 GKE 應用程式 - 準備模組化應用程式以進行容器化


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

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

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

在先前的教學課程「將單體式應用程式模組化」中,您已瞭解如何將 Cymbal Books 應用程式分割為獨立的 Flask 模組。在本教學課程中,您將瞭解模組化應用程式需要進行的單一變更,以便準備進行容器化。

費用

完成本教學課程不會產生任何費用。不過,按照本系列最後一個教學課程中的步驟操作,會導致您的Trusted Cloud by S3NS 帳戶產生費用。啟用 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。Service 名稱就像別名,Kubernetes 會使用這個別名將要求轉送至正確的模組,無論模組在哪裡執行都一樣。舉例來說,當首頁模組將要求傳送至 http://book-details-service/book/1 時,Kubernetes 會確保要求送達 book-details 模組。

您不需要自行更新這些網址。containerized/ 資料夾中的應用程式版本已包含這項變更:硬式編碼的 localhost URL 已替換為 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 資訊清單中,服務的定義方式。資訊清單檔案 (YAML 檔案) 位於 GitHub 存放區的 containerized/ 資料夾中,您已在本系列的第一個教學課程中複製該存放區。如要查看服務定義,請按照下列步驟操作:

  1. 在終端機中,前往複製存放區中的 containerized 目錄:

    cd containerized
    
  2. 在文字編輯器中開啟 Kubernetes 資訊清單檔案:

    cat kubernetes_manifest.yaml
    
  3. 找出 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 會使用這些 Service 名稱,將要求轉送至正確的模組。

Kubernetes 資訊清單會定義 Kubernetes 叢集的各項功能,包括處理要求路由的服務。應用程式中的每個模組都有對應的服務,這些服務會在資訊清單中定義。只要更新模組化程式碼中的網址,使其與這些服務名稱相符,就能確保 Kubernetes 在叢集中執行應用程式時,可將要求路由至正確的模組。

摘要

在本教學課程中,您已瞭解模組化程式碼中的網址如何更新,以使用 Kubernetes 服務名稱,例如 http://book-details-service。即使模組在叢集中的位置變更,Kubernetes 也能透過這些服務名稱在模組之間轉送要求。您也檢查了 Kubernetes 資訊清單,並瞭解模組化程式碼中的服務名稱如何與資訊清單中定義的名稱相符。

後續步驟

在下一個教學課程「將模組化應用程式容器化」中,您將瞭解如何將模組封裝到稱為「容器映像檔」的內容中,藉此將模組容器化。接著,您會瞭解如何將容器映像檔做為容器執行、測試其功能,以及將容器映像檔推送至 Google 的 Artifact Registry。