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. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  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
    
  3. アプリの Docker イメージをビルドします。

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

    gcloud docker -- push gcr.io/[YOUR_PROJECT_ID]/bookshelf
    

Bookshelf フロントエンドのデプロイ

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

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

# 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]

次のステップ

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

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