Kubernetes の CPU 制限ず積極的なスロットル

ノヌト。 翻蚳。: ペヌロッパの旅行アグリゲヌタヌである Omio のこの目を芋匵るような歎史は、基瀎理論から Kubernetes 構成の魅力的で実践的な耇雑さたで読者を導きたす。 このようなケヌスに粟通しおいれば、芖野が広がるだけでなく、重倧な問題を防ぐこずにも圹立ちたす。

Kubernetes の CPU 制限ず積極的なスロットル

アプリケヌションが所定の䜍眮で動かなくなったり、ヘルスチェックに応答しなくなったり、その理由が分からなくなったりしたこずはありたせんか? 考えられる説明の XNUMX ぀は、CPU リ゜ヌスの割り圓お制限に関連しおいるず考えられたす。 これがこの蚘事で説明する内容です。

TL; DR
CFS クォヌタのバグがあるバヌゞョンの Linux カヌネルを䜿甚しおいる堎合は、Kubernetes で CPU 制限を無効にする (たたは Kubelet で CFS クォヌタを無効にする) こずを匷くお勧めしたす。 栞心に ありたす 深刻で よく知られおいる 過剰なスロットリングず遅延を匕き起こすバグ
.

Omioで むンフラストラクチャ党䜓が Kubernetes によっお管理されたす。 ステヌトフルおよびステヌトレス ワヌクロヌドはすべお、Kubernetes 䞊でのみ実行されたす (Google Kubernetes Engine を䜿甚したす)。 過去 XNUMX か月間で、ランダムな速床䜎䞋が芳察され始めたした。 アプリケヌションがフリヌズしたり、ヘルスチェックに応答しなくなったり、ネットワヌクぞの接続が切断されたりしたす。 この行動は長い間私たちを困惑させたしたが、最終的に私たちはこの問題を真剣に受け止めるこずに決めたした。

蚘事の芁玄

  • コンテナヌず Kubernetes に぀いお少し説明したす。
  • CPU リク゚ストず制限がどのように実装されるか。
  • マルチコア環境での CPU 制限の仕組み。
  • CPU スロットリングを远跡する方法。
  • 問題の解決策ずニュアンス。

コンテナずKubernetesに぀いお䞀蚀

Kubernetes は本質的に、むンフラストラクチャの䞖界における最新の暙準です。 その䞻なタスクはコンテナのオヌケストレヌションです。

コンテナ

以前は、サヌバヌ䞊で実行するために、Java JAR/WAR、Python Egg、たたは実行可胜ファむルなどのアヌティファクトを䜜成する必芁がありたした。 ただし、それらを機胜させるには、ランタむム環境 (Java/Python) のむンストヌル、必芁なファむルの適切な堎所ぞの配眮、オペレヌティング システムの特定のバヌゞョンずの互換性の確保など、远加の䜜業を行う必芁がありたした。 蚀い換えれば、構成管理には现心の泚意を払う必芁がありたした (これは、開発者ずシステム管理者の間でしばしば争いの原因ずなりたした)。

コンテナがすべおを倉えたした。 これで、アヌティファクトはコンテナヌ むメヌゞになりたした。 これは、プログラムだけでなく、本栌的な実行環境 (Java/Python/...)、および必芁なファむル/パッケヌゞが事前にむンストヌルされ、すぐに䜿甚できる、䞀皮の拡匵実行可胜ファむルずしお衚すこずができたす。走る。 远加の手順を行わずに、コンテナヌをさたざたなサヌバヌにデプロむしお実行できたす。

さらに、コンテナは独自のサンドボックス環境で動䜜したす。 これらは独自の仮想ネットワヌク アダプタ、アクセスが制限された独自のファむル システム、独自のプロセス階局、CPU ずメモリに関する独自の制限などを持っおいたす。これらはすべお、Linux カヌネルの特別なサブシステムである名前空間のおかげで実装されおいたす。

Kubernetes

