アプリをGKEクラスタにデプロイ
概要
Google Cloud公式のGKEクイックスタート「アプリをGKEクラスタにデプロイする」の内容の個人的な備忘録です。
始める前に
次の手順でKubernetes Engine APIを有効化します
- Google Cloudアカウントにログイン
- Google Cloud Consoleの「プロジェクトセレクタ」ページでGoogle Cloudプロジェクトを選択または作成します。
- Artifact Registry and Google Kubernetes Engine API を有効にします
Cloud Shellを起動
このチュートリアルではGoogle Cloudにホストされているリソースを管理するためのシェル環境であるCloud Shellを使用します。
- Google Cloud Consoleに移動
- コンソールの右上にある「Cloud Shellをアクティブにする」ボタンをクリック
Cloud Shellアクティブボタン
実行後、コンソール下部にあるフレーム内でCloud Shellが開きます。
利用を許可
Cloud Shell
gcloud CLIのデフォルトの設定を構成
Cloud Shell上でgcloud CLIを使用してデフォルト設定(デフォルトのプロジェクト、コンピューティングゾーン、コンピューティングリージョン)を構成します
- コンピューティングゾーンとは、クラスタとそのリソースが存在するリージョン内のロケーションです。たとえば、us-west1-a は us-west リージョン内のゾーンです。
- コンピューティングリージョンは、クラスタとそのリソースが存在するリージョン(例: us-west)です。
これらのデフォルト設定を構成すると、gcloudコマンドの実行が簡単になります。
それでは設定していきます。Cloud Shellで次の操作を行います。
- デフォルトプロジェクトを設定
gcloud config set project PROJECT_ID
- デフォルトゾーンを設定
gcloud config set compute/zone COMPUTE_ZONE
COMPUTE_ZONE
は実際のコンピューゾーンに置き換えます(ex: us-west1-a
)
- デフォルトリージョンを設定
gcloud config set compute/region COMPUTE_REGION
COMPUTE_REGION
は実際のコンピューティングリージョンに置き換えます(ex: us-west1
)
設定後、 gcloud config list
で内容を確認できます
$ gcloud config list
...
[compute]
gce_metadata_read_timeout_sec = 30
region = us-west1
zone = us-west1-a
...
GKEクラスタを作成
クラスタは少なくとも一つのコントロールプレーンマシンとノードと呼ばれる複数のワーカーマシンで構成されます。ノードはCompue Engine仮想マシン(VM)インスタンスであり、自身をクラスタの一部にするために必要なKubernetesプロセスを実行します。アプリケーションをクラスタにデプロイすると、そのアプリケーションがこれらのノードで実行されます。
GKEでクラスタを作成するには運用モード(StandardまたはAutopilot)を指定する必要があります。Standardモードを使用するとクラスタはゾーンクラスタに(今回)、Autopilotモードを使用するとクラスタはリージョンクラスタになります。
$ gcloud container clusters create hello-cluster --num-nodes=1
Default change: VPC-native is the default mode during cluster creation for versions greater than 1.21.0-gke.1500. To create advanced routes based clusters, please pass the `--no-enable-ip-alias` flag
Note: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
Creating cluster hello-cluster in us-west1-a... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-west1-a/clusters/hello-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-west1-a/hello-cluster?project=PROJECT_ID
kubeconfig entry generated for hello-cluster.
NAME: hello-cluster
LOCATION: us-west1-a
MASTER_VERSION: 1.21.9-gke.1002
MASTER_IP: 35.197.33.186
MACHINE_TYPE: e2-medium
NODE_VERSION: 1.21.9-gke.1002
NUM_NODES: 1
STATUS: RUNNING
Google Cloud Consoleでの表示
クラスタの認証情報を取得
クラスタの作成完了後、そのクラスタとやりとりするために必要な認証情報を取得します
$ gcloud container clusters get-credentials hello-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for hello-cluster.
このコマンドにより、作成したクラスタを使用するようにkubectl
が構成されます。
アプリケーションをクラスタにデプロイ
作成したクラスタにコンテナ化されたアプリケーションをデプロイします。今回はサンプル用に用意されたhello-app
というウェブアプリケーションをデプロイします。
Deploymentを作成
クラスタでhello-app
を実行するために次のコマンドを実行してアプリケーションをデプロイします
$ kubectl create deployment hello-server \
--image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
deployment.apps/hello-server created
Kubernetes コマンド kubectl create deployment
でhello-server
という名前の Deployment
が作成されます。Deployment
のPod
がhello-app
コンテナ イメージを実行します。
Deploymentを公開
アプリケーションのデプロイ後、ユーザーがアクセスできるようにアプリケーションをインターネットに公開する必要があります。アプリケーションを外部に公開するにはService
を作成します。
アプリケーションを公開するにはkubectl exposeコマンドを実行します。
$ kubectl expose deployment hello-server --type LoadBalancer --port 80 --target-port 8080
-
--type LoadBalancer
フラグを渡すことで、コンテナにCompute Engine
ロードバランサが作成されます。 -
--port
フラグを指定すると、インターネット用に公開ポート 80 が初期化されます。 -
--target-port
フラグを使用すると、アプリケーションのポート 8080 にトラフィックがルーティングされます。
アプリケーションを検査して表示
- 実行中の Pod を検査するには、kubectl get pods を使用します
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-server-5bd6b6875f-ftkx9 1/1 Running 0 4m28s
-
hello-server
Serviceを検査するためにkubectl get serviceを利用します
$ kubectl get service hello-server
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-server LoadBalancer 10.116.7.93 34.127.70.38 80:31634/TCP 3m27s
- 外部 IP アドレスと公開ポートを指定して、ウェブブラウザでアプリケーションを表示します。
http://EXTERNAL_IP
ブラウザでEXTERNAL_IP
を指定してアクセスすると次のような表示を確認できます。
ブラウザでの表示結果
クリーンアップ
- 次のコマンドでアプリケーションのServiceを削除します
$ kubectl delete service hello-server
- 次のコマンドでクラスタを削除します
$ gcloud container clusters delete hello-cluster
クラスタの削除には数分かかります。
捕捉
hello-app
は、main.go
と Dockerfile
という次の 2 つのファイルで構成されるシンプルなウェブサーバー アプリケーションです。
hello-app
は、Docker コンテナ イメージとしてパッケージ化され us-docker.pkg.dev/google-samples/containers/gke/hello-app
のArtifact Registry
リポジトリにホストされています。
Discussion