コンテナ化されたウェブ アプリケーションのデプロイ

このチュートリアルでは、ウェブ アプリケーションを Docker コンテナ イメージにパッケージ化し、そのコンテナ イメージをユーザーのニーズに合わせてスケーリング可能な負荷分散されたレプリカのセットとして、Kubernetes Engine クラスタで実行する方法を説明します。

目標

アプリケーションをパッケージ化して Kubernetes Engine にデプロイするには、次の手順を実行する必要があります。

  1. アプリを Docker イメージにパッケージ化します
  2. マシン上でコンテナをローカルに実行します(オプション)
  3. イメージをレジストリにアップロードします
  4. コンテナ クラスタを作成します
  5. アプリをクラスタにデプロイします
  6. アプリをインターネットに公開します
  7. デプロイメントをスケールアップします
  8. 新しいバージョンのアプリをデプロイします

始める前に

次の手順に従って Google Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で Kubernetes Engine ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. プロジェクトに対して課金が有効になっていることを確認します。

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

オプション A: Google Cloud Shell を使用する

Google Cloud Shell を使用してこのチュートリアルを進めることができます。Google Cloud Shell は、このチュートリアルで使用する gclouddockerkubectl の各コマンドライン ツールでプリインストールされます。Cloud Shell を使用する場合は、これらのコマンドライン ツールをワークステーションにインストールする必要はありません。

Google Cloud Shell を使用するには、次のようにします:

  1. Google Cloud Platform Console に移動します。
  2. コンソール ウィンドウの上部にある [Google Cloud Shell を有効にする] ボタンをクリックします。

    Google Cloud Platform Console 

    コンソールの一番下にある新しいフレームの中で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。

    Cloud Shell セッション

オプション B: コマンドライン ツールをローカルに使用する

ワークステーションでこのチュートリアルを実行する場合は、次のツールをインストールする必要があります。

  1. Google Cloud SDK をインストールします。この SDK に gcloud コマンドライン ツールが含まれています。
  2. gcloud コマンドライン ツールを使用して、Kubernetes コマンドライン ツールをインストールします。Kubernetes Engine クラスタのクラスタ オーケストレーション システムである Kubernetes と通信するには、kubectl を使用します。

    gcloud components install kubectl
    
  3. Docker Community Edition(CE)をワークステーションにインストールします。これを使用して、アプリケーションのコンテナ イメージを作成します。

  4. GitHub からサンプル アプリケーションを取得するために Git ソース管理ツールをインストールします。

gcloud コマンドライン ツールのデフォルトを設定する

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

ステップ 1: コンテナ イメージを作成する

Kubernetes Engine は、Docker イメージをアプリケーション デプロイメント形式として受け入れます。Docker イメージを作成するには、アプリケーションと Dockerfile が必要です。

このチュートリアルでは、hello-app という名前のサンプル ウェブ アプリケーションをデプロイします。これは Go で作成されたウェブサーバーで、すべてのリクエストに対し、「Hello, World!」というメッセージで応答します(ポート 80)。

アプリケーションは、イメージの作成方法に関する手順を含む Dockerfile を使用して、Docker イメージとしてパッケージ化されます。このファイルを使用して、以下のアプリケーションをパッケージ化します。

hello-app ソースコードをダウンロードするには、次のコマンドを実行します。

$ git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
$ cd kubernetes-engine-samples/hello-app

次のコマンドを実行して、gcloud 上の事前に設定されたプロジェクト ID を取得し、シェルの PROJECT_ID 環境変数を設定します。

export PROJECT_ID="$(gcloud config get-value project -q)"

PROJECT_ID の値は、コンテナ イメージをタグ付けしてプライベート コンテナ レジストリにプッシュするために使用されます。

このアプリケーションのコンテナ イメージを作成し、アップロード用のタグを付けるには、次のコマンドを実行します。

docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