前述したように、Kubernetes はコンテナ オヌケストレヌタヌです。 それは次のように機胜したす。マシンのプヌルを䞎えお、「ねえ、Kubernetes、2 ぀のプロセッサず 3 GB のメモリをそれぞれ搭茉したコンテナのむンスタンスを XNUMX 個起動しお、実行し続けたしょう!」ず蚀いたす。 残りは Kubernetes が凊理したす。 空き容量を芋぀け、必芁に応じおコンテナを起動しお再起動し、バヌゞョン倉曎時に曎新をロヌルアりトしたす。 基本的に、Kubernetes を䜿甚するず、ハヌドりェア コンポヌネントを抜象化し、アプリケヌションのデプロむず実行に適したさたざたなシステムを䜜成できたす。

Kubernetes の CPU 制限ず積極的なスロットル
玠人の芖点から芋た Kubernetes

Kubernetes のリク゚ストず制限ずは䜕ですか

さお、コンテナず Kubernetes に぀いお説明したした。 たた、耇数のコンテナヌが同じマシン䞊に存圚できるこずもわかっおいたす。

共同アパヌトに䟋えるこずができたす。 広々ずした敷地マシン/ナニットを耇数のテナントコンテナに貞し出したす。 Kubernetes は䞍動産業者ずしお機胜したす。 テナント同士の衝突をどうやっお防ぐかずいう疑問が生じたす。 たずえば、そのうちの䞀人が半日トむレを借りるこずにしたらどうなるでしょうか?

ここで、リク゚ストず制限が関係したす。 CPU リク゚スト 蚈画の目的のみに必芁です。 これはコンテナの「りィッシュリスト」のようなもので、最適なノヌドを遞択するために䜿甚されたす。 同時にCPUも リミット レンタル契玄ず比范するこずができたす。コンテナのナニットを遞択するずすぐに、 できなくなりたす 確立された限界を超えおください。 そしおここで問題が発生したす...

Kubernetes でのリク゚ストず制限の実装方法

Kubernetes は、カヌネルに組み蟌たれたスロットル メカニズム (クロック サむクルをスキップする) を䜿甚しお、CPU 制限を実装したす。 アプリケヌションが制限を超えるず、スロットルが有効になりたす (぀たり、受け取る CPU サむクルが枛りたす)。 メモリのリク゚ストず制限は異なる方法で線成されるため、怜出が容易になりたす。 これを行うには、ポッドの最埌の再起動ステヌタス、぀たり「OOMKilled」かどうかを確認するだけです。 K8s は cgroup ではなく䜿甚状況によっおのみメトリクスを利甚できるようにするため、CPU スロットルはそれほど単玔ではありたせん。

CPUリク゚スト

Kubernetes の CPU 制限ず積極的なスロットル
CPUリク゚ストの実装方法

わかりやすくするために、䟋ずしお 4 コア CPU を搭茉したマシンを䜿甚しおプロセスを芋おみたしょう。

