🍐

アプリをGKEクラスタにデプロイ

2022/04/03に公開

概要

Google Cloud公式のGKEクイックスタート「アプリをGKEクラスタにデプロイする」の内容の個人的な備忘録です。

https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster?hl=ja

始める前に

次の手順でKubernetes Engine APIを有効化します

  1. Google Cloudアカウントにログイン
  2. Google Cloud Consoleの「プロジェクトセレクタ」ページでGoogle Cloudプロジェクトを選択または作成します。
  3. Artifact Registry and Google Kubernetes Engine API を有効にします

Cloud Shellを起動

このチュートリアルではGoogle Cloudにホストされているリソースを管理するためのシェル環境であるCloud Shellを使用します。
https://cloud.google.com/shell/docs?hl=ja

  1. Google Cloud Consoleに移動
  2. コンソールの右上にある「Cloud Shellをアクティブにする」ボタンをクリック

    Cloud Shellアクティブボタン

実行後、コンソール下部にあるフレーム内でCloud Shellが開きます。

利用を許可


Cloud Shell

gcloud CLIのデフォルトの設定を構成

Cloud Shell上でgcloud CLIを使用してデフォルト設定(デフォルトのプロジェクト、コンピューティングゾーン、コンピューティングリージョン)を構成します

  • コンピューティングゾーンとは、クラスタとそのリソースが存在するリージョン内のロケーションです。たとえば、us-west1-a は us-west リージョン内のゾーンです。
  • コンピューティングリージョンは、クラスタとそのリソースが存在するリージョン(例: us-west)です。

これらのデフォルト設定を構成すると、gcloudコマンドの実行が簡単になります。

それでは設定していきます。Cloud Shellで次の操作を行います。

  1. デフォルトプロジェクトを設定
gcloud config set project PROJECT_ID
  1. デフォルトゾーンを設定
gcloud config set compute/zone COMPUTE_ZONE

COMPUTE_ZONEは実際のコンピューゾーンに置き換えます(ex: us-west1-a)

  1. デフォルトリージョンを設定
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 deploymenthello-serverという名前の Deploymentが作成されます。DeploymentPodhello-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 にトラフィックがルーティングされます。

アプリケーションを検査して表示

  1. 実行中の Pod を検査するには、kubectl get pods を使用します
$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
hello-server-5bd6b6875f-ftkx9   1/1     Running   0          4m28s
  1. hello-serverServiceを検査するために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
  1. 外部 IP アドレスと公開ポートを指定して、ウェブブラウザでアプリケーションを表示します。
http://EXTERNAL_IP

ブラウザでEXTERNAL_IPを指定してアクセスすると次のような表示を確認できます。


ブラウザでの表示結果

クリーンアップ

  1. 次のコマンドでアプリケーションのServiceを削除します
$ kubectl delete service hello-server
  1. 次のコマンドでクラスタを削除します
$ gcloud container clusters delete hello-cluster

クラスタの削除には数分かかります。

捕捉

hello-app は、main.goDockerfileという次の 2 つのファイルで構成されるシンプルなウェブサーバー アプリケーションです。

hello-app は、Docker コンテナ イメージとしてパッケージ化され us-docker.pkg.dev/google-samples/containers/gke/hello-appArtifact Registry リポジトリにホストされています。

https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/tree/3eaa99c9ae46af70118d1f4469444609ac4c2c78/hello-app

Discussion