share facebook facebook facebook twitter twitter menu hatena pocket slack

2021.08.31 TUE

コンテナ化されたアプリを Google Kubernetes Engine(GKE)クラスタにデプロイする

Shimpei Chiba

WRITTEN BY Shimpei Chiba

これは何

コンテナ化されたアプリを 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

元記事はこちら

https://qiita.com/namely_/items/3930be1d00e46b69040d

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。