https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ Kubernetes のリソース制限とその挙動確認 - YasuBlog
- requestsに
memory: 256MiB
を設定すると256MiB以上空きがあるNodeにスケジュールされて、256MiB以上使用する可能性がある - limitsに
memory: 4GiB
を設定すると、4GiB以上のメモリを利用しようとするとOOM KillerによりPodが落とされる - resourcesのrequestsに指定されたmemory,cpuの値を元にスケジュール先のNodeを選択する
limits
limitsの値を超えた場合の挙動について
- memoryを超えた場合: OOM KillerによりPodが強制終了
- cpuを超えた場合: 強制終了はしないがCPU速度が遅くなる
limits はNodeのallocatableなリソース量を超えて指定することができる。
オーバーコミット
オーバーコミットは、コンテナの limits の合計を Node の割当可能リソース量より大きくすること 例えばメモリ2GBのNodeには、requests 0.5GB, limits 1GB の Pod を4個起動できる。limits の合計は 4GB となりオーバーコミットの状態だが、Pod が常に最大値使うわけではない場合には許容できる。 負荷が高まって全Podがlimitsぎりぎりまでリソースを使うようになると、Nodeの割当可能リソースを超過してしまう。 こうなると、Eviction Managerによりもっともrequestsを超過してリソースを使用しているPodがEvictされる。
オーバーコミットさせるとPodの集約率は上がるがPodの稼働率は下がる可能性がある。 逆にrequestsとlimitsを近づけすぎると、Podの集約率は下がってリソース効率は悪くなるが稼働は安定する。
CPU
2 vCPUのEC2インスタンスのCPUをフルで使いたい場合は cpu: 2
と記載する。
1 vCPU分のリソースの場合は cpu: 1
または cpu: 1000m
と書く。
(1 CPU = 1000m)
メモリ
バイト単位で書く(1024000, 1Gi、256Mなど)
PrometheusでPodのCPU、メモリ使用率を確認する
kubectl topコマンドでもできるがPrometheusの場合
K8s Monitor Pod CPU and memory usage with Prometheus | by Kim Wuestkamp | ITNEXT
CPU
# container usage
rate(container_cpu_usage_seconds_total{pod=~"compute-.*", image!="", container_name!="POD"}[5m])
# container requests
avg(kube_pod_container_resource_requests_cpu_cores{pod=~"compute-.*"})
# container limits
avg(kube_pod_container_resource_limits_cpu_cores{pod=~"compute-.*"})
# throttling
rate(container_cpu_cfs_throttled_seconds_total{pod=~"compute-.*", container_name!="POD", image!=""}[5m])
Memory
# container usage
container_memory_working_set_bytes{pod_name=~"compute-.*", image!="", container_name!="POD"}
# container requests
avg(kube_pod_container_resource_requests_memory_bytes{pod=~"compute-.*"})
# container limits
avg(kube_pod_container_resource_limits_memory_bytes{pod=~"compute-.*"})
How to display Kubernetes request and limit in Grafana / Prometheus properly
sum(rate(container_cpu_usage_seconds_total{pod=~"jenkins-agent-.*", image!="", container!="POD"}[5m])) by (pod, container, namespace) / sum(kube_pod_container_resource_requests{resource="cpu", unit="core", pod=~"jenkins-agent-.*", container!="POD"}) by (pod, container, namespace)
sum(rate(container_cpu_usage_seconds_total{pod=~"jenkins-agent-.*", image!="", container!="POD"}[5m])) by (pod, container) / sum(container_spec_cpu_quota{pod=~"jenkins-agent-.*", image!="", container!="POD"}/container_spec_cpu_period{pod=~"jenkins-agent-.*", image!="", container!="POD"}) by (pod, container)