Kubernetes Engine での Python Bookshelf の実行

このチュートリアルでは、Google Kubernetes Engine(GKE)上で Python Bookshelf アプリを実行する方法について説明します。このチュートリアルに沿って、既存の Python ウェブアプリをコンテナ化し、GKE にデプロイします。App Engine スタンダード環境のチュートリアルの一部として、Bookshelf アプリのドキュメントを参照することをおすすめします。

目標

  • GKE クラスタを作成する。
  • Python アプリをコンテナ化する。
  • Bookshelf アプリ用のレプリケート済みのフロントエンドを作成する。
  • Bookshelf アプリ用のレプリケート済みのバックエンドを作成する。
  • Bookshelf フロントエンドに HTTP トラフィックをルーティングする負荷分散サービスを作成する。

費用

このチュートリアルでは、以下を含む Google Cloud Platform(GCP)の課金対象コンポーネントを使用します。

  • GKE
  • Compute Engine
  • Cloud Storage
  • Cloud Datastore
  • Cloud Pub/Sub

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。 GCP を初めて使用される方は、無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. Cloud Datastore、Kubernetes Engine、Cloud Storage、Cloud Pub/Sub、Google+ API を有効にします。

    APIを有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Docker をインストールします。Docker は、コンテナ イメージをローカルで構築するために使用します。
  7. kubectl をインストールします。
    gcloud components install kubectl

GKE クラスタの作成

GKE クラスタは、単一の GKE クラスタとして動作する Compute Engine 仮想マシンのマネージド セットです。このチュートリアルでは、2 つ以上のノードから構成されるクラスタを使用します。このようなノードでは、すべての Google API へのアクセス権が必要です。

  1. クラスタを作成します。[YOUR_GCP_ZONE] は、クラスタをホストする GCP ゾーンに置き換えてください。

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform" \
        --num-nodes 2 \
        --enable-basic-auth \
        --issue-client-certificate \
        --enable-ip-alias \
        --zone [YOUR_GCP_ZONE]
    
  2. クラスタに対するアクセス権があることを確認します。次のコマンドは、コンテナ クラスタにあるノードの一覧を表示します。コンテナ クラスタが実行中で、アクセス可能であることを確認できます。

    kubectl get nodes
    

kubectl コマンドを使用して、GKE クラスタにリソースを作成します。kubectl の詳細については、GKE クラスタの操作をご覧ください。通常、GCP プロジェクトのリソースの管理には gcloud を使用し、GKE クラスタ内のリソースの管理には kubectl を使用します。1 つのプロジェクトに複数のクラスタを設定できます。これにより、さまざまなニーズに合わせて、さまざまなマシンタイプで構成されるクラスタを簡単に作成できます。

gcloud でクラスタを作成すると、kubectl の認証が自動的に設定されます。Google Cloud Platform Console でクラスタを作成した場合、gcloud container clusters get-credentials コマンドを使用して認証を設定できます。

サンプルアプリのクローンを作成する

サンプルアプリは、GitHub の GoogleCloudPlatform/getting-started-python から入手できます。

  1. リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git
    
  2. サンプル ディレクトリに移動します。

    cd getting-started-python/optional-kubernetes-engine
    

Cloud Datastore の初期化

Bookshelf アプリは Cloud Datastore を使用して書籍情報を格納します。プロジェクトの Cloud Datastore を初めて初期化する場合、次の操作を行います。

  1. GCP Console で Cloud Datastore を開きます。

    Cloud Datastore に移動

  2. データストアのリージョンを選択し、[続行] を数回クリックして [エンティティの作成] ページを表示します。このページが表示されたらウィンドウを閉じます。これで、Bookshelf アプリから Cloud Datastore にエンティティを作成する準備ができました。

Cloud Storage バケットの作成

Bookshelf アプリは Cloud Storage を使用して画像ファイルを保存します。

Cloud Storage バケットを作成する手順は次のとおりです。バケットは、Cloud Storage でデータを格納する基本的なコンテナです。

  1. ターミナル ウィンドウで次のコマンドを入力します。

    gsutil mb gs://[YOUR-BUCKET-NAME]

    [YOUR-BUCKET-NAME] は、Cloud Storage バケットの名前を表します。

  2. Bookshelf アプリでアップロードした画像を表示するには、バケットのデフォルトのアクセス制御リスト(ACL)を public-read に設定します。

    gsutil defacl set public-read gs://[YOUR-BUCKET-NAME]

