Google Kubernetes Engine で Ruby Bookshelf アプリを実行する

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

目標

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

費用

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

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

このチュートリアルの終了後は、作成したリソースを削除するとそれ以降課金されることがありません。詳細については、クリーンアップをご覧ください。

始める前に

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

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

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

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

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

  4. {% dynamic if "no_credentials" in setvar.task_params %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic if not setvar.redirect_url %}{% dynamic setvar redirect_url %}https://console.cloud.google.com{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if setvar.in_henhouse_no_auth_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}NO_AUTH{% dynamic endsetvar %}{% dynamic endif %}{% dynamic elif setvar.in_henhouse_service_account_whitelist %}{% dynamic if not setvar.credential_type %}{% dynamic setvar credential_type %}SERVICE_ACCOUNT{% dynamic endsetvar %}{% dynamic endif %}{% dynamic endif %}{% dynamic if not setvar.service_account_roles and setvar.credential_type == "SERVICE_ACCOUNT" %}{% dynamic setvar service_account_roles %}{% dynamic endsetvar %}{% dynamic endif %}{% dynamic setvar console %}{% dynamic if "no_steps" not in setvar.task_params %}
  5. {% dynamic endif %}{% dynamic if setvar.api_list %}{% dynamic if setvar.in_henhouse_no_auth_whitelist or setvar.in_henhouse_service_account_whitelist %}GCP Console プロジェクトをセットアップします。

    プロジェクトをセットアップする

    クリックして、以下を行います。

    • プロジェクトを作成または選択します。
    • プロジェクトに{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。
    • {% dynamic if setvar.credential_type == 'SERVICE_ACCOUNT' %}
    • サービス アカウントを作成します。
    • JSON として秘密鍵をダウンロードします。
    • {% dynamic endif %}

    これらのリソースは、GCP Console でいつでも表示および管理できます。

    {% dynamic else %}{% dynamic if "no_text" not in setvar.task_params %}{% dynamic if setvar.api_names %}{% dynamic print setvar.api_names %}{% dynamic else %}必要な{% dynamic endif %}{% dynamic if "," in setvar.api_list %} API{% dynamic elif "API" in setvar.api_names %}{% dynamic else %} API{% dynamic endif %} を有効にします。 {% dynamic endif %}

    {% dynamic if "," in setvar.api_list %}API{% dynamic else %}API{% dynamic endif %}を有効にする

    {% dynamic endif %}{% dynamic endif %}{% dynamic if "no_steps" not in setvar.task_params %}
  6. {% dynamic endif %}{% dynamic endsetvar %}{% dynamic print setvar.console %}
  7. Cloud SDK をインストールして初期化します。
  8. Docker をインストールします。Docker は、コンテナ イメージをローカルで構築するために使用します。
  9. kubectl をインストールします。
    gcloud components install kubectl

GKE クラスタの作成

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

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

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform,userinfo-email" \
        --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-ruby からダウンロードできます。

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

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

    cd getting-started-ruby/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]

Cloud Pub/Sub トピックとサブスクリプションの作成

Bookshelf アプリは、Bookshelf に追加された書籍のデータを Google Books API から取得するためのリクエストを、Cloud Pub/Sub を使用して格納します。

  1. 次の Cloud SDK コマンドを使用して新しい Cloud Pub/Sub トピックを作成します。ここで、[YOUR_PUBSUB_TOPIC] は新しい Cloud Pub/Sub トピックの名前を表します。

    gcloud pubsub topics create [YOUR_PUBSUB_TOPIC]
    
  2. 前のステップで作成したトピックの新しい Cloud Pub/Sub サブスクリプションを作成します。ここで、[YOUR_PUBSUB_SUBSCRIPTION] は作成する Cloud Pub/Sub サブスクリプションを表します。

    gcloud pubsub subscriptions create --topic [YOUR_PUBSUB_TOPIC] [YOUR_PUBSUB_SUBSCRIPTION]
    

