KubernetesとEKSの学習記録 Part 4

# 概要
仕事でKubernetes(AWSのEKS)を利用する機会が出てきたため学習します。

学習ステップとしては以下のようにしてみようと思っています。
1. Kubernetesの基本用語の理解
2. Kubernetes公式チュートリアルやってみる
3. EKSの基本用語理解
4. EKSでサービスを作ってみる

今回はステップ4 「EKSでサービスを作ってみる」

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

## 参考ページ
こちらの方の記事を参考にEKSのハンズオンやってみます。

https://qiita.com/minorun365/items/0441e4878f0984a9fc0a

作業環境はcloud shellを利用しました。

## 環境準備
kubectlとeksctlをインストールします。
コマンドは参考ページからまるまるコピってます。

必要となるkubectlとeksctlのインストールが完了したので、versionを確認します。
```bash
[cloudshell-user@ip-10-130-53-82 ~]$ kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"27+", GitVersion:"v1.27.4-eks-8ccc7ba", GitCommit:"892db4a4e439987d7addade5f9595cadfa06db2e", GitTreeState:"clean", BuildDate:"2023-08-15T16:06:56Z", GoVersion:"go1.20.6", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[cloudshell-user@ip-10-130-53-82 ~]$ eksctl version
0.165.0
[cloudshell-user@ip-10-130-53-82 ~]$ 
```

## クラスターの作成
前回もあったように以下のコマンで一括でEKS環境を作成してもらいます。
本当に便利ですね。
```
eksctl create cluster
```

cloudFormationを見ると
`eksctl-ridiculous-monster-1701655153-cluster`というスタックが作成され、その中でもりもりとAWSリソースを作成してくれています。
こちらの作成が終わると次は
`eksctl-ridiculous-monster-1701655153-nodegroup-ng-9add7518`というスタックの作成が開始されました。
名前の通りNodeGroupを作成しているようですね。

15分程で作成が完了しました。
```
2023-12-04 02:13:32 [✔]  EKS cluster "ridiculous-monster-1701655153" in "ap-northeast-1" region is ready
[cloudshell-user@ip-10-130-53-82 ~]$ 
```
EKSのコンソールを見てみるとちゃんと作成できていました。
このクラスターを利用してハンズオンを進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/2f037585-5dd0-e214-d0b2-071e7ffffb38.png)

NodeGroupとNodeも作成されていました。
Nodeのインスタンスタイプが無駄に大きいのが気になりますね……。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/8258b0e4-5adb-edb1-cd41-caef40dc1a80.png)

一旦削除して小さめにするように修正します。
```
eksctl delete cluster --name ridiculous-monster-1701655153 --wait
```
削除は10分ほどで完了。
createしたクラスター関連のリソースがまとめて削除されました。
```bash
2023-12-04 02:41:49 [✔]  all cluster resources were deleted
[cloudshell-user@ip-10-130-53-82 ~]$ 
```

せっかくなのでいろいろオプションがあるみたいなので、以下を指定して見たいと思います。
- cluster名
- instance type
またyamlにパラメーターを記載したものを利用できるようなのでそれを利用してみます。

## 作成時のパラメーターを弄ってみる
こちらの記事を参考にして作成します。
https://eksctl.io/usage/instance-selector/

できるだけinstance typeは小さく……という感じで以下のようにしました。
```yaml:instance-selector-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: TestCluster
  region: ap-northeast-1

nodeGroups:
- name: ng
  instanceSelector:
    vCPUs: 2
    memory: "2"
```

dry-runが利用できるみたいなのでまずはそれで検証します。
```bash
eksctl create cluster -f instance-selector-cluster.yaml --dry-run
```

```
[cloudshell-user@ip-10-130-53-82 ~]$ eksctl create cluster -f instance-selector-cluster.yaml --dry-run
...
nodeGroups:
- amiFamily: AmazonLinux2
  containerRuntime: containerd
  disableIMDSv1: true
  disablePodIMDS: false
  iam:
    withAddonPolicies:
      albIngress: false
      appMesh: null
      appMeshPreview: null
      autoScaler: false
      awsLoadBalancerController: false
      certManager: false
      cloudWatch: false
      ebs: false
      efs: false
      externalDNS: false
      fsx: false
      imageBuilder: false
      xRay: false
  instanceSelector:
    memory: "2"
    vCPUs: 2
  instancesDistribution:
    capacityRebalance: false
    instanceTypes:
    - t3.small
...
```
めちゃくちゃ小さいサイズのt3.smallを利用するようになっているので、大丈夫そう。
作成されたクラスターとNodeを見てみるとちゃんと小さくなってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/5b0aeebd-1891-a1b5-a7d6-701269b3f3df.png)

## ハンズオンやってみる
あとは記事に書いてあるとおりのことをマニフェストファイルを読みながら実施しました。
ハンズオンの手順とちょっと違うのはyamlファイルについてはローカルからのアップロードではなく、cloudshellのvimで直接作成したぐらいだと思います。

## 終わりに
Kubernetesの理解、Kubernetesを実際に動かす、EKSの理解、EKSを実際に動かす、という本当に触りの部分だけですが、学習することができました。
業務で利用するのはもうちょっと手が加えられているシステムですので、これをベースに更に学習していきます。