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

## これは何

コンテナ化されたアプリを Google Kubernetes Engine（GKE）クラスタにデプロイするということをやってみたので、メモというか、記録というかまとめです。

## はじめに

GKE はコンテナ化されたアプリケーションで動作します。これらは、Docker などを使用してプラットフォームに依存しない分離されたユーザー空間インスタンスにパッケージ化されたアプリケーションです。

## Artifact Registry API と　Google Kubernetes Engine API を有効にする

![スクリーンショット 2021-08-27 11.36.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/5b955a7f-64a0-66d6-97d6-59458c0e6e21.png)

![スクリーンショット 2021-08-27 11.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/4dbafdf2-e48b-e1f8-cfdc-d817a8a7e1df.png)

## Cloud Shell を起動する

![スクリーンショット 2021-08-27 11.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/f705e11d-787e-54c7-1edd-64883bb26632.png)

## 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.
```

![スクリーンショット 2021-08-27 12.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/2fecc4ad-0097-23b3-055d-cd56f259afd8.png)


エイリアス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 が <pending> の場合、kubectl get を再度実行します。
外部 IP アドレスと公開ポートを指定して、ウェブブラウザでアプリケーションを表示します。

```
http://EXTERNAL_IP
をブラウザで表示します。
これで、コンテナ化されたウェブ アプリケーションが GKE にデプロイされました。
```

![スクリーンショット 2021-08-27 12.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/64c4d7a7-fa01-f779-8045-ddd2bcc1bf6c.png)


**リソースの削除**

ここで使用したリソースについて、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

```