学習プログラム: モノリスを GKE アプリに変換する - モジュラー型のアプリをコンテナ化できるように準備する


これは、モノリシック アプリをモジュール化してコンテナ化する方法を学習する学習プログラムの 3 番目のチュートリアルです。

この学習プログラムは、次のチュートリアルで構成されています。

  1. 概要
  2. モノリスを理解する
  3. モノリスをモジュール化する
  4. モジュラー型のアプリをコンテナ化できるように準備する(このチュートリアル)
  5. モジュラー型のアプリをコンテナ化する
  6. アプリを GKE クラスタにデプロイする

前のチュートリアル モノリスをモジュール化するでは、Cymbal Books アプリを独立した Flask モジュールに分割する方法を説明しました。このチュートリアルでは、コンテナ化の準備としてモジュラー アプリに加える必要がある 1 つの変更について説明します。

料金

このチュートリアルでは費用は発生しません。ただし、このシリーズの最後のチュートリアルの手順に沿って操作すると、Google Cloud アカウントに料金が発生します。費用が発生するのは、GKE を有効にして Cymbal Books アプリを GKE クラスタにデプロイしたときです。これらの費用には、料金ページで説明されている GKE のクラスタごとの料金と、Compute Engine VM の実行料金が含まれます。

不要な料金が発生しないように、このチュートリアルの完了後に GKE を無効にするか、プロジェクトを削除してください。

始める前に

このチュートリアルを開始する前に、このシリーズの前のチュートリアルを完了していることを確認してください。シリーズ全体の概要と特定のチュートリアルへのリンクについては、学習プログラム: モノリスを GKE アプリに変換する - 概要をご覧ください。

最初のチュートリアルをすでに完了している場合は、GitHub リポジトリのクローンを作成しています。Cymbal Books アプリの 3 つのバージョンはすべて、次のフォルダ内のリポジトリにあります。

  • monolith/
  • modular/
  • containerized/

続行する前に、これらのフォルダがマシンにあることを確認してください。

モジュール コードを変更する

前のチュートリアルでは、ホームページ モジュールが他のモジュールと通信することを学びました。他のモジュールのエンドポイントにリクエストを送信して、書籍の詳細、レビュー、画像を取得し、このデータを HTML ページに表示します。

modular/ フォルダでは、エンドポイントは home.py にハードコードされ、次のように localhost を使用します。

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

これらの URL は、すべてのモジュールが同じマシンで実行されている場合に機能します。ただし、Kubernetes 環境では、障害の処理や負荷の分散のためにモジュールを別のマシンに移動できるため、IP アドレスが変更される可能性があります。

ホームページ モジュールが他のモジュールにアクセスできるようにするには、URL で localhost ではなく Kubernetes Service 名を使用する必要があります。サービス名は、Kubernetes がリクエストを正しいモジュールにルーティングするために使用するエイリアスとして機能します。モジュールがどこで実行されているかは関係ありません。たとえば、ホームページ モジュールが http://book-details-service/book/1 にリクエストを送信すると、Kubernetes はリクエストが書籍詳細モジュールに到達するようにします。

これらの URL を手動で更新する必要はありません。containerized/ フォルダ内のアプリのバージョンには、この変更がすでに含まれています。ハードコードされた localhost URL が Kubernetes Service 名に置き換えられています。更新されたバージョンは 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 Service 名を使用するようにモジュールのエンドポイントを更新する方法について説明しました。Service 名は Kubernetes マニフェストで定義します。

Kubernetes マニフェストは、モジュラーアプリをホストするために作成する Kubernetes クラスタの種類を定義する構成ファイルです。マニフェストは YAML または JSON で記述されます。このファイルでは、サービス(モジュール間のルーティング用)、各モジュールのレプリカ(インスタンス)の数、各モジュールが使用できる CPU とメモリの量などを定義します。

Kubernetes マニフェストについては、チュートリアル シリーズ全体を記述できます。マニフェストは、Kubernetes クラスタの構造、動作、機能など、クラスタに関するすべてのことを定義するため、複雑になります。このチュートリアルでは、マニフェストのサービス名がモジュールのエンドポイントで使用される名前と一致する方法のみを説明します。後のチュートリアルでは、kubectl apply コマンドを実行して、マニフェストで定義された構成に従って GKE クラスタを作成しますが、このチュートリアルではマニフェストを確認するだけです。

マニフェストを表示する

このセクションでは、作成済みの Kubernetes マニフェストで Service がどのように定義されているかを確認します。マニフェスト ファイル(YAML ファイル)は、このシリーズの最初のチュートリアルでクローンを作成した GitHub リポジトリの containerized/ フォルダにあります。Service 定義を表示する手順は次のとおりです。

  1. ターミナルで、クローン作成されたリポジトリのコンテナ化されたディレクトリに移動します。

    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 クラスタの機能を定義します。アプリの各モジュールには、マニフェストで定義された対応する Service があります。モジュール式コードの URL をこれらのサービス名と一致するように更新することで、アプリがクラスタで実行されたときに、Kubernetes がリクエストを正しいモジュールに転送できるようになります。

概要

このチュートリアルでは、モジュラー コードの URL が http://book-details-service などの Kubernetes Service 名を使用するように更新される方法について説明しました。これらのサービス名により、クラスタ内のモジュールの場所が変更されても、Kubernetes はモジュール間でリクエストをルーティングできます。また、Kubernetes マニフェストを調べ、モジュール式コードの Service 名がマニフェストで定義された名前と一致していることを確認しました。

次のステップ

次のチュートリアル モジュラー型のアプリをコンテナ化するでは、モジュールをコンテナ イメージと呼ばれるものにパッケージ化してコンテナ化する方法について説明します。次に、コンテナ イメージをコンテナとして実行し、その機能をテストして、コンテナ イメージを Google の Artifact Registry に push する方法について説明します。