Kubernetes CPU requests and limits, explained through cgroups
This article explains how Kubernetes CPU requests and limits actually work at the Linux kernel level using cgroups. It covers the difference between CPU throttling and scheduling, how the Completely Fair Scheduler (CFS) handles CPU quotas, and why setting CPU limits too low can lead to unexpected performance degradation due to throttling.
背景メモ
- Kubernetes(k8s)でコンテナに設定するCPU requests(保証リソース)とlimits(上限)の仕組みを、Linuxカーネルのリソース隔離機能であるcgroupsのレベルから解説した記事。<br>- 「requests」はスケジューリング時にノードの空き容量を判断するための値で、実際の制限は「limits」のみがcgroupのCFS(Completely Fair Scheduler)設定を通じて適用される、というのが実装上重要なポイント。<br>- requests ≦ limitsの場合、コンテナはlimitsまでCPUを使えるが、ノードに空きがあってもそれ以上は使えない。requestsだけ設定してlimitsを未設定にすると、ノードの余剰CPUをすべて使えるが、スケジューリング時にはrequests分が予約済みとみなされるため、リソースの無駄が生じる可能性がある。<br>- CPUとメモリでは挙動が大きく異なる。メモリはlimits超過でOOM Kill(強制終了)されるが、CPUはスロットリング(抑制)されるだけ。この違いを正しく理解していないと、パフォーマンス問題の原因特定が難しくなる。<br>- k8sのリソース管理を本番運用する上で、cgroupsの仕組みまで踏まえた知識がなぜ必要なのかを丁寧に説明しており、初学者〜中級者のDevOps/SREエンジニア向けの内容。