1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
--- title: Kubernetesでコンテナ単位でリソース制限してデプロイする tags: kubernetes author: yuta_vamdemic slide: false --- ## ポイント - `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 ``` |