アプリの構成

  1. config.py を編集用に開きます。
  2. ご使用のプロジェクト ID を [PROJECT_ID] に入力します。
  3. 前の手順で作成したバケットの名前を [CLOUD_STORAGE_BUCKET] に入力します。

残りの構成値は変更せずに、そのままにしておきます。

アプリのコンテナ化

サンプルアプリには Dockerfile が含まれています。これはアプリケーションの Docker イメージの作成に使用します。この Docker イメージによって GKE でアプリが実行されます。

# The Google App Engine python runtime is Debian Jessie with Python installed
# and various os-level packages to allow installation of popular Python
# libraries. The source is on github at:
#   https://github.com/GoogleCloudPlatform/python-docker
FROM gcr.io/google-appengine/python

# Create a virtualenv for the application dependencies.
# If you want to use Python 2, add the -p python2.7 flag.
RUN virtualenv -p python3.4 /env

# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate. This ensures the application is executed within
# the context of the virtualenv and will have access to its dependencies.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Install dependencies.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# Add application code.
ADD . /app

# Instead of using gunicorn directly, we'll use Honcho. Honcho is a python port
# of the Foreman process manager. $PROCESSES is set in the pod manifest
# to control which processes Honcho will start.
CMD honcho start -f /app/procfile $PROCESSES
サンプルアプリには、生成される Docker コンテナに含まれないファイルパスのリストが記述された .dockerignore ファイルも含まれます。通常、このファイルにはビルド アーティファクトとローカル依存関係のインストールが含まれます。

