Kubernetesでコンテナ単位でリソース制限してデプロイする

## ポイント
- `Request` は使用するリソースの下限を指定する
    - 空いているノードにRequestsで指定した量のリソースが足りない場合はスケジューリングされずに、`pending`となる
- `Linits`は使用するリソースの上限を指定する
    - ノードにLimitsで指定したリソースが残っていなくてもスケジューリングはされる
- Requests < Limits で指定することになる
- RequestsとLimitsの差がお起きする切る場合、いっきに負荷が上がった場合に実際のリソースが足らなくなってしまう
    - よく見かけるのはLimitsはRequestsの1.5倍〜2倍くらい

|リソース  |単位  |
|---|---|---|
|CPU  |1 = 1000m = 1vcpu  |
|メモリ  |1G = 1000M (1Gi = 1024Mi)  |


## テスト用のyamlファイル
- Resource,Limitsを各Podに指定する例

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: resource-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16
        resources:
          requests:
            memory: 1024Mi
            cpu: 500m
          limits:
            memory: 2048Mi
            cpu: 1000m

```

## Nodeのリソース状態を確認する方法
```
kubectl describe node <node名>
```

この部分をチェック

```
Non-terminated Pods:          (5 in total)
  Namespace                   Name                                       CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                       ------------  ----------  ---------------  -------------  ---
  default                     external-dns-cf685b4c7-8c75v               0 (0%)        0 (0%)      0 (0%)           0 (0%)         15d
  default                     resource-test-fc447dcc-nxfhr               0 (0%)        0 (0%)      0 (0%)           0 (0%)         10m
  kube-system                 alb-ingress-controller-7559fd56d4-lm9rc    0 (0%)        0 (0%)      0 (0%)           0 (0%)         15d
  kube-system                 aws-node-q5zgn                             10m (0%)      0 (0%)      0 (0%)           0 (0%)         15d
  kube-system                 kube-proxy-5qthx                           100m (5%)     0 (0%)      0 (0%)           0 (0%)         15d

Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                    Requests   Limits
  --------                    --------   ------
  cpu                         110m (5%)  0 (0%)
  memory                      0 (0%)     0 (0%)
  ephemeral-storage           0 (0%)     0 (0%)
  hugepages-1Gi               0 (0%)     0 (0%)
  hugepages-2Mi               0 (0%)     0 (0%)
  attachable-volumes-aws-ebs  0          0
```

## リソースが足りない状況を作り出す

- 上のyamlのreplicaを10でデプロイ

### 特定のpodが`Pending`になっている
```
yuta:~ $ kubectl get pod 
NAME                             READY   STATUS    RESTARTS   AGE
cent8                            1/1     Running   0          10d
external-dns-cf685b4c7-8c75v     1/1     Running   0          15d
nginx                            1/1     Running   0          10d
resource-test-8694845b69-2ght7   0/1     Pending   0          24s
resource-test-8694845b69-6b8vx   1/1     Running   0          24s
resource-test-8694845b69-6kvz7   1/1     Running   0          55s
resource-test-8694845b69-7mhtc   1/1     Running   0          24s
resource-test-8694845b69-fhqj5   1/1     Running   0          24s
resource-test-8694845b69-fl4dj   1/1     Running   0          56s
resource-test-8694845b69-hqd2t   1/1     Running   0          24s
resource-test-8694845b69-jzmsb   1/1     Running   0          24s
resource-test-8694845b69-rsmk4   1/1     Running   0          52s
resource-test-8694845b69-xf5h2   1/1     Running   0          24s
```

### 原因を確認

```
kubectl describe pod resource-test-8694845b69-2ght7
```

CPUのLimitを割り当てていて、これ以上のリソースを割り当てることができないためにpendingとなっている

```
Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  45s   default-scheduler  0/3 nodes are available: 3 Insufficient cpu
```

### Nodeに割り当てられた状態
- t3.large(2vcpu,8GBメモリ)でcpuで500mのRequestを受けきることができない
- limitsは合計3000mの155%で100%以上を割り当てることができている

```
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                    Requests      Limits
  --------                    --------      ------
  cpu                         1810m (93%)   3 (155%)
  memory                      3212Mi (45%)  6484Mi (90%)
  ephemeral-storage           0 (0%)        0 (0%)
  hugepages-1Gi               0 (0%)        0 (0%)
  hugepages-2Mi               0 (0%)        0 (0%)
  attachable-volumes-aws-ebs  0             0
```