このページでは、次の方法について説明します。
- Hello World アプリを作成する。
- Cloud Build を使用して、アプリをコンテナ イメージにパッケージ化する。
- Google Kubernetes Engine(GKE)でクラスタを作成する。
- コンテナ イメージをクラスタにデプロイする。
ここでは、複数の言語でサンプルを示しますが、それ以外の言語を使用することもできます。
始める前に
-
Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。
-
Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。
- Cloud Build と Google Kubernetes Engine API を有効にします。
- Cloud SDK をインストールして初期化します。
-
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 コンテナにパッケージ化し、Container Registry にアップロードできます。
Node.js
helloworld-gke
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
package.json
ファイルを作成し、次の内容を追加します。同じディレクトリに
index.js
ファイルを作成し、次の行をコピーします。このコードは、
PORT
環境変数で定義されたポートをリッスンするウェブサーバーを作成します。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Container 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.1.3.RELEASE \ -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 コンテナにパッケージ化し、Container 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 コンテナにパッケージ化し、Container Registry にアップロードできます。
PHP
helloworld-gke
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-gke cd helloworld-gke
index.php
という名前のファイルを作成し、次のコードを貼り付けます。
これでアプリが完成しました。このアプリを Docker コンテナにパッケージ化し、Container 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
GCP プロジェクト ID を取得します。
gcloud config get-value project
Cloud Build を使用してコンテナ イメージを作成します。これは、
docker build
やdocker push
を実行する場合と似ていますが、処理は Google Cloud Platform(GCP)で実行されます。PROJECT_ID
は GCP ID で置き換えます。gcloud builds submit --tag gcr.io/PROJECT_ID/helloworld-gke .
イメージが Container Registry に保存されます。
Kubernetes Engine クラスタの作成
GKE クラスタは、単一の GKE クラスタとして動作する Compute Engine 仮想マシンのマネージド セットです。このチュートリアルでは、単一ノードを使用します。
クラスタを作成します。
YOUR_GCP_ZONE
は、クラスタをホストする GCP ゾーンで置き換えます。完全なリストについては、地域とリージョンをご覧ください。gcloud container clusters create helloworld-gke \ --num-nodes 1 \ --enable-basic-auth \ --issue-client-certificate \ --zone YOUR_GCP_ZONE
クラスタに対するアクセス権があることを確認します。次のコマンドは、コンテナ クラスタ内の稼働中のノードを一覧表示し、ユーザーにアクセス権があることを示します。
kubectl get nodes
エラーが発生した場合は、Kubernetes トラブルシューティング ガイドをご覧ください。
GKE へのデプロイ
作成した GKE クラスタにアプリをデプロイするには、2 つの Kubernetes オブジェクトが必要です。
- アプリを定義する Deployment。
- アプリへのアクセス方法を定義する Service。
アプリをデプロイする
アプリには、ウェブ リクエストを処理するフロントエンド サーバーがあります。deployment.yaml
という新しいファイルに、フロントエンドの実行に必要なクラスタ リソースを定義します。これらのリソースは Deployment として記述されます。Deployment を使用して、ReplicaSet
とそれに関連するポッドの作成と更新を行います。
他のファイルと同じディレクトリに
deployment.yaml
ファイルを作成し、次の内容をコピーします。$GCLOUD_PROJECT
は、GCP プロジェクト ID で置き換えます。リソースをクラスタにデプロイします。
kubectl apply -f deployment.yaml
Deployment のステータスを確認します。
kubectl get deployments
Deployment に、
DESIRED
ポッドと同じ数のAVAILABLE
ポッドが定義されていれば、Deployment は完成です。NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-deployment 1 1 1 1 20s
Deployment に間違いがある場合は、
kubectl apply -f deployment.yaml
を再度実行し、必要な変更を行って Deployment を更新します。Deployment が完成すると、Deployment によって作成されたポッドが表示されます。
kubectl get pods
Service をデプロイする
Serviceは、一連のポッドに単一のアクセス ポイントを提供します。それぞれのポッドには個別にアクセスできますが、ポッドは一時的なものであるため、確実にアクセスするには Service のアドレスを使う必要があります。Hello World アプリでは、hello Service にロードバランサが定義されています。これにより、単一の IP アドレスから hello-app
ポッドにアクセスできるようになります。この Service は、service.yaml
ファイルに定義されています。
他のソースファイルと同じディレクトリに
service.yaml
ファイルを作成し、次の内容をコピーします。ポッドは、ポッドを使用する Service とは別に定義されます。 Kubernetes は、ラベルを使用して Service のポッドを選択します。ラベルを使用すると、1 つの Service で異なるレプリカセットにある複数のポッドに対応することも、複数の Service で 1 つずつのポッドに対応することもできます。
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 アドレスを使用して、ウェブブラウザでアプリを読み込み、実行中のアプリを表示します。
# Example cURL call to your running appication on GKE
$ kubectl get service hello \
-o=custom-columns=NAME:.status.loadBalancer.ingress[*].ip --no-headers
35.111.111.11
$ curl 35.111.111.11
Hello World!
クリーンアップ
このチュートリアルで使用したリソースについて GCP アカウントに課金されないようにするには:
クラスタで実行される Compute Engine インスタンスと Container Registry のコンテナ イメージは課金対象です。プロジェクトの削除
GCP プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
- GCP Console で [プロジェクト] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
クラスタとコンテナの削除
プロジェクトを削除せず、このチュートリアルで使用したリソースのみを削除する場合は、クラスタとイメージを削除します。
gcloud コマンドライン ツールを使用してクラスタを削除するには、次のコマンドを実行します。
gcloud container clusters delete helloworld-gke
Container Registry リポジトリからイメージを削除するには、次のコマンドを実行します。
gcloud container images delete gcr.io/[PROJECT-ID]/helloworld-gke
次のステップ
Kubernetes の詳細については、次をご覧ください。
GKE へのデプロイの詳細については、次をご覧ください。
- シンプルなウェブサーバー アプリケーションをパッケージ化、ホスト、デプロイする方法を学ぶ。
- Redis と PHP を使用したゲストブック アプリケーションをデプロイする。
- 永続ストレージと MySQL を使用したステートフルな WordPress アプリケーションをデプロイする。
- Cloud Run on GKE を設定する。
Cloud Code を使用して IDE から直接 GKE にデプロイする方法については、次をご覧ください。