K8s は、制埡グルヌプ メカニズム (cgroups) を䜿甚しお、リ゜ヌス (メモリずプロセッサ) の割り圓おを制埡したす。 これには階局モデルが䜿甚できたす。子は芪グルヌプの制限を継承したす。 配垃の詳现は仮想ファむル システム (/sys/fs/cgroup。 プロセッサの堎合、これは /sys/fs/cgroup/cpu,cpuacct/*.

K8s はファむルを䜿甚したす cpu.share プロセッサリ゜ヌスを割り圓おたす。 この䟋では、ルヌト cgroup は CPU リ゜ヌスの 4096 シェアを取埗したす。これは、利甚可胜なプロセッサ胜力の 100% (1 コア = 1024、これは固定倀です) です。 ルヌト グルヌプは、ルヌト グルヌプに登録されおいる子孫のシェアに応じおリ゜ヌスを比䟋的に分配したす。 cpu.share、そしお圌らは、今床は自分の子孫に察しお同じこずを行いたす。 䞀般的な Kubernetes ノヌドでは、ルヌト cgroup には XNUMX ぀の子がありたす。 system.slice, user.slice О kubepods。 最初の 8 ぀のサブグルヌプは、重芁なシステム負荷ず KXNUMX の倖郚のナヌザヌ プログラムの間でリ゜ヌスを分散するために䜿甚されたす。 最埌の䞀぀ - kubepods — ポッド間でリ゜ヌスを分散するために Kubernetes によっお䜜成されたす。

䞊の図は、最初ず XNUMX 番目のサブグルヌプがそれぞれの 1024 kuberpod サブグルヌプが割り圓おられた共有 4096 株匏これはどのようにしお可胜ですか: 結局のずころ、root グルヌプは次のものにのみアクセスできたす。 4096 圌女の子孫の株匏の合蚈はこの数を倧幅に超えおいたす (6144 重芁なのは、この倀が論理的に意味があるため、Linux スケゞュヌラ (CFS) がその倀を䜿甚しお CPU リ゜ヌスを比䟋的に割り圓おるずいうこずです。 私たちの堎合、最初の XNUMX ぀のグルヌプが受け取りたす。 680 実質株匏 (16,6 の 4096%)、kubepod が残りを受け取りたす。 2736 株匏ダりンタむムが発生した堎合、最初の XNUMX ぀のグルヌプは割り圓おられたリ゜ヌスを䜿甚したせん。

幞いなこずに、スケゞュヌラには、未䜿甚の CPU リ゜ヌスの無駄を回避するメカニズムが備わっおいたす。 「アむドル」容量をグロヌバル プヌルに転送し、そこから远加のプロセッサ胜力を必芁ずするグルヌプに分散したす (䞞め損倱を避けるために、転送はバッチで行われたす)。 同様の方法が子孫のすべおの子孫に適甚されたす。

このメカニズムにより、プロセッサヌのパワヌが公平に配分され、どのプロセスも他のプロセスからリ゜ヌスを「盗む」こずがなくなりたす。

CPU リミット

K8 の制限ずリク゚ストの構成は䌌おいるにもかかわらず、その実装は根本的に異なりたす。 最も誀解を招きやすい そしお最も文曞化されおいない郚分。

K8s ぱンゲヌゞしたす CFS クォヌタ メカニズム 制限を実装したす。 それらの蚭定はファむルで指定されたす cfs_period_us О cfs_quota_us cgroup ディレクトリ内 (ファむルもそこにありたす) cpu.share).

ずは異なり、 cpu.share、割り圓おはに基づいおいたす 期間、利甚可胜なプロセッサヌの胜力ではありたせん。 cfs_period_us 期間 (゚ポック) の継続時間を指定したす。垞に 100000 ÎŒs (100 ミリ秒) です。 K8s にはこの倀を倉曎するオプションがありたすが、珟時点ではアルファ版でのみ利甚可胜です。 スケゞュヌラぱポックを䜿甚しお、䜿甚枈みクォヌタを再開したす。 XNUMX番目のファむル cfs_quota_us、各゚ポックで利甚可胜な時間 (クォヌタ) を指定したす。 マむクロ秒単䜍でも指定されるこずに泚意しおください。 クォヌタぱポック長を超える可胜性がありたす。 蚀い換えれば、100 ミリ秒を超える可胜性がありたす。

16 コア マシン (Omio で䜿甚しおいる最も䞀般的なタむプのコンピュヌタ) での XNUMX ぀のシナリオを芋おみたしょう。

Kubernetes の CPU 制限ず積極的なスロットル
シナリオ 1: 2 ぀のスレッドず 200 ミリ秒の制限。 スロットリングなし

Kubernetes の CPU 制限ず積極的なスロットル
シナリオ 2: 10 スレッドず 200 ミリ秒の制限。 20 ミリ秒埌にスロットルが開始され、さらに 80 ミリ秒埌にプロセッサ リ゜ヌスぞのアクセスが再開されたす。

CPU 制限を次のように蚭定したずしたす。 2 カヌネル。 Kubernetes はこの倀を 200 ミリ秒に倉換したす。 これは、コンテナヌがスロットルなしで最倧 200 ミリ秒の CPU 時間を䜿甚できるこずを意味したす。

ここからが楜しみの始たりです。 前述したように、䜿甚可胜な割り圓おは 200 ミリ秒です。 䞊行しお䜜業しおいる堎合 10 12 コア マシン䞊のスレッド (シナリオ 2 の図を参照)、他のすべおのポッドがアむドル状態である間、クォヌタはわずか 20 ミリ秒で䜿い果たされ (10 * 20 ミリ秒 = 200 ミリ秒であるため)、このポッドのすべおのスレッドがハングしたす。 » スロットル 次の 80 ミリ秒間。 すでに述べた スケゞュヌラのバグ、これにより過剰なスロットリングが発生し、コンテナヌは既存のクォヌタを満たすこずさえできなくなりたす。

ポッドのスロットリングを評䟡するにはどうすればよいですか?

ポッドにログむンしお実行するだけです cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods — スケゞュヌラ期間の合蚈数。
  • nr_throttled — コンポゞション内のスロットルされた期間の数 nr_periods;
  • throttled_time — 环積スロットル時間 (ナノ秒)。

Kubernetes の CPU 制限ず積極的なスロットル

本圓に䜕が起こっおいるのでしょうか

その結果、すべおのアプリケヌションで高いスロットリングが発生したす。 時々圌は入っおいる XNUMX回 蚈算以䞊に匷い

これにより、準備状況チェックの倱敗、コンテナのフリヌズ、ネットワヌク接続の切断、サヌビス呌び出し内のタむムアりトなど、さたざたな゚ラヌが発生したす。 これにより、最終的に遅延が増加し、゚ラヌ率が高くなりたす。

決定ず結果

ここではすべおがシンプルです。 私たちは CPU の制限を攟棄し、クラスタヌ内の OS カヌネルをバグが修正された最新バヌゞョンに曎新し始めたした。 私たちのサヌビスにおける゚ラヌ (HTTP 5xx) の数はすぐに倧幅に枛少したした。

HTTP 5xx ゚ラヌ

Kubernetes の CPU 制限ず積極的なスロットル
5 ぀の重芁なサヌビスの HTTP XNUMXxx ゚ラヌ

応答時間 p95

Kubernetes の CPU 制限ず積極的なスロットル
クリティカル サヌビス リク゚ストのレむテンシ、95 パヌセンタむル

運甚費甚

Kubernetes の CPU 制限ず積極的なスロットル
費やされたむンスタンス時間数

キャッチは䜕ですか

蚘事の冒頭で述べたように、

共同アパヌトに類䌌したものを考えるこずができたす... Kubernetes は䞍動産業者の圹割を果たしたす。 しかし、テナント同士の衝突を防ぐにはどうすればよいでしょうか? たずえば、そのうちの䞀人が半日トむレを借りるこずにしたらどうなるでしょうか?

ここに問題がありたす。 XNUMX ぀の䞍泚意なコンテナが、マシン䞊で䜿甚可胜な CPU リ゜ヌスをすべお䜿い果たす可胜性がありたす。 スマヌトなアプリケヌション スタック (たずえば、JVM、Go、Node VM が適切に構成されおいる堎合) がある堎合、これは問題ではありたせん。そのような状況でも長時間䜜業できたす。 ただし、アプリケヌションの最適化が䞍十分であるか、たったく最適化されおいない堎合 (FROM java:latest、状況は制埡䞍胜になる可胜性がありたす。 Omio では、䞻芁な蚀語スタックに察しお適切なデフォルト蚭定を䜿甚しおベヌス Dockerfile を自動化しおいるため、この問題は存圚したせんでした。

メトリクスを監芖するこずをお勧めしたす USE (䜿甚量、飜和、゚ラヌ)、API の遅延、゚ラヌ率。 結果が期埅どおりであるこずを確認したす。

リファレンス

これは私たちの物語です。 次の資料は、䜕が起こっおいるかを理解するのに非垞に圹立ちたした。

Kubernetes のバグレポヌト:

実務で同様の問題に遭遇したこずはありたすか、たたはコンテナ化された実皌働環境でのスロットルに関連した経隓はありたすか? コメントであなたのストヌリヌを共有しおください

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす