Kubernetes Engine での Java Bookshelf の実行

このチュートリアルでは、Kubernetes Engine 上で Java Bookshelf アプリケーションを実行する方法について説明します。このチュートリアルでは、既存の Java ウェブ アプリケーションをコンテナ化し、Kubernetes Engine にデプロイします。このチュートリアルを進めるにあたり Bookshelf アプリケーションに精通している必要はありませんが、詳しく知りたい場合は App Engine フレキシブル環境のチュートリアルをご覧ください。

目標

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

料金

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

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

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

始める前に

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

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

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

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

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

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

  4. Cloud Datastore, Cloud Storage, and Cloud Pub/Sub API を有効にします。

    APIを有効にする

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

Kubernetes Engine クラスタの作成

Kubernetes Engine クラスタは、単一の Kubernetes クラスタとして動作する Compute Engine 仮想マシンのマネージド セットです。このチュートリアルでは、2 つ以上のノードから構成されるクラスタを使用します。これらのノードは、すべての Google API にアクセスする必要があります。[YOUR_GCP_ZONE] は、クラスタのホスト先として使用する Cloud Platform ゾーンに置き換えてください。

  1. クラスタを作成します。

    gcloud container clusters create bookshelf \
        --scopes "cloud-platform" \
        --num-nodes 2 \
        --zone [YOUR_GCP_ZONE]
    
  2. クラスタに対するアクセス権があることを確認します。

    kubectl get nodes
    

    このコマンドを実行すると、コンテナ クラスタにあるノードの一覧が表示されます。コンテナ クラスタが実行中で、アクセス可能かどうかを確認できます。

Kubernetes Engine クラスタにリソースを作成するには、kubectl コマンドを使用します。kubectl の詳細については、Kubernetes Engine クラスタのオペレーションをご覧ください。通常、Google Cloud プロジェクトのリソースの管理には gcloud を使用し、Kubernetes Engine クラスタ内のリソースの管理には kubectl を使用します。1 つのプロジェクトに複数のクラスタを設定できます。これにより、要件に合わせて異なるマシンタイプから構成されるクラスタを簡単に作成できます。

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

サンプル アプリケーションのクローン作成

サンプル アプリケーションは、GitHub の GoogleCloudPlatform/getting-started-java で入手できます。

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

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

    cd getting-started-java/bookshelf/optional-kubernetes-engine
    

データストアの初期化

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

  1. GCP Console でデータストアを開きます。

  2. データストアのリージョンを選択して、[続行] をクリックします。[エンティティの作成] ページが表示されたらウィンドウを閉じます。これで、Bookshelf アプリケーションでデータストアを使用できるようになります。

Cloud Storage バケットの作成

Bookshelf アプリケーションは Google Cloud Storage を使用して画像ファイルを保存します。

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

バケットにプロジェクト ID と同じ名前を付けます。

バケットを作成するには:

  1. 次のコマンドを実行します。

    gsutil mb gs://[YOUR-PROJECT-ID]

    [YOUR-PROJECT-ID] を実際のプロジェクト ID に置き換えます。

  2. バケットのデフォルト ACL を public-read に設定します。これによりユーザーは、自身がアップロードした画像を見られるようになります。

    gsutil defacl set public-read gs://[YOUR-PROJECT-ID]

    [YOUR-PROJECT-ID] を実際のプロジェクト ID に置き換えます。

アプリケーションのコンテナ化

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

# 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/jetty9

# Add application code.
ADD target/bookshelf-gke-1.0-SNAPSHOT/ /app

まず、Bookshelf アプリケーションをパッケージ化します。

mvn clean -DprojectID=<your-project-id> package

アプリケーションの 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 のデプロイとして記述されます。デプロイを行うと、レプリカセットとそれに関連付けられたポッドを簡単に作成し、更新できます。

# Copyright 2017 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.
        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
  1. bookshelf-frontend.yaml 内の [GCLOUD_PROJECT] を実際のプロジェクト ID に置き換えます。
  2. kubectl を使用してクラスタにリソースをデプロイします。

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

    kubectl get deployments
    

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

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

    kubectl get pods
    

Bookshelf サービスの作成

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

# Copyright 2017 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 つずつのポッドに対応することもできます。

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

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

    kubectl describe service bookshelf
    

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

Bookshelf アプリケーションへのアクセス

これで、Kubernetes Engine で Bookshelf アプリケーションを実行するために必要なすべてのリソースがデプロイされました。前の手順で取得した外部 IP アドレスを使用して、ウェブブラウザにアプリケーションを読み込み、書籍を作成します。

クリーンアップ

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

プロジェクトの削除

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

プロジェクトを削除する手順は次のとおりです。

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

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

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

クラスタの削除

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

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

gcloud container clusters delete bookshelf --zone [YOUR_GCP_ZONE]

次のステップ

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