KubernetesのCPU/メモリ要求はContainerSpecのresources
で指定できます。
resourcesの指定方法により、Guaranteed
, Burstable
, BestEffort
のQoSクラスが指定されます。
リソースが逼迫してくると、BestErrort
, Burstable
, Guaranteed
の順にkillされる挙動となります。
QoSクラスはkubectl describe
コマンドでPodを確認すると表示されます。
BestEffortの指定方法
BestEffort
は、resources
を指定しない場合のQoSクラスです。
要求リソースが0になり、他のコンテナ配備に影響を与えない挙動になります。
高負荷時に停止しても問題ないコンテナを特定できていれば、BestEffort(リソース要求なし)を活用できます。
Guaranteedの指定方法
Guaranteed
は、CPUとメモリにつきresources.requests
とresources.limits
の値を一致させて指定することで設定できます。
実務的には、以下のようにresources.limits
のみ指定する方法が明確でしょう。resources.requests
を省略するとlimits
と同じ指定になります。
spec:
containers:
- name: some-container
resources:
limits:
cpu: 100m
memory: 100Mi
cpu
とmemory
は両方指定が必要で、マルチコンテナの場合には、全コンテナに指定が必要です。
当然ですがlimits.cpu
はCPU割り当て時間をハードに制限するため、小さい値をセットすると性能劣化します。
一方で大きな値を指定するとデプロイ可能な他コンテナを制約するため、使いづらい面があります。
limits.memory
についてはその全てを排他的に確保するわけではないため、安全を考慮して多少大きい値を指定することになるでしょう。
Burstableの指定方法
Burstable
クラスについては、ポイントはあまりありません。
resources
の4つの指定方法のうち、一部を指定するとBurstable
になります。
QoSの観点では、BestEffort
よりも優先的に保護する意図で何かリソース要求しておく、という使い方になるでしょう。
たとえばlimits.cpu
を指定しない場合、CPUに空きがあれば集中的に動作する挙動になります。
また、ガベージコレクタのある言語でメモリ要求が読めないコンテナもlimits.memory
を指定しづらいケースが多くあります。
Guaranteedのための要求値がうまく定まらないケースでは、BestEffort
とBurstable
の分類にとどめるのが現実的なのでしょう。
実利用しているリソースはkubectl top pod
コマンドで確認できます。ただし、ある時点の値でしかない点など注意が必要です。
Chuma Takahiro