このチュートリアルでは、コンテナ化したウェブ アプリケーションを Google Kubernetes Engine(GKE)クラスタにデプロイする方法について説明します。
このページは、クラウド リソースのプロビジョニングと構成、アプリとサービスのデプロイを行うオペレーターとデベロッパーを対象としています。 Google Cloudのコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
このページを読む前に、Kubernetes について理解しておいてください。
リポジトリを作成する
このチュートリアルでは、Artifact Registry にイメージを保存し、そのイメージをレジストリからデプロイします。このクイックスタートでは、hello-repo という名前のリポジトリを作成します。
- 環境変数 - PROJECT_IDを Google Cloud プロジェクト ID(- PROJECT_ID)に設定します。この環境変数は、コンテナ イメージをビルドしてリポジトリに push するときに使用します。- export PROJECT_ID=PROJECT_ID
- PROJECT_ID環境変数の値が正しいことを確認します。- echo $PROJECT_ID
- Google Cloud CLI のプロジェクト ID を設定します。 - gcloud config set project $PROJECT_ID- 出力: - Updated property [core/project].
- 次のコマンドを使用して - hello-repoリポジトリを作成します。- gcloud artifacts repositories create hello-repo \ --repository-format=docker \ --location=REGION \ --description="Docker repository"- REGIONは、リポジトリのリージョン(- us-west1など)で置き換えます。使用可能なロケーションのリストを表示するには、次のコマンドを実行します。- gcloud artifacts locations list
hello-app の Docker イメージをビルドする
このチュートリアルでは、hello-app という名前のサンプル ウェブ アプリケーションをデプロイします。このウェブ アプリケーションは Go で作成されたウェブサーバーで、ポート 8080 のすべてのリクエストに対して「Hello, World!」というメッセージを返します。
GKE は、Docker イメージをアプリケーション デプロイ形式として受け入れます。hello-app を GKE にデプロイする前に、hello-app ソースコードを Docker イメージとしてパッケージ化する必要があります。
Docker イメージを作成するには、ソースコードと Dockerfile が必要です。Dockerfile には、イメージの作成方法に関する手順が含まれています。
- 次のコマンドを実行して、 - hello-appソースコードと Dockerfile をダウンロードします。- git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app
- hello-appの Docker イメージをビルドしてタグ付けします。- docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .- このコマンドを実行すると、Docker は現在のディレクトリにある - Dockerfileを使用してイメージをビルドし、ローカル環境に保存します。また、- us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1などの名前を使用してイメージにタグを設定します。次のセクションで、このイメージを Artifact Registry に push します。- PROJECT_ID変数は、コンテナ イメージを Google Cloud プロジェクトの- hello-repoリポジトリに関連付けます。
- us-west1-docker.pkg.dev接頭辞は、リポジトリのリージョン ホストである Artifact Registry を表します。
 
