Kubernetes and Cloud Native Associate 無料問題 4 / 10 ・ 分野1: Kubernetes Fundamentals
CPU とメモリの両方に limits を設定したコンテナがある。使用量が limits に達したときの扱いとして、公式ドキュメントに合うものはどれか。
- limits は目安で、超えるとスケジューラが Pod を別のノードへ移すことがある
- CPU は超えたところで終了させられ、メモリはスロットリングで上限まで抑えられる
- CPU はスロットリングで抑えられ、メモリは OOM で終了させられることがある
- CPU もメモリも、limits に達した時点でコンテナが終了させられる
正解と解説を見る
正解: C
正解の理由
ページの「requests と limits」の節は、CPU とメモリの limits はどちらも kubelet とコンテナランタイムが適用し、最終的にはカーネルが強制すると書いたうえで、その強制のされ方が違うと説明している。CPU の limits はスロットリングで守られ、コンテナは上限を超えて CPU を使えない。メモリの limits は OOM kill で守られ、上限を超えたコンテナはカーネルに終了させられることがあるが、終了はメモリの逼迫を検知したときに起こるので、超えてもすぐには止められないことがある。
違う選択肢
「CPU もメモリも、limits に達した時点でコンテナが終了させられる」… CPU の limits はスロットリングで守られ、上限を超えて使えないよう抑えられるだけで、コンテナは終了させられない。終了(OOM kill)が起こりうるのはメモリの limits の側である。
「CPU は超えたところで終了させられ、メモリはスロットリングで上限まで抑えられる」… ページの説明は逆で、CPU はカーネルのスロットリングによるかたい上限、メモリはカーネルが OOM kill で後から対処する上限である。
「limits は目安で、超えるとスケジューラが Pod を別のノードへ移すことがある」… ページは、limits は kubelet(とコンテナランタイム)が適用し、最終的にはカーネルが強制すると書いている。スケジューラが使うのは requests で、動いている Pod を移すことはしない。
押さえどころ
CPU は圧縮できる資源(待たせれば済む)、メモリは圧縮できない資源(取り上げるには止めるしかない)と考えると、扱いの違いを覚えやすい。スケジューラがノードを選ぶときに見るのは limits ではなく requests である。