Member-only story
本番環境におけるKubernetesのリソース使用と管理(後半)
Kubernetesアプリケーションで本番運用に入る前に、K8sのリソース管理を理解する必要があります。コアとなるのは、Kubernetesのスケジューラがリソースのリクエストと制限をどのように処理するかについての記事です。長いので2回に分けて投稿します。今期は後半です。
Kubelet pod eviction based on priority
kubeletは、QoS(Quality of Service)と優先度を考慮して、リソースを解放するためにどのポッドを退避させるかを決定します。
QoSとポッドの優先度の両方を考慮する唯一のコンポーネントは、kubeletのリソース切れの立ち退きです。kubeletは、退避させるPodを、まず、starved resourceの使用量がリクエストを上回っているかどうかでランク付けし、次にPriorityでランク付けし、さらに、Podのスケジューリングリクエストに対するstarved compute resourceでランク付けします。(ソース)
Unwanted CPU throttling caused by CPU limits
これはあなたにとって最大のK8sラビットホールの一つになる可能性があるので、注意が必要です! この問題については、Githubで公開されているIssueがあります。
要するに、ポッドにCPUの制限を設けると、使用量が制限に達しなくてもスロットルされてしまう可能性があるということです。例えば、1000ミリCPUの制限で200ミリCPUを使っているポッドがあったとしても、スロットルされて遅延やパフォーマンスの問題が発生する可能性があります。
Youtubeには、ZalandoのHenning Jacobs氏による素晴らしい講演がありますので、ぜひご覧ください。
このため、CPU制限を定義しないか、 — cpu-cfs-quota=falseによってkubeletでCPU制限の実施を無効にすることをお勧めします。しかし、後者はマネージドクラウドクラスターを使用している場合、おそらく不可能です。
ポッドのCPU使用率が高くなりすぎないようにするには?
- ポッドの使用状況を監視して、使用量がリクエスト数を超えた場合にアラートを作成します。その場合、リクエスト値を上げる
- HPA/VPAによるスケーリングの実装