コンテナ イメージ内のアプリを GKE クラスタにデプロイする
このページでは、次の方法について説明します。
- Hello World アプリを作成する。
- Cloud Build を使用して、アプリをコンテナ イメージにパッケージ化する。
- Google Kubernetes Engine(GKE)でクラスタを作成する。
- コンテナ イメージをクラスタにデプロイする。
ここでは、複数の言語でサンプルを示しますが、その他の言語を使用することもできます。
このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Artifact Registry, Cloud Build, and Google Kubernetes Engine API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Artifact Registry, Cloud Build, and Google Kubernetes Engine API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
kubectl
は、GKE で使用されるクラスタ オーケストレーション システムである Kubernetes の管理に使用されます。kubectl
はgcloud
でインストールできます。gcloud components install kubectl
サンプルアプリの作成
GKE で実行される Hello World アプリの作成手順については、ご使用の言語をクリックしてください。
Go
helloworld-gke
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
example.com/helloworld
という名前の新しいモジュールを作成します。go mod init example.com/helloworld
helloworld.go
という名前で新しいファイルを作成し、次のコードを貼り付けます。このコードは、
PORT
環境変数で定義されたポートをリッスンするウェブサーバーを作成します。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
Node.js
helloworld-gke
という名前の新しいディレクトリを作成し、作成したディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
package.json
ファイルを作成し、次の内容を追加します。同じディレクトリに
index.js
ファイルを作成し、作成したファイルに次の行をコピーします。このコードは、
PORT
環境変数で定義されたポートをリッスンするウェブサーバーを作成します。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
Python
helloworld-gke
という名前の新しいディレクトリを作成し、作成したディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
app.py
という名前のファイルを作成し、作成したファイルに次のコードを貼り付けます。
Java
Spring Boot アプリを作成します。
Java SE 8 以降の JDK と cURL をインストールします。Java SE と cURL は、次のステップで新しいウェブ プロジェクトを作成する場合にのみ必要になります。Dockerfile がすべての依存関係をコンテナに読み込みます(詳細はあとで説明します)。
ターミナルで、新しい空のウェブ プロジェクトを作成します。
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d javaVersion=1.8 \ -d type=maven-project \ -d bootVersion=2.6.6 \ -d name=helloworld \ -d artifactId=helloworld \ -d baseDir=helloworld-gke \ -o helloworld-gke.zip unzip helloworld-gke.zip cd helloworld-gke
新しい Spring Boot プロジェクトが
helloworld-gke
に作成されました。src/main/java/com/example/helloworld/HelloworldApplication.java
ファイルで、/
マッピングを処理する@RestController
を追加してHelloworldApplication
クラスを更新します。このコードは、
PORT
環境変数で定義されたポートをリッスンするウェブサーバーを作成します。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
C#
.NET SDK をインストールします。.NET SDK は、次のステップで新しいウェブ プロジェクトを作成する場合にのみ必要です。
Dockerfile
がすべての依存関係をコンテナに読み込みます(詳細はあとで説明します)。ターミナルで、新しい空のウェブ プロジェクトを作成します。
dotnet new web -o helloworld-gke
helloworld-gke
ディレクトリに移動します。cd helloworld-gke
ポート
8080
をリッスンするようにProgram.cs
を更新します。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
PHP
helloworld-gke
という名前の新しいディレクトリを作成し、作成したディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
index.php
という名前のファイルを作成し、作成したファイルに次のコードを貼り付けます。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
Cloud Build によるアプリのコンテナ化
サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリに
Dockerfile
という名前の新しいファイルを作成し、次の内容をコピーします。Go
Node.js
さらに、ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Python
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Java
C#
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。PHP
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Google Cloud プロジェクト ID を取得します。
gcloud config get-value project
このクイックスタートでは、Artifact Registry にコンテナを格納し、このレジストリからクラスタにデプロイします。次のコマンドを実行して、クラスタと同じロケーションに
hello-repo
という名前のリポジトリを作成します。gcloud artifacts repositories create hello-repo \ --project=PROJECT_ID \ --repository-format=docker \ --location=us-central1 \ --description="Docker repository"
次の値を置き換えます。
PROJECT_ID
は、ユーザーの Google Cloud プロジェクト ID です。
Cloud Build を使用してコンテナ イメージをビルドします。これは、
docker build
とdocker push
を実行する場合と類似していますが、ビルドは Google Cloud で実行されます。gcloud builds submit \ --tag us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke .
イメージが Artifact Registry に保存されます。
GKE クラスタの作成
GKE クラスタは、単一の GKE クラスタとして動作する Compute Engine 仮想マシンのマネージド セットです。
クラスタを作成します。
gcloud container clusters create-auto helloworld-gke \ --location us-central1
クラスタに対するアクセス権があることを確認します。次のコマンドは、コンテナ クラスタ内の稼働中のノードを一覧表示し、クラスタにアクセスできることを示しています。
kubectl get nodes
エラーが発生した場合は、Kubernetes トラブルシューティング ガイドをご覧ください。
GKE へのデプロイ
作成した GKE クラスタにアプリをデプロイするには、2 つの Kubernetes オブジェクトが必要です。
- アプリを定義する Deployment。
- アプリへのアクセス方法を定義する Service。
アプリをデプロイする
アプリには、ウェブ リクエストを処理するフロントエンド サーバーがあります。deployment.yaml
という新しいファイルに、フロントエンドの実行に必要なクラスタ リソースを定義します。これらのリソースは Deployment として記述されます。Deployment を使用して、ReplicaSet
と関連する Pod を作成し更新します。
他のファイルと同じディレクトリに
deployment.yaml
ファイルを作成し、次の内容をコピーします。ファイル内の次の値を置き換えます。$GCLOUD_PROJECT
は、ユーザーの Google Cloud プロジェクト ID です。$LOCATION
は、us-central1
などのリポジトリのロケーションです。
リソースをクラスタにデプロイします。
kubectl apply -f deployment.yaml
Deployment のステータスを確認します。
kubectl get deployments
すべての
AVAILABLE
Deployment がREADY
の場合、デプロイが完了します。NAME READY UP-TO-DATE AVAILABLE AGE helloworld-gke 1/1 1 1 20s
Deployment に間違いがある場合は、
kubectl apply -f deployment.yaml
を再度実行し、必要な変更を行って Deployment を更新します。Deployment が完成すると、Deployment によって作成された Pod が表示されます。
kubectl get pods
Service をデプロイする
Service は、一連の Pod に単一のアクセス ポイントを提供します。それぞれの Pod には個別にアクセスできますが、Pod はエフェメラルなものであるため、確実にアクセスするには Service のアドレスを使用する必要があります。Hello World アプリでは、hello Service にロードバランサが定義されています。これにより、単一の IP アドレスから hello-app
Pod にアクセスできます。この Service は、service.yaml
ファイルに定義されています。
他のソースファイルと同じディレクトリに
service.yaml
ファイルを作成し、次の内容をコピーします。Pod は、Pod を使用する Service とは別に定義されます。Kubernetes は、ラベルを使用して Service と通信する Pod を選択します。ラベルを使用すると、1 つのサービスで異なるレプリカセットの Pod に対応することも、複数のサービスで 1 つずつの Pod に対応することもできます。
Hello World Service を作成します。
kubectl apply -f service.yaml
Service の外部 IP アドレスを探します。
kubectl get services
IP アドレスの割り振りに 60 秒ほどかかることがあります。外部 IP アドレスが、
hello
Service のEXTERNAL-IP
列に表示されます。NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello LoadBalancer 10.22.222.222 35.111.111.11 80:32341/TCP 1m kubernetes ClusterIP 10.22.222.1 <none> 443/TCP 20m
デプロイされたアプリを表示する
GKE で Hello World アプリを実行するために必要なすべてのリソースがデプロイされました。
前の手順の外部 IP アドレスを使用して、ウェブブラウザでアプリを読み込み、実行中のアプリを表示します。
http://EXTERNAL_IP
また、Service の外部 IP アドレスに対して curl
を呼び出すこともできます。
curl EXTERNAL_IP
次のような出力が表示されます。
Hello World!
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。
クラスタで実行される Compute Engine インスタンスと Artifact Registry のコンテナ イメージは課金対象です。プロジェクトを削除する
Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
クラスタとコンテナを削除する
プロジェクトを削除せず、このチュートリアルで使用したリソースのみを削除する場合は、クラスタとイメージを削除します。
Google Cloud CLI を使用してクラスタを削除するには、使用したモードに応じて次のコマンドを実行します。
gcloud container clusters delete helloworld-gke \
--location us-central1
Artifact Registry リポジトリのイメージを削除するには、次のコマンドを実行します。
gcloud artifacts docker images delete \
us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke
次のステップ
Kubernetes の詳細については、次をご覧ください。
- クラスタの作成方法について詳しく学ぶ。
- Kubernetes について理解を深める。
kubectl
リファレンス ドキュメントを読む。
GKE へのデプロイの詳細については、次をご覧ください。
- シンプルなウェブサーバー アプリケーションをパッケージ化、ホスト、デプロイする方法を学習する。
- Redis と PHP を使用して多層ウェブ アプリケーションを作成する。
- Persistent Disk と Cloud SQL を使用して GKE に WordPress をデプロイする。
- Cloud Run on GKE を設定する。
Cloud Code を使用して IDE から GKE 上でアプリケーションを作成、開発、実行する方法を学習する。以下をご覧ください。