- docker imagesコマンドを実行して、ビルドが成功したことを確認します。- docker images- 出力: - REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 seconds ago 54 MB
- サービス アカウントに IAM ポリシー バインディングを追加します。 - gcloud artifacts repositories add-iam-policy-binding hello-repo \ --location=REGION \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role="roles/artifactregistry.reader"- PROJECT_NUMBERは、プロジェクトのプロジェクト番号に置き換えます。
(省略可)Docker コンテナをローカルで実行する
- ローカル Docker エンジンを使用してコンテナ イメージをテストします。 - docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
- [ウェブでプレビュー] ボタン - をクリックしてから、 - 8080ポート番号を選択します。GKE により、プロキシ サービスのプレビュー用 URL が新しいブラウザ ウィンドウで開きます。
Docker イメージを Artifact Registry に push する
GKE クラスタがコンテナ イメージをダウンロードして実行できるように、コンテナ イメージをレジストリにアップロードする必要があります。このチュートリアルでは、コンテナを Artifact Registry に保存します。
- Docker コマンドライン ツールから Artifact Registry への認証を構成します。 - gcloud auth configure-docker REGION-docker.pkg.dev
- ビルドした Docker イメージをリポジトリに push します。 - docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
GKE クラスタを作成する
Docker イメージを Artifact Registry に保存したら、次に GKE クラスタを作成して hello-app を実行します。GKE クラスタは Kubernetes(GKE を強化するオープンソースのクラスタ オーケストレーション システム)を実行している Compute Engine VM インスタンスのプールで構成されます。
Cloud Shell
- Compute Engine のリージョンを設定します。 - gcloud config set compute/region REGION- Standard ゾーンクラスタの場合は、Artifact Registry リポジトリに最も近い Compute Engine ゾーンを設定します。 
- hello-clusterという名前のクラスタを作成します。- gcloud container clusters create-auto hello-cluster- GKE クラスタの作成とヘルスチェックには数分を要します。このチュートリアルを GKE Standard クラスタで実行するには、代わりに - gcloud container clusters createコマンドを使用します。
コンソール
- Google Cloud コンソールで、[Autopilot クラスタの作成] ページに移動します。 
- [名前] フィールドに、名前「 - hello-cluster」を入力します。
- [リージョン] プルダウン リストから - us-west1などの Compute Engine リージョンを選択します。
- [作成] をクリックします。 
- クラスタが作成されるまで待ちます。クラスタの準備ができると、クラスタ名の横にチェックマークが表示されます。 
hello-app を GKE にデプロイする
これで、ビルドした Docker イメージを GKE クラスタにデプロイする準備が整いました。
Kubernetes ではアプリケーションを Pod として表します。Pod とは、1 つ以上のコンテナを保有するスケーラブルなユニットのことです。Pod は、Kubernetes でデプロイ可能な最小単位です。通常は、Pod をレプリカのセットとしてデプロイし、クラスタ全体で一緒にスケーリングと分散を行えます。レプリカのセットをデプロイする 1 つの方法は、Kubernetes の Deployment を使用することです。
このセクションでは、クラスタで hello-app を実行する Kubernetes Deployment を作成します。この Deployment にはレプリカ(Pod)があります。1 つの Deployment Pod には 1 つのコンテナ(ここでは hello-app Docker イメージ)のみが含まれます。また、CPU 負荷に基づいて、Pod の数を 3 から 1~5 の数値にスケーリングする HorizontalPodAutoscaler リソースを作成します。
Cloud Shell
- GKE クラスタに接続していることを確認します。 - gcloud container clusters get-credentials hello-cluster
- hello-appDocker イメージの Kubernetes Deployment を作成します。- kubectl create deployment hello-app --image=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
- Deployment レプリカのベースライン数を 3 に設定します。 - kubectl scale deployment hello-app --replicas=3
- Deployment の - HorizontalPodAutoscalerリソースを作成します。- kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5
- 作成した Pod を表示するには、次のコマンドを実行します。 - kubectl get pods- 出力: - NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 90s hello-app-784d7569bc-jfkz5 1/1 Running 0 90s hello-app-784d7569bc-mnrrl 1/1 Running 0 95s
コンソール
- Google Cloud コンソールの [ワークロード] ページに移動します。 
- [add_box デプロイ] をクリックします。 
- [コンテナの指定] セクションで、[既存のコンテナ イメージ] を選択します。 
- [イメージパス] フィールドで [選択] をクリックします。 
- [コンテナ イメージの選択] ペインで、Artifact Registry に push した - hello-appイメージを選択して、[選択] をクリックします。
- [コンテナ] セクションで、[完了] をクリックしてから、[続行] をクリックします。 
- [構成] セクションの [ラベル] で、[キー] に - app、[値] に- hello-appを入力します。
- [構成 YAML] で、[YAML を表示] をクリックします。これにより、クラスタにデプロイしようとしている 2 つの Kubernetes API リソース(1 つの Deployment とその Deployment の 1 つの - HorizontalPodAutoscaler)を定義する YAML 構成ファイルが開きます。
- [閉じる] をクリックし、[デプロイ] をクリックします。 
- Deployment Pod の準備が整うと、[デプロイの詳細] ページが開きます。 
- [マネージド Pod] で、 - hello-appDeployment の 3 つの実行中の Pod を確認します。
アプリをインターネットに公開する
Pod には個別に割り当てられた IP アドレスがありますが、これらの IP にはクラスタ内からしかアクセスできません。また、GKE Pod はエフェメラルで、スケーリングの必要性に応じて開始または停止するように設計されています。また、エラーのために Pod がクラッシュした場合、GKE でその Pod が自動的に再デプロイされ、新しい Pod IP アドレスが割り当てられます。
つまり、どの Deployment でも、アクティブな Pod のセットに対応する IP アドレスのセットが動的になります。1)Pod を 1 つの静的ホスト名にグループ化し、2)Pod のグループをクラスタ外のインターネット上に公開する方法が必要です。
Kubernetes Service で、この両方の問題を解決します。Service により、クラスタ内の任意の Pod から到達可能な 1 つの静的 IP アドレスに Pod がグループ化されます。また、GKE はその静的 IP に DNS ホスト名を割り当てます。例: hello-app.default.svc.cluster.local。
GKE のデフォルトの Service タイプは ClusterIP で、クラスタ内からのみ到達可能な IP アドレスを取得します。クラスタ外部に Kubernetes Service を公開するには、タイプ LoadBalancer の Service を作成します。このタイプの Service では、インターネット経由で到達可能な一連の Pod の外部ロードバランサ IP が生成されます。
このセクションでは、LoadBalancer タイプの Service を使用して hello-app Deployment をインターネットに公開します。
Cloud Shell
- kubectl exposeコマンドを使用して、- hello-appデプロイ用の Kubernetes Service を生成します。- kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080- ここで、 - --portフラグはロードバランサ上で構成されたポート番号を指定し、- --target-portフラグは- hello-appコンテナがリッスンするポート番号を指定します。
- 次のコマンドを実行して、 - hello-app-serviceの Service の詳細を取得します。- kubectl get service- 出力: - NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s
- EXTERNAL_IPアドレスをクリップボードにコピーします(例:- 203.0.113.0)。
コンソール
- Google Cloud コンソールの [ワークロード] ページに移動します。 
- hello-app をクリックします。 
- [デプロイの詳細] ページで list [アクション] > [公開] の順にクリックします。 
- [公開] ダイアログで、[ターゲット ポート] を - 8080に設定します。これは、- hello-appコンテナがリッスンするポートです。
- [Service のタイプ] プルダウン リストから、[ロードバランサ] を選択します。 
- [公開] をクリックして、 - hello-appの Kubernetes Service を作成します。
- ロードバランサの準備が整うと、[サービスの詳細] ページが開きます。 
- [外部エンドポイント] フィールドまでスクロールし、IP アドレスをコピーします。 
これで hello-app Pod が Kubernetes Service を介してインターネットに公開されたので、新しいブラウザタブを開き、クリップボードにコピーした Service の IP アドレスに移動します。Hello, World! メッセージと Hostname フィールドが表示されます。Hostname は、HTTP リクエストをブラウザに提供する 3 つの hello-app Pod のいずれかに対応します。
hello-app の新しいバージョンをデプロイする
このセクションでは、新しい Docker イメージをビルドして GKE クラスタにデプロイし、hello-app を新しいバージョンにアップグレードします。
Kubernetes のローリング アップデートを使用すると、ダウンタイムなしで Deployment を更新できます。ローリング アップデート中、既存の hello-app Pod は GKE クラスタによって、新しいバージョンの Docker イメージを含む Pod に段階的に置き換えられます。このアップデート中、ロードバランサ サービスは使用可能な Pod にのみトラフィックをルーティングします。
- hello アプリのソースコードと Dockerfile のクローンを作成した Cloud Shell に戻ります。 - main.goファイルの関数- hello()を更新して、新しいバージョン- 2.0.0を報告します。
- 新しい - hello-appDocker イメージをビルドしてタグを付けます。- docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .
- イメージを Artifact Registry に push します。 - docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
これで、新しい Docker イメージを使用するように hello-app Kubernetes Deployment を更新する準備が整いました。
Cloud Shell
- kubectl set imageコマンドを使用してイメージを更新し、既存の- hello-appDeployment にローリング アップデートを適用します。- kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
- v1イメージを実行している実行中の Pod が停止し、- v2イメージを実行している新しい Pod が起動するのを確認します。- watch kubectl get pods- 出力: - NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40s
- 別のタブで、 - hello-app-service外部 IP に再度移動します。- Versionが- 2.0.0.に設定されています。
コンソール
- Google Cloud コンソールの [ワークロード] ページに移動します。 
- hello-app をクリックします。 
- [デプロイの詳細] ページで、list [アクション] > [ローリング アップデート] の順にクリックします。 
- [ローリング アップデート] ダイアログで、[Image of hello-app] フィールドを - REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2に設定します。
- [更新] をクリックします。 
- [デプロイの詳細] ページで、[アクティブなリビジョン] セクションを確認します。1 と 2 の 2 つのリビジョンが表示されます。リビジョン 1 は、以前に作成した最初の Deployment に対応します。リビジョン 2 は、開始したばかりのローリング アップデートです。 
- しばらくしてからページを更新します。[マネージド Pod] で、 - hello-appのすべてのレプリカがリビジョン 2 に対応します。
- 別のタブで、コピーした Service IP アドレスにもう一度移動します。 - Versionは- 2.0.0.になっているはずです。