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)の課金対象コンポーネントを使用します。

  • 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,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/*
    
  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 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 サービスの作成

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]

次のステップ

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