このコマンドは Docker に対し、現在のディレクトリで Dockerfile を使用してイメージを作成し、gcr.io/my-project/hello-app:v1 などの名前を使用してタグ付けするように指示します。gcr.io 接頭辞は、イメージがホストされる Google Container Registry を意味します。このコマンドを実行してもイメージはまだアップロードされません。

docker images コマンドを実行して、ビルドが成功したことを確認できます。

$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
gcr.io/my-project/hello-app    v1                  25cfadb1bf28        10 seconds ago      54 MB

ステップ 2: コンテナ イメージをアップロードする

Kubernetes Engine でダウンロードして実行できるように、コンテナ イメージをレジストリにアップロードする必要があります。コンテナ イメージを Container Registry にアップロードするには、次のコマンドを実行します。

gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v1

ステップ 3: コンテナをローカルに実行する(オプション)

ローカル Docker エンジンを使用してコンテナ イメージをテストするには、次のコマンドを実行します。

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

Cloud Shell を使用している場合は、右上の [ウェブでプレビュー] ボタンをクリックして、ブラウザタブでアプリケーションが実行中であることを確認できます。それ以外の場合は、新しいターミナル ウィンドウ(または Cloud Shell タブ)を開いてコンテナを実行し、コンテナが動作しておりリクエストに "Hello, world!" でレスポンスすることを確認します。

curl http://localhost:8080

正常なレスポンスを確認したら、docker run コマンドを実行中のタブで Ctrl+C キーを押してコンテナをシャットダウンできます。

ステップ 4: コンテナ クラスタを作成する

コンテナ イメージがレジストリに格納されたため、コンテナ イメージを実行するコンテナ クラスタを作成する必要があります。クラスタは Kubernetes(Kubernetes Engine を強化するオープンソースのクラスタ オーケストレーション システム)を実行している Compute Engine VM インスタンスのプールで構成されます。

Kubernetes Engine クラスタを作成した後は、Kubernetes を使用してクラスタにアプリケーションをデプロイし、アプリケーションのライフサイクルを管理します。

次のコマンドを実行して、hello-cluster という名前の 3 ノードクラスタを作成します。

gcloud container clusters create hello-cluster --num-nodes=3

クラスタの作成には数分かかることがあります。コマンドが完了したら、次のコマンドを実行して、クラスタの 3 つのワーカー VM インスタンスを確認します。

$ gcloud compute instances list
NAME                                          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
gke-hello-cluster-default-pool-07a63240-822n  us-central1-b  n1-standard-1               10.128.0.7   35.192.16.148   RUNNING
gke-hello-cluster-default-pool-07a63240-kbtq  us-central1-b  n1-standard-1               10.128.0.4   35.193.136.140  RUNNING
gke-hello-cluster-default-pool-07a63240-shm4  us-central1-b  n1-standard-1               10.128.0.5   35.193.133.73   RUNNING

ステップ 5: アプリケーションをデプロイする

Kubernetes Engine クラスタにアプリケーションをデプロイして管理するには、Kubernetes クラスタ管理システムと通信する必要があります。これには通常、kubectl コマンドライン ツールを使用します。

Kubernetes では、アプリケーションはポッドとして表されます。これは、1 つのコンテナ(または密接に結合されたコンテナのグループ)を表す単位です。ポッドは、Kubernetes でデプロイ可能な最小単位です。このチュートリアルでは、各ポッドに hello-app コンテナのみが含まれています。

下記の kubectl run コマンドを実行すると、Kubernetes がクラスタに hello-web という名前の Deployment を作成します。Deployment は、レプリカと呼ばれるアプリケーションの複数のコピーを管理し、クラスタ内の個々のノード上で実行するようにスケジューリングします。今回の場合、Deployment ではアプリケーションの 1 つのポッドのみが実行されます。

次のコマンドを実行して、アプリケーションをデプロイし、ポート 8080 でリッスンします。

kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1 --port 8080

Deployment によって作成されたポッドを表示するには、次のコマンドを実行します。

