GKEとはどういうものか使ってみた

GKEの使いかたがわからないので、
GKEを使ってwebアプリケーションサーバーを立ててみました！
ついでに、k8sの使い方も忘れたので復習でメモたくさん書いてます。

## 手順
1. GCPコンソールにログインをし、Kubernetes Engine APIを「有効にする」
2. CloudShellを起動する。
3. gcloudコマンドのプロジェクトを設定する
```shell
$ gcloud config set project {PROJECT ID}
```
4. clusterを作成する
```shell
$ gcloud container clusters create-auto {CLUSTER NAME} --location=us-central1
```
今回は`CLUSTER NAME`を「test-web-server」にしたので、下記のようにclusterが作成されていることを確認できました。
![スクリーンショット 2023-07-14 10.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396492/382dc2c2-cf2b-b7b9-cf46-ffdda67a1e8a.png)
5. clusterと外部からやり取りが行えるように、資格情報を取得します。
```shell
$ gcloud container clusters get-credentials {CLUSTER NAME} --location us-central1
```
上記のコマンドを打つと、デフォルトで`kubectl`コマンドのconfigに資格情報が保存されます。
下記のコマンドを打って確認することができます。
```shell
$ cat $HOME/.kube/config
apiVersion: v1
clusters: # 接続可能なクラスタの一覧
- cluster:
    certificate-authority-data: {CAデータ}
    server: {クラスタサーバーUR}
  name: {クラスタ名}
contexts: # 利用可能なcontextの一覧
- context:
    cluster: {クラスタ名}
    user: {ユーザー名}
  name: {クラスタ名}
current-context: {ファイル位置} # 接続時に利用されるcontext
kind: Config
preferences: {}
users: # クラスタに接続可能なユーザー一覧
- name: gke_test-gcp-389922_us-central1_test-web-server # ユーザー名
  user:
    exec: # 接続の際に実行するコマンドの設定。
      apiVersion: client.authentication.k8s.io/v1beta1
      command: gke-gcloud-auth-plugin
      installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
        https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke # コマンドが実行される際に表示されるメッセージ。オプション。
      provideClusterInfo: true # 大きなCAデータが含まれる可能性があるクラスター情報の場合、exec実行をKUBERENETES_EXEC_INFO環境変数の一部として設定するか否か。
```
※`kubectl`とは：k8sクラスタのAPIサーバーと通信するためのコマンドラインツール。
6. アプリをデプロイします。
Dockerのイメージ（Dockerコンテナパッケージングされたアプリケーションのイメージ）をデプロイできます。今回は、googleが提供しているサンプルアプリのイメージをデプロイしました。
```shell
$ kubectl create deployment {WORKLOAD NAME} --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
```
`WORKLOAD NAME`を「test-web-app」としたので、下記のようにコンソールで作成されたのを確認できました。
![スクリーンショット 2023-07-14 11.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396492/65cfbb99-3a99-c57f-1539-271a94255db6.png)
※K8sの`Deployment`とは...?
Deploymentを行うと、Kubernetesが指定のアプリケーションのインスタンスを作成し、更新する方法を指示できます。流れは以下の通りです。
1: ノードで実行したい、コンテナパッケージングされたアプリのイメージと、レプリカの数を指定してDeploymentを行います。
2：Deployment後、KubernetesマスターはDeploymentで指定されていたアプリケーションインスタンスを作成し、クラスタ内の個々のノードで実行するように設定します。
3：アプリケーションインスタンスが作成されると、Kuberbetes Deoloymentコントローラは、それらのインスタンスを継続的に監視します。インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラはそのインスタンスをクラスタ内の別のノード上のインスタンスと置き換えます。

※ GKEの`ワークロード`というのは？
Kubernetesシステムを使用して、Kuberbetesコントローラオブジェクト（上記のDeploymentで行われる一環のこと）を作成して、管理できます。Kubernatesではコントローラと言われている部分。

7. Serviceを作成し、アプリケーションを外部に公開する
```shell
$ kubectl expose deployment {WORKLOAD NAME} --type LoadBalancer --port 80 --target-port 8080
```
LoadBalancerのComputeEngineを立てて、インターネット公開用ポートを80に設定。アプリケーションのポート8080にルーティングするように設定してServiceを作成することで、アプリケーションを外部トラフィックへ公開できます。
下記のように、コンソールでサービス公開が設定されていることが確認できます。
![スクリーンショット 2023-07-14 11.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396492/df3c6fde-0d98-c85d-c6ad-03e2a8d63340.png)
8. 実行中のPodを検査する
```shell
$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
{POD NAME}   1/1     Running   0          60m
```
動いていることが確認できましたが、
Podとはなんでしょうか？
※Podとは...？
Podは、１つまたは複数のアプリケーションコンテナを内包するストレージ、リソース、一つのIPアドレスを共有する空間。Pod内のアプリケーション同士は「localhost」で通信ができるというのがイメージつきやすい。ストレージは共有ボリュームをPod内のコンテナ同士で共有できる。
9. 外部から動作確認を行う
Serviceのエンドポイントを叩くと、公開されていることが確認できます。
![スクリーンショット 2023-07-14 11.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396492/e99c914d-b903-8658-c7da-d63eff76601c.png)

できました。

## イメージでまとめるとこんな感じ？
![スクリーンショット 2023-07-14 15.00.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396492/a91e63b2-996e-800a-c894-58faebc84280.png)

## 次に気になること
わからないことがまだまだあるので、次は以下を調べたいと思います。
- どうやって、Pod内に複数コンテナデプロイできるか
- Node内にどうやって複数コンテナデプロイできるか
- Cluster内に複数Nodeを作成する方法。複数Nodeを作成する利点とは？

とりあえず全体像とユースケースは少し掴めてきました。