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

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

目標

GKE でアプリケーションをパッケージ化してデプロイするには、次のことを行う必要があります。

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

始める前に

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

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

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

Google Cloud Shell を使用するには:

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

    Google Cloud Platform Console

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

    Cloud Shell セッション

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

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

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

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

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

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

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

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

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

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

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

環境変数 PROJECT_IDGoogle Cloud プロジェクト ID を設定します。この変数は、コンテナ イメージをプロジェクトの Container Registry に関連付けるために使用されます。

export PROJECT_ID=[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: コンテナ イメージをアップロードする

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

まず、Container Registry で認証を行うように Docker コマンドライン ツールを構成します(この設定は 1 回だけ行う必要があります)。

gcloud auth configure-docker

これで、Docker コマンドライン ツールでイメージを Container Registry にアップロードできます。

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(GKE を強化するオープンソースのクラスタ オーケストレーション システム)を実行している Compute Engine VM インスタンスのプールで構成されます。

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

gcloud ツールでプロジェクト IDCompute Engine ゾーンのオプションを設定します。

gcloud config set project $PROJECT_ID
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

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

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

クラスタの作成には数分かかることがあります。コマンドが完了したら、次のコマンドを実行して、クラスタの 2 つのワーカー 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

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

GKE クラスタにアプリケーションをデプロイして管理するには、Kubernetes クラスタ管理システムとの通信が必要になります。この操作は通常、kubectl コマンドライン ツールで行います。

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

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

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

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

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

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

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

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

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

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

--port フラグには、フラグはロードバランサで構成されたポート番号を指定します。--target-port フラグには、hello-app コンテナがリッスンするポート番号を指定します。

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

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

アプリケーションの Deployment リソースにさらにレプリカを追加するには、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: アプリの新しいバージョンをデプロイする

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

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

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

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

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

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

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

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

クリーンアップ

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

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

  1. Service を削除する: このステップでは、Service 用に作成された Cloud Load Balancer の割り当てを解除します。

    kubectl delete service hello-web

  2. コンテナ クラスタを削除する: コンテナ クラスタを構成するリソース(コンピューティング インスタンス、ディスク、ネットワーク リソースなど)を削除します。

    gcloud container clusters delete hello-cluster

次のステップ

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

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

Kubernetes Engine のチュートリアル