$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-px7tx   1/1       Running   0          3s

ステップ 6: アプリケーションをインターネットに公開する

デフォルトで、Kubernetes Engine 上で実行するコンテナは、外部 IP アドレスを持たないため、インターネットからアクセスできません。アプリケーションをインターネットからのトラフィックに明示的に公開する必要がある場合は、次のコマンドを実行します。

kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080

上記の kubectl expose コマンドは、アプリケーションのポッドにネットワーキングと IP サポートを提供する Service リソースを作成します。Kubernetes Engine は、アプリケーションの外部 IP とロードバランサ(課金対象)を作成します。

--port フラグはロードバランサ上で設定されたポート番号を指定し、--target-port フラグは前のステップの kubectl run コマンドによって作成されたポッドによって使用されるポート番号を指定します。

アプリケーションの外部 IP アドレスを確認したら、その IP アドレスをコピーします。ブラウザにこの URL(http://203.0.113.0 など)を指定して、アプリケーションにアクセスできるかどうかをチェックします。

ステップ 7: アプリケーションをスケールアップする

アプリケーションのデプロイ リソースにレプリカを追加するには、kubectl scale コマンドを使用します。デプロイに 2 つのレプリカを追加するには(合計 3 つ)、次のコマンドを実行します。

kubectl scale deployment hello-web --replicas=3

次のコマンドを実行して、クラスタで実行されている新しいレプリカを確認できます。

$ kubectl get deployment hello-web
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-web   3         3         3            2           1m
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-web-4017757401-ntgdb   1/1       Running   0          9s
hello-web-4017757401-pc4j9   1/1       Running   0          9s
hello-web-4017757401-px7tx   1/1       Running   0          1m

これで、アプリケーションの複数のインスタンスが互いに独立して実行するようになり、kubectl scale コマンドを使用してアプリケーションの容量を調整できます。

前のステップでプロビジョニングしたロードバランサは、新しいレプリカへのトラフィックのルーティングを自動的に開始します。

ステップ 8: アプリの新しいバージョンをデプロイする

Kubernetes Engine のローリング更新メカニズムを使用すると、実行中のすべてのレプリカで古いコンテナ イメージのインスタンスを新しいコンテナ イメージのインスタンスにシステムが置き換えるときでも、アプリケーションを稼働させたまま使用できます。

同じソースコードをビルドして、v2 としてタグ付けすることで、アプリケーションの v2 バージョン用のイメージを作成できます(または、イメージを作成する前に "Hello, World!" という文字列を "Hello, Kubernetes Engine!" に変更できます)。

docker build -t gcr.io/${PROJECT_ID}/hello-app:v2 .

その後、イメージを Google Container Registry に push します。

gcloud docker -- push gcr.io/${PROJECT_ID}/hello-app:v2

次に、イメージ更新で既存のデプロイにローリング更新を適用します。

kubectl set image deployment/hello-web hello-web=gcr.io/${PROJECT_ID}/hello-app:v2

http://[EXTERNAL_IP] でアプリケーションに再度アクセスし、変更が有効になっていることを確認します。

クリーンアップ

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

このチュートリアルを完了したら、アカウントで不要な請求が発生しないように、以下の手順でリソースを削除します。

  1. サービスを削除する: サービス用に作成された Cloud Load Balancer の割り当てを解除します。

    kubectl delete service hello-web
    
  2. hello-web サービス用にプロビジョニングされたロードバランサが削除されるのを待つ: kubectl delete を実行すると、ロードバランサがバックグラウンドで非同期に削除されます。次のコマンドの出力を監視して、ロードバランサが削除されるまで待ちます。

    gcloud compute forwarding-rules list
    
  3. コンテナ クラスタを削除する: このステップでは、コンテナ クラスタを構成するリソース(Compute インスタンス、ディスク、ネットワーク リソースなど)を削除します。

    gcloud container clusters delete hello-cluster
    

次のステップ

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

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

Kubernetes Engine のドキュメント