__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
*.log
.git
  • アプリの Docker イメージをビルドします。

    docker build -t gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  • イメージを Google Container Registry に push し、クラスタからイメージにアクセスできるようにします。

    gcloud docker -- push gcr.io/[YOUR_PROJECT_ID]/bookshelf
    
  • Bookshelf フロントエンドのデプロイ

    Bookshelf アプリにはウェブ リクエストを処理するフロントエンド サーバーと、書籍情報を処理して詳細情報を追加するバックエンド ワーカーがあります。

    フロントエンドを実行するために必要なクラスタ リソースは bookshelf-frontend.yaml に定義されています。これらのリソースは Kubernetes の Deployment として記述されます。Deployment を使うと、レプリカセットとそれに関連付けられたポッドを簡単に作成し、更新できます。

    # Copyright 2015 Google Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License
    
    # This file configures the bookshelf application frontend. The frontend serves
    # public web traffic.
    
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: bookshelf-frontend
      labels:
        app: bookshelf
    # The bookshelf frontend replica set ensures that at least 3
    # instances of the bookshelf app are running on the cluster.
    # For more info about Pods see:
    #   https://cloud.google.com/kubernetes-engine/docs/pods/
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: bookshelf
            tier: frontend
        spec:
          containers:
          - name: bookshelf-app
            # Replace [GCLOUD_PROJECT] with your project ID or use `make template`.
            image: gcr.io/[GCLOUD_PROJECT]/bookshelf
            # This setting makes nodes pull the docker image every time before
            # starting the pod. This is useful when debugging, but should be turned
            # off in production.
            imagePullPolicy: Always
            # The PROCESSES environment variable is used by Honcho in the
            # Dockerfile's CMD to control which processes are started. In this
            # case, only the bookshelf process is needed.
            env:
            - name: PROCESSES
              value: bookshelf
            # The bookshelf process listens on port 8080 for web traffic by default.
            ports:
            - name: http-server
              containerPort: 8080
    
    1. bookshelf-frontend.yaml で、[GCLOUD_PROJECT] を実際のプロジェクト ID に置き換えます。

    2. リソースをクラスタにデプロイします。

      kubectl create -f bookshelf-frontend.yaml
      
    3. デプロイの進捗状況を確認します。

      kubectl get deployments
      

      デプロイで必要な数のポッドが作成されると、デプロイが完了します。デプロイで問題が発生した場合は、削除してやり直すことができます。

      kubectl delete deployments bookshelf-frontend
      
    4. デプロイが完了すると、デプロイで作成されたポッドを確認できます。

      kubectl get pods
      

    Bookshelf バックエンドのデプロイ

    Bookshelf バックエンドのデプロイはフロントエンドと同じ方法で行います。

    # Copyright 2015 Google Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License
    
    # This file configures the bookshelf task worker. The worker is responsible
    # for processing book requests and updating book information.
    
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: bookshelf-worker
      labels:
        app: bookshelf
    # The bookshelf worker replica set ensures that at least 2 instances of the
    # bookshelf worker pod are running on the cluster.
    # For more info about Pods see:
    #   https://cloud.google.com/kubernetes-engine/docs/pods/
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            app: bookshelf
            tier: worker
        spec:
          containers:
          - name: bookshelf-app
            # Replace [GCLOUD_PROJECT] with your project ID or use `make template`.
            image: gcr.io/[GCLOUD_PROJECT]/bookshelf
            # This setting makes nodes pull the docker image every time before
            # starting the pod. This is useful when debugging, but should be turned
            # off in production.
            imagePullPolicy: Always
            # The PROCESSES environment variable is used by Honcho in the
            # Dockerfile's CMD to control which processes are started. In this
            # case, only the worker process is needed.
            env:
            - name: PROCESSES
              value: worker
    
    1. bookshelf-worker.yaml で、[GCLOUD_PROJECT] を実際のプロジェクト ID に置き換えます。

    2. リソースをクラスタにデプロイします。

      kubectl create -f bookshelf-worker.yaml
      
    3. ポッドが実行されていることを確認します。

      kubectl get pods
      

    Bookshelf サービスの作成

    Kubernetes サービスによって、ポッドのセットへの単一アクセス ポイントが提供されます。単一のポッドにアクセスすることも可能ですが、ポッドは存続期間が短いため、通常は単一のエンドポイントからポッドのセットにアクセスするほうが便利です。Bookshelf アプリでは、Bookshelf サービスを使用して単一の IP アドレスから複数の Bookshelf フロントエンド ポッドにアクセスできます。このサービスは bookshelf-service.yaml で定義されています。

    # Copyright 2016 Google Inc.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License
    
    # The bookshelf service provides a load-balancing proxy over the bookshelf
    # frontend pods. By specifying the type as a 'LoadBalancer', Kubernetes Engine
    # will create an external HTTP load balancer.
    # For more information about Services see:
    #   https://cloud.google.com/kubernetes-engine/docs/services/
    # For more information about external HTTP load balancing see:
    #   https://cloud.google.com/kubernetes-engine/docs/load-balancer
    apiVersion: v1
    kind: Service
    metadata:
      name: bookshelf-frontend
      labels:
        app: bookshelf
        tier: frontend
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: http-server
      selector:
        app: bookshelf
        tier: frontend
    

    ポッドとポッドを使用するサービスは別のものです。Kubernetes は、ラベルを使用してサービスのポッドを選択します。ラベルを使用すると、1 つのサービスから異なるレプリカセットのポッドにアクセスすることも、複数のサービスからある特定のポッドにアクセスすることもできます。

    1. Bookshelf サービスを作成します。

      kubectl create -f bookshelf-service.yaml
      
    2. サービスの外部 IP アドレスを取得します。

      kubectl describe service bookshelf
      

      IP アドレスの割り当てには 60 秒ほどかかることがあります。外部 IP アドレスは LoadBalancer Ingress に表示されます。

    Bookshelf アプリへのアクセス

    これで、GKE で Bookshelf アプリを実行するために必要なすべてのリソースをデプロイしました。前の手順で取得した外部 IP アドレスを使用して、ウェブブラウザにアプリを読み込み、書籍情報を作成します。ワーカーをデプロイした場合、Google Books API の情報に基づいて書籍情報が自動的に更新されます。

    クリーンアップ

    このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

    プロジェクトの削除

    課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

    プロジェクトを削除するには:

    1. GCP Console で [プロジェクト] ページに移動します。

      プロジェクト ページに移動

    2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
    3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

    クラスタの削除

    クラスタを削除すると GKE と Compute Engine のリソースはすべて削除されますが、Cloud Storage、Cloud Datastore、Cloud Pub/Sub のリソースはすべて手動で削除する必要があります。

    クラスタを削除するには、次のコマンドを使用します。[YOUR_GCP_ZONE] は、クラスタの作成時に使用したゾーンに置き換えてください。

    gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]
    

    次のステップ

    このページは役立ちましたか?評価をお願いいたします。

    フィードバックを送信...