【EKS】「0/1 nodes are available: 1 Too many pods.」の対処法

### 参考

EKS/eksctlについてとても参考になった動画
https://youtu.be/p6xDCz00TxU

https://vamdemicsystem.black/kubernetes/%E3%80%90kubernetes%E3%80%91eks%E3%81%A7%E3%80%8C0-2-nodes-are-available-2-too-many-pods-%E3%80%8D%E3%81%A8%E5%87%BA%E3%81%A6%E3%80%81pod%E3%81%8Cpending%E3%81%AE%E3%81%BE%E3%81%BE

https://dev.classmethod.jp/articles/vpc-ec2-multi-eip/#toc-4

---
### エラーが発生した状況

・EKSクラスタをeksctlで構築

```
eksctl create cluster
 --name test-cluster
 --region ap-northeast-1
 --nodegroup-name linux-nodes
 --node-type t2.micro
 --nodes 1
```

・NginxのPodを構築したところ、表題のエラーログが表示される。

```
hoge@nogenoMacBook-Air k8s practice % kubectl get pod                                       
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-xc9dm   0/1     Pending   0          2m35s

hoge@nogenoMacBook-Air k8s practice % kubectl describe pod nginx-deployment-66b6c48dd5-xc9dm
Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  3s (x4 over 2m30s)  default-scheduler  0/1 nodes are available: 1 Too many pods.
```

---
### 原因「Podに割り当てるIPアドレスが枯渇している」

・EKSクラスタ内におけるNodeの正体は「EC2インスタンス」である。
・EC2インスタンス(Node)内に構築される各PodにIPアドレスが割り当てられる。
・**Podに割り当てられるIPアドレス＝EC2のセカンダリIP** である。
・EC2に設定できるセカンダリIPの数には上限があり、インスタンスタイプがしょぼいほど数は小さい。

*イメージ
![スクリーンショット 2021-12-20 1.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/60045ec2-ab0b-52d0-0c7e-b8199cb83e7b.png)

---
### 対処方法

・Node(EC2)の数を増やしてやればいい ＝ 新規追加したEC2のセカンダリIPを利用できる

・Nodeの数/最小数/最大数は**NodeGroup**で設定されている

*コンソール画面からNodeGroupの設定変更
![スクリーンショット 2021-12-20 2.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/98949cde-9b9c-685e-9a3e-b3ae7b09a1a7.png)
![スクリーンショット 2021-12-20 2.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/88e88b51-9a2f-9804-f662-8285c44e91ac.png)

・NodeGroupの変更適用後、PodにIPアドレスが割り振られ正常起動したことを確認。

```
hoge@nogenoMacBook-Air k8s practice % kubectl get pod                                       
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-xc9dm   1/1     Running   0          13m

hoge@nogenoMacBook-Air k8s practice % kubectl describe pod nginx-deployment-66b6c48dd5-xc9dm

Events:
  Type     Reason            Age                   From               Message
  ----     ------            ----                  ----               -------
  Warning  FailedScheduling  2m15s (x13 over 13m)  default-scheduler  0/1 nodes are available: 1 Too many pods.
  Warning  FailedScheduling  78s (x3 over 118s)    default-scheduler  0/2 nodes are available: 1 Too many pods, 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Normal   Scheduled         67s                   default-scheduler  Successfully assigned default/nginx-deployment-66b6c48dd5-xc9dm to ip-192-168-85-58.ap-northeast-1.compute.internal
  Normal   Pulling           66s                   kubelet            Pulling image "nginx:1.14.2"
  Normal   Pulled            58s                   kubelet            Successfully pulled image "nginx:1.14.2" in 7.467240714s
  Normal   Created           58s                   kubelet            Created container nginx
  Normal   Started           58s                   kubelet            Started container nginx
```

---
### *セカンダリIPとは？

・EC2(ENI)に設定できるIPアドレスは「プライマリIP」と「セカンダリIP」が存在する。

※下記画像の通り、EC2インスタンス作成時にネットワークインタフェース(ENI)を選択できる。
　このENIに割り当てる「プライマリIP」と「セカンダリIP」を設定できる。
　　×　IPアドレスはEC2で設定されている
　　○　IPアドレスは**EC2にアタッチされているENI**で設定されている
![スクリーンショット 2021-12-20 1.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/e8e1cff3-e593-ad7b-341c-12793c79700f.png)