アプリの構成

  1. サンプルの構成ファイルをコピーしてカスタマイズします。これらのファイルは .gitignore に含まれており、バージョン コントロールに commit されることはありません。

    cp config/database.example.yml config/database.yml
    cp config/settings.example.yml config/settings.yml
    
  2. config/database.yml を編集のために開き、[YOUR_PROJECT_ID] を実際のプロジェクト ID に置き換えます。

  3. config/settings.yml を編集のために開き、次の値を置き換えます。

    • [YOUR_PROJECT_ID] には実際のプロジェクト ID を指定します。
    • [YOUR_PUBSUB_TOPIC] には実際の Cloud Pub/Sub トピック名を指定します。
    • [YOUR_PUBSUB_SUBSCRIPTION] には実際の Cloud Pub/Sub サブスクリプションを指定します。
    • [YOUR_BUCKET_NAME] には前の手順で作成したバケットの名前を指定します。
    • [YOUR_CLIENT_ID] には実際の OAuth クライアント ID を指定します。
    • [YOUR_CLIENT_SECRET] には実際の OAuth クライアント シークレットを指定します。

アプリのコンテナ化

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

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

# Install 2.4.3 if not already preinstalled by the base image
RUN cd /rbenv/plugins/ruby-build && \
    git pull && \
    rbenv install -s 2.4.3 && \
    rbenv global 2.4.3 && \
    gem install -q --no-rdoc --no-ri bundler --version 1.16.1
ENV RBENV_VERSION 2.4.3

# Copy the application files.
COPY . /app/

# Install required gems.
RUN bundle install --deployment && rbenv rehash

# Set environment variables.
ENV RACK_ENV=production \
    RAILS_ENV=production \
    RAILS_SERVE_STATIC_FILES=true

# Run asset pipeline.
RUN bundle exec rake assets:precompile

# Reset entrypoint to override base image.
ENTRYPOINT []

# Use foreman to start processes. $FORMATION will be set in the pod
# manifest. Formations are defined in Procfile.
CMD bundle exec foreman start --formation "$FORMATION"
サンプルアプリには、生成される Docker コンテナに含まれないファイルパスのリストが記述された .dockerignore ファイルも含まれます。通常、このファイルにはビルド アーティファクトとローカル依存関係のインストールが含まれます。

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

.git
log/*
tmp/*
  1. アプリの Docker イメージをビルドします。

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

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

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

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

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

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

# 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
    tier: frontend
# 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 [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        # 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 FORMATION environment variable is used by foreman in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the bookshelf process is needed.
        env:
        - name: FORMATION
          value: web=1
        # The bookshelf process listens on port 8080 for web traffic by default.
        ports:
        - name: http-server
          containerPort: 8080
  1. bookshelf-frontend.yaml で、[YOUR_PROJECT_ID] をプロジェクト ID に置き換えます。

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

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

    kubectl get deployments
    

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

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

    kubectl get pods
    

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

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

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

# This file configures the bookshelf worker. The worker processes
# jobs in the background.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bookshelf-worker
  labels:
    app: bookshelf
    tier: worker
# The bookshelf worker replica set ensures that at least 2
# instances of the bookshelf worker 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-worker
        # Replace [YOUR_PROJECT_ID] with your project ID.
        image: gcr.io/[YOUR_PROJECT_ID]/bookshelf:latest
        # 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 FORMATION environment variable is used by foreman in the
        # Dockerfile's CMD to control which processes are started. In this
        # case, only the worker process is needed.
        env:
        - name: FORMATION
          value: worker=1
  1. bookshelf-worker.yaml で、[YOUR_PROJECT_ID] をプロジェクト ID に置き換えます。

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

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

    kubectl get pods
    

Bookshelf サービスの作成

GKE サービスは、一連のポッドへの単一アクセス ポイントを提供します。単一のポッドにアクセスすることも可能ですが、ポッドは存続期間が短いため、単一のエンドポイントからポッドのセットにアクセスするほうが便利です。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 アドレスの割り当てには 1 分ほどかかることがあります。外部 IP アドレスは LoadBalancer Ingress に表示されます。

Bookshelf アプリへのアクセス

これで、Bookshelf アプリを GKE で実行するために必要なすべてのリソースのデプロイが完了しました。ウェブブラウザにアプリをロードして書籍情報を作成するには、前のステップで取得した外部 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]

次のステップ

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