これは何
コンテナ化されたアプリを Google Kubernetes Engine(GKE)クラスタにデプロイするということをやってみたので、メモというか、記録というかまとめです。
はじめに
GKE はコンテナ化されたアプリケーションで動作します。これらは、Docker などを使用してプラットフォームに依存しない分離されたユーザー空間インスタンスにパッケージ化されたアプリケーションです。
Artifact Registry API と Google Kubernetes Engine API を有効にする
Cloud Shell を起動する
gcloud ツールのデフォルトの設定を構成する
gcloud ツールを使用してデフォルト設定(デフォルトのプロジェクト、コンピューティング ゾーン、コンピューティング リージョン)を構成します。
Cloud Shell で次の操作を行います。
デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_ID
PROJECT_ID を実際のプロジェクト ID に置き換えます。
デフォルト ゾーンを設定します。
gcloud config set compute/zone COMPUTE_ZONE
COMPUTE_ZONE は、実際のコンピューティング ゾーン(us-west1-a など)で置き換えます。
例:gcloud config set compute/zone asia-northeast1-a
デフォルト リージョンを設定します。
gcloud config set compute/region COMPUTE_REGION
COMPUTE_REGION は、実際のコンピューティング リージョン(us-west1 など)で置き換えます。
例:gcloud config set compute/region asia-northeast1
GKE クラスタを作成する
クラスタは、少なくとも 1 つのクラスタのコントロール プレーン マシンと、ノードと呼ばれる複数のワーカーマシンで構成されます。ノードは Compute Engine 仮想マシン(VM)インスタンスであり、自身をクラスタの一部にするために必要な Kubernetes プロセスを実行します。アプリケーションをクラスタにデプロイすると、そのアプリケーションがこれらのノードで実行されます。
GKE でクラスタを作成するには、運用モード(Standard または Autopilot)を選択する必要があります。Standard モードを使用すると、クラスタはゾーンクラスタ(今回はこれ)になります。Autopilot モードを使用すると、クラスタはリージョン クラスタになります。
sample-cluster という名前の 1 ノードの Standard クラスタを作成します。
gcloud container clusters create sample-cluster --num-nodes=1
エラーが出ました。
ERROR: (gcloud.container.clusters.create) ResponseError: code=400,
message=IP aliases cannot be used with a legacy network.
エイリアスIPとりあえず回避。
--no-enable-ip-aliasをつけたら良さそう。
gcloud container clusters create sample-cluster(任意の名前) --num-nodes=1 --no-enable-ip-alias
クラスタの作成が完了したら、そのクラスタとやり取りするために必要な認証情報を取得します。
gcloud container clusters get-credentials sample-cluster
このコマンドにより、作成したクラスタを使用するように kubectl が構成されます。
アプリケーションをクラスタにデプロイする
作成したクラスタに、コンテナ化されたアプリケーションをデプロイします。ここでは、Google Cloudがサンプルとして用意してくれている hello-app というウェブ アプリケーションをデプロイします。
GKE では、クラスタ リソースの作成と管理に Kubernetes オブジェクトを使用します。Kubernetes には、ウェブサーバーのようなステートレス アプリケーションをデプロイするための Deployment オブジェクトが用意されています。インターネットからアプリケーションにアクセスする際のルールと負荷分散を定義するには、Service オブジェクトを使用します。
Deployment を作成する
クラスタで hello-app を実行するには、次のコマンドを実行してアプリケーションをデプロイする必要があります。
kubectl create deployment hello-server \
--image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
Kubernetes コマンド
kubectl create deployment
で、hello-server という名前の Deployment が作成されます。Deployment の Pod が hello-app コンテナ イメージを実行します。
コマンド
--image にはデプロイするコンテナ イメージを指定します。
上のコマンドでは、Artifact Registry リポジトリ
us-docker.pkg.dev/google-samples/containers/gke/hello-app からサンプル イメージが取得されます。
:1.0 には、pull するイメージのバージョンを指定します。バージョンを指定しない場合は、デフォルトタグ latest のイメージが使用されます。
Deployment を公開する
アプリケーションをデプロイしたら、ユーザーがアクセスできるように、そのアプリケーションをインターネットに公開する必要があります。
アプリケーションを公開するには、Service を作成します。Service は、アプリケーションと外部トラフィックに公開する Kubernetes リソースです。
アプリケーションを公開するには、次の 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
クラスタで 1 つの hello-server Pod が実行されているはずです。
hello-server Service を検査するには、kubectl get service を使用します。
kubectl get service hello-server
このコマンドの出力で、EXTERNAL-IP 列から Service の外部 IP アドレスをコピーします。
注: Service の外部 IP アドレスが取得されるまで数分かかる場合があります。アプリケーションの外部 IP が の場合、kubectl get を再度実行します。
外部 IP アドレスと公開ポートを指定して、ウェブブラウザでアプリケーションを表示します。
http://EXTERNAL_IP
をブラウザで表示します。
これで、コンテナ化されたウェブ アプリケーションが GKE にデプロイされました。
リソースの削除
ここで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
kubectl delete を実行して、アプリケーションの Service を削除します。
kubectl delete service hello-server
このコマンドにより、Deployment の公開時に作成した Compute Engine ロードバランサが削除されます。
gcloud container clusters delete を実行して、クラスタを削除します。
gcloud container clusters delete sample-cluster(任意の名前)
注: デフォルトのゾーンまたはリージョンを設定しなかった場合、
クラスタのリージョン(--region=COMPUTE_REGION)フラグまたはゾーン(--zone=COMPUTE_ZONE)フラグを gcloud ツールに渡します。
参考
https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja#standard
https://kubernetes.io/
https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview?hl=ja#workloads