コンテナ イメージ内のアプリを GKE クラスタにデプロイする
このページでは、次の方法について説明します。
- Hello World アプリを作成する。
- Cloud Build を使用して、アプリをコンテナ イメージにパッケージ化する。
- Google Kubernetes Engine(GKE)でクラスタを作成する。
- コンテナ イメージをクラスタにデプロイする。
ここでは、複数の言語でサンプルを示しますが、その他の言語を使用することもできます。
このタスクを Cloud Shell エディタで直接行う際の順を追ったガイダンスについては、[ガイドを表示] をクリックしてください。
以降のセクションでは、[ガイドを表示] をクリックした場合と同じ手順について説明します。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Artifact Registry, Cloud Build, and Google Kubernetes Engine API を有効にします。
- Google Cloud CLI をインストールして初期化します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Artifact Registry, Cloud Build, and Google Kubernetes Engine API を有効にします。
- Google Cloud CLI をインストールして初期化します。
-
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 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 Core SDK 2.2 をインストールします。.NET Core SDK は、次のステップで新しいウェブ プロジェクトを作成する場合にのみ必要です。
Dockerfile
がすべての依存関係をコンテナに読み込みます(詳細はあとで説明します)。ターミナルで、新しい空のウェブ プロジェクトを作成します。
dotnet new web -o helloworld-gke
helloworld-gke
ディレクトリに移動します。Program.cs
で、.UseUrls()
のポート URL を指定してサービスポートを定義し、CreateWebHostBuilder
の定義を更新します。このサンプルでは8080
を使用していますが、他のポートを使用することもできます。サーバーがリッスンするポートを指定する必要があります。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
PHP
helloworld-gke
という名前の新しいディレクトリを作成し、作成したディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
index.php
という名前のファイルを作成し、作成したファイルに次のコードを貼り付けます。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Artifact Registry にアップロードできます。
Ruby
helloworld-gke
という名前の新しいディレクトリを作成し、作成したディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
app.rb
という名前のファイルを作成し、作成したファイルに次のコードを貼り付けます。このコードは、
PORT
環境変数で定義されたポートをリッスンするウェブサーバーを作成します。Gemfile
という名前のファイルを作成し、作成したファイルに次の内容をコピーします。
Cloud Build によるアプリのコンテナ化
サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリに
Dockerfile
という名前の新しいファイルを作成し、次の内容をコピーします。Go
Node.js
さらに、ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Python
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Java
C#
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。PHP
ローカル ファイルがコンテナのビルドプロセスに影響しないように、
.dockerignore
ファイルを追加します。Ruby
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=LOCATION \ --description="Docker repository"
次の値を置き換えます。
PROJECT_ID
は、ユーザーの Google Cloud プロジェクト ID です。LOCATION
は、リポジトリのロケーションです(たとえば、us-west1
)。次のセクションでは、同じリージョンにコンテナ イメージ デプロイのクラスタを作成します。使用可能なロケーションのリストを表示するには、次のコマンドを実行します。
gcloud artifacts locations list
Cloud Build を使用してコンテナ イメージをビルドします。これは、
docker build
とdocker push
を実行する場合と類似していますが、ビルドは Google Cloud で実行されます。gcloud builds submit \ --tag LOCATION-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke .
イメージが Artifact Registry に保存されます。
GKE クラスタの作成
GKE クラスタは、単一の GKE クラスタとして動作する Compute Engine 仮想マシンのマネージド セットです。GKE で使用するオペレーション モードに応じて、クラスタを作成する際にデフォルトのゾーンまたはリージョンを指定します。Autopilot モードを使用する場合、作成されるクラスタはリージョン クラスタであるため、デフォルトのコンピューティング リージョンを設定します。Standard モードを使用する場合、作成されるクラスタはゾーンクラスタ(このクイックスタートの場合)であるため、デフォルトのコンピューティング ゾーンを設定します。
クラスタを作成します。
Autopilot
COMPUTE_REGION
は、クラスタをホストする Google Cloud リージョン(例:us-west1
)に置き換えます。Artifact Registry リポジトリと同じリージョンを選択してください。gcloud container clusters create-auto helloworld-gke \ --region COMPUTE_REGION
標準
COMPUTE_ZONE
は、クラスタをホストする Google Cloud ゾーン(例:us-west1-a
)に置き換えます。Artifact Registry リポジトリと同じリージョン内のゾーンを選択します。gcloud container clusters create helloworld-gke \ --num-nodes 1 \ --zone COMPUTE_ZONE
クラスタに対するアクセス権があることを確認します。次のコマンドは、コンテナ クラスタ内の稼働中のノードを一覧表示し、クラスタにアクセスできることを示しています。
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-west1
などのリポジトリのロケーションです。
リソースをクラスタにデプロイします。
kubectl apply -f deployment.yaml
Deployment のステータスを確認します。
kubectl get deployments
すべての
AVAILABLE
Deployment がREADY
の場合、デプロイが完了します。NAME READY UP-TO-DATE AVAILABLE AGE hello-deployment 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 つの Service が異なるレプリカセットに存在する複数の Pod と通信するように設定することも、複数の Service が単一の 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 のコンテナ イメージは課金対象です。プロジェクトの削除
Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
- Cloud Console で [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
クラスタとコンテナの削除
プロジェクトを削除せず、このチュートリアルで使用したリソースのみを削除する場合は、クラスタとイメージを削除します。
Google Cloud CLI を使用してクラスタを削除するには、使用したモードに対して次のコマンドを実行します。
標準
gcloud container clusters delete helloworld-gke \
--zone COMPUTE_ZONE
Autopilot
gcloud container clusters delete helloworld-gke \
--region COMPUTE_REGION
Artifact Registry リポジトリのイメージを削除するには、次のコマンドを実行します。
gcloud artifacts docker images delete \
LOCATION-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 上でアプリケーションを作成、開発、実行する方法を学習する。以下をご覧ください。