Kubernetes Engine で Node.js Bookshelf を実行する

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

目標

  • GKE クラスタを作成する。
  • Node.js アプリをコンテナ化する。
  • 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/nodejs-getting-started で入手できます。

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

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

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

    アプリの構成

    サンプル ディレクトリで、次の内容の config.json ファイルを作成します。

    {
      "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
      "CLOUD_BUCKET": "[YOUR_CLOUD_BUCKET]",
      "DATA_BACKEND": "datastore"
    }
    

    [YOUR_PROJECT_ID] は実際のプロジェクト ID に、[YOUR_CLOUD_BUCKET] は Cloud Storage バケット名に置き換えます。

    アプリのコンテナ化

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

    # Dockerfile extending the generic Node image with application files for a
    # single application.
    FROM gcr.io/google_appengine/nodejs
    
    # Check to see if the the version included in the base runtime satisfies
    # '>=8.12.0', if not then do an npm install of the latest available
    # version that satisfies it.
    RUN /usr/local/bin/install_node '>=8.12.0'
    COPY . /app/
    
    # You have to specify "--unsafe-perm" with npm install
    # when running as root.  Failing to do this can cause
    # install to appear to succeed even if a preinstall
    # script fails, and may have other adverse consequences
    # as well.
    # This command will also cat the npm-debug.log file after the
    # build, if it exists.
    RUN npm install --unsafe-perm || \
      ((if [ -f npm-debug.log ]; then \
          cat npm-debug.log; \
        fi) && false)
    CMD npm start
    
    サンプルアプリには、生成される Docker コンテナに含まれないファイルパスをリストする .dockerignore ファイルもあります。通常、このファイルでビルド アーティファクトとローカル依存関係のインストールを指定します。

    # Copyright 2018 Google Inc. All Rights Reserved.
    #
    # 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.
    
    node_modules
    .dockerignore
    Dockerfile
    npm-debug.log
    .git
    .hg
    .svn
    
  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-datastore.yaml に定義されています。これらのリソースは Kubernetes のデプロイとして記述されます。デプロイを行うと、レプリカセットとそれに関連付けられたポッドを簡単に作成し、更新できます。

# Copyright 2018 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/container-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 bookshelf process listens on port 8080 for web traffic by default.
        ports:
        - name: http-server
          containerPort: 8080
        env:
          - name: PROJECT_ID
            value: [GCLOUD_PROJECT]
  1. bookshelf-frontend-datastore.yaml で、[GCLOUD_PROJECT] をプロジェクト ID に置き換えます。

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

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

    kubectl get deployments
    

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

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

    kubectl get pods
    

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

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

# Copyright 2018 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/container-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 SCRIPT environment variable is used by `npm start` to control
        # which script is executed. This tells npm start to use `worker.js`
        # instead of the default `app.js`.
        env:
        - name: SCRIPT
          value: worker.js
        - name: PROJECT_ID
          value: [GCLOUD_PROJECT]
  1. bookshelf-worker-datastore.yaml で、[GCLOUD_PROJECT] をプロジェクト ID に置き換えます。

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

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

    kubectl get pods
    

Bookshelf サービスの作成

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

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

次のステップ

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

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