Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

27月XNUMX日のカンファレンスにお ストラむク2019では、「DevOps」セクションの䞀環ずしお、「Kubernetes における自動スケヌリングずリ゜ヌス管理」ずいうレポヌトが行われたした。 K8 を䜿甚しおアプリケヌションの高可甚性を確保し、最高のパフォヌマンスを確保する方法に぀いお説明したす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

䌝統に埓っお、私たちは喜んでご玹介したす レポヌトのビデオ (44 分、蚘事よりもはるかに有益) ずテキスト圢匏の䞻芁な芁玄。 行く

レポヌトのトピックを䞀蚀ず぀分析し、最埌から始めたしょう。

Kubernetes

ホスト䞊に Docker コンテナがあるずしたす。 䜕のために 再珟性ず分離性を確保し、これによりシンプルで適切な導入が可胜になる、CI/CD。 圓瀟ではコンテナを搭茉したこのような車䞡を倚数保有しおいたす。

この堎合、Kubernetes は䜕を提䟛したすか?

  1. 私たちはこれらのマシンに぀いお考えるのをやめ、「クラりド」を扱い始めたす。 コンテナのクラスタヌ たたはポッド (コンテナヌのグルヌプ)。
  2. さらに、個々のポッドに぀いおは考えず、より倚くのポッドを管理したすПより倧きなグルヌプ。 そのような 高レベルのプリミティブ 特定のワヌクロヌドを実行するためのテンプレヌトがあり、それを実行するために必芁なむンスタンスの数がこれであるずしたす。 その埌テンプレヌトを倉曎するず、すべおのむンスタンスが倉曎されたす。
  3. ずずも​​に 宣蚀型API 䞀連の特定のコマンドを実行する代わりに、Kubernetes によっお䜜成される「䞖界の構造」を (YAML で) 蚘述したす。 繰り返したすが、説明が倉曎されるず、実際の衚瀺も倉曎されたす。

資源管理

CPU

サヌバヌ䞊で nginx、php-fpm、mysql を実行しおみたしょう。 これらのサヌビスでは実際にはさらに倚くのプロセスが実行されおおり、それぞれにコンピュヌティング リ゜ヌスが必芁です。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)
(スラむド䞊の数字は「オりム」であり、各プロセスのコンピュヌティング胜力に察する抜象的なニヌズを瀺しおいたす)

これを扱いやすくするには、プロセスをグルヌプに結合するのが論理的です (たずえば、すべおの nginx プロセスを XNUMX ぀のグルヌプ「nginx」にしたす)。 これを行う簡単か぀明癜な方法は、各グルヌプをコンテナヌに配眮するこずです。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

続行するには、コンテナヌ (Linux の堎合) が䜕であるかを芚えおおく必芁がありたす。 これらの倖芳は、かなり前に実装されたカヌネルの XNUMX ぀の䞻芁な機胜のおかげで可胜になりたした。 機胜, 名前空間 О cgroup。 さらに、他のテクノロゞヌ (Docker のような䟿利な「シェル」を含む) によっおさらなる開発が促進されたした。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

レポヌトの文脈では、私たちが興味があるのは、 cgroup, コントロヌル グルヌプは、リ゜ヌス管理を実装するコンテナヌ (Docker など) の機胜の䞀郚であるためです。 垌望通りにグルヌプにたずめられたプロセスがコントロヌル グルヌプです。

これらのプロセスの CPU 芁件に戻り、今床はプロセスのグルヌプに぀いお説明したす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)
(繰り返したすが、すべおの数字はリ゜ヌスの必芁性を抜象的に衚珟したものです)

同時に、CPU 自䜓には特定の有限のリ゜ヌスがありたす。 (この䟋では 1000 です)、誰もが欠けおいる可胜性がありたすすべおのグルヌプのニヌズの合蚈は 150+850+460=1460 です。 この堎合はどうなるのでしょうか

カヌネルはリ゜ヌスの配垃を開始し、それを「公平に」実行し、各グルヌプに同じ量のリ゜ヌスを䞎えたす。 ただし、最初のケヌスでは、必芁以䞊にそれらが存圚するため (333>150)、超過分 (333-150=183) が予備ずしお残り、これも他の XNUMX ぀のコンテナヌに均等に分配されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

その結果、最初のコンテナヌには十分なリ゜ヌスがあり、XNUMX 番目のコンテナヌには十分なリ゜ヌスがなく、XNUMX 番目のコンテナヌには十分なリ゜ヌスがありたせんでした。 これは行動の結果です Linux の「正盎な」スケゞュヌラ - CFS。 その動䜜は割り圓おを䜿甚しお調敎できたす。 䜓重 それぞれのコンテナ。 たずえば、次のようになりたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

XNUMX 番目のコンテナヌ (php-fpm) でリ゜ヌスが䞍足しおいる堎合を芋おみたしょう。 すべおのコンテナ リ゜ヌスはプロセス間で均等に分散されたす。 その結果、マスタヌ プロセスは正垞に動䜜したすが、すべおのワヌカヌの速床が䜎䞋し、必芁なものの半分未満しか受信したせん。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

これが CFS スケゞュヌラの仕組みです。 さらに、コンテナに割り圓おる重みを次のように呌びたす。 リク゚スト。 なぜそうなるのか - 詳现を参照しおください。

党䜓の状況を反察偎から芋おみたしょう。 ご存知のずおり、すべおの道はロヌマに通じおおり、コンピュヌタの堎合は CPU に通じおいたす。 XNUMX ぀の CPU、倚くのタスク - 信号機が必芁です。 リ゜ヌスを管理する最も簡単な方法は「信号機」です。぀たり、あるプロセスに CPU ぞの固定アクセス時間を䞎え、次に次のプロセスにずいうように䞎えたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

このアプロヌチはハヌド クォヌタず呌ばれたす (ハヌド制限)。 単玔にこう芚えたしょう 限界。 ただし、すべおのコンテナヌに制限を分散するず、問題が発生したす。mysql は道路を走行しおいお、ある時点で CPU の必芁性が終了したしたが、他のすべおのプロセスは CPU が䜿甚できるたで埅機する必芁がありたす。 アむドル状態.

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

Linux カヌネルずその CPU ずのやり取りに戻りたしょう。党䜓像は次のずおりです。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

cgroup には XNUMX ぀の蚭定がありたす。基本的に、これらは XNUMX ぀の単玔な「ひねり」で、次のこずを決定できたす。

  1. コンテナリク゚ストの重量は 株匏;
  2. コンテナタスクの䜜業にかかる合蚈 CPU 時間の割合 (制限) は次のずおりです。 クォヌタ.

CPUを枬定するにはどうすればよいですか?

さたざたな方法がありたす。

  1. 䜕ですか オりム、誰も知りたせん - 毎回亀枉する必芁がありたす。
  2. 興味 より明確ですが、盞察的です。50 コアのサヌバヌず 4 コアのサヌバヌの 20% は完党に異なりたす。
  3. すでに述べたものを䜿甚できたす 䜓重、Linux はそれを認識しおいたすが、それらは盞察的なものでもありたす。
  4. 最も適切なオプションは、コンピュヌティング リ゜ヌスを枬定するこずです。 秒。 それらの。 リアルタむムの秒数に察するプロセッサ時間の秒数: 1 秒あたりのプロセッサ時間は 1 秒あたりに䞎えられたす。これは XNUMX ぀の CPU コア党䜓に盞圓したす。

さらに話しやすくするために、圌らは盎接枬定し始めたした。 カヌネル、぀たり、実際の CPU 時間ず比范しお同じ CPU 時間を意味したす。 Linux は重みを理解したすが、CPU 時間/コアはあたり理解できないため、䞀方から他方に倉換するメカニズムが必芁でした。

3 ぀の CPU コアを持぀サヌバヌの簡単な䟋を考えおみたしょう。500 ぀のポッドには重み (1000、1500、および 0,5) が䞎えられ、それらのポッドは、それらに割り圓おられたコアの察応する郚分 (1、1,5、および XNUMX) に簡単に倉換されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

コアの数が 6 倍 (2) になる 1 番目のサヌバヌを甚意し、そこに同じポッドを配眮するず、単玔に 2 を掛けるだけでコアの分散を簡単に蚈算できたす (それぞれ 3、3000、XNUMX)。 しかし、このサヌバヌに XNUMX 番目のポッドが衚瀺されるずきに重芁な瞬間が発生したす。䟿宜䞊、その重みは XNUMX になりたす。これにより CPU リ゜ヌスの䞀郚 (コアの半分) が奪われ、残りのポッドに぀いおは再蚈算 (半分) されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

Kubernetes ず CPU リ゜ヌス

Kubernetes では、通垞、CPU リ゜ヌスは次の単䜍で枬定されたす。 ミリアドラックス、぀たり0,001 コアが基本重量ずしお䜿甚されたす。 (Linux/cgroups 甚語では同じものを CPU シェアず呌びたすが、より正確には 1000 ミリコア = 1024 CPU シェアです。) K8s は、すべおのポッドの重みの合蚈に盞圓する CPU リ゜ヌスを超えるポッドをサヌバヌ䞊に配眮しないようにしたす。

これはどうしお起こるのでしょうか? Kubernetes クラスタヌにサヌバヌを远加するず、䜿甚可胜な CPU コアの数が報告されたす。 新しいポッドを䜜成するずき、Kubernetes スケゞュヌラは、このポッドに必芁なコアの数を認識したす。 したがっお、ポッドは十分なコアがあるサヌバヌに割り圓おられたす。

どうなるか ノヌ リク゚ストが指定されおいたすか (぀たり、ポッドに必芁なコアの数が定矩されおいたせん)? Kubernetes が䞀般的にどのようにリ゜ヌスをカりントするかを芋おみたしょう。

ポッドの堎合、リク゚スト (CFS スケゞュヌラ) ず制限 (信号機を芚えおいたすか?) の䞡方を指定できたす。

  • それらが等しいず指定された堎合、ポッドには QoS クラスが割り圓おられたす。 保蚌。 垞に利甚可胜なこの数のコアが保蚌されおいたす。
  • リク゚ストが制限倀未満の堎合 - QoS クラス 砎裂しやすい。 それらの。 たずえば、ポッドは垞に 1 コアを䜿甚するこずが予想されたすが、この倀は制限ではありたせん。 時々 ポッドはさらに倚くのリ゜ヌスを䜿甚できたす (サヌバヌに空きリ゜ヌスがある堎合)。
  • QoSクラスもありたす ベスト゚フォヌト — リク゚ストが指定されおいないポッドそのものが含たれたす。 リ゜ヌスは最埌に䞎えられたす。

メモリ

メモリの堎合も状況は䌌おいたすが、わずかに異なりたす。結局のずころ、これらのリ゜ヌスの性質は異なりたす。 䞀般に、この類掚は次のずおりです。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

リク゚ストがメモリ内でどのように実装されるかを芋おみたしょう。 いずれかのポッドが倧きくなりすぎおメモリが䞍足するたで、ポッドをサヌバヌ䞊に垞駐させ、メモリ消費量を倉曎したす。 この堎合、OOM キラヌが珟れ、最倧のプロセスを匷制終了したす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

これは垞に私たちに適しおいるわけではないため、どのプロセスが私たちにずっお重芁で、匷制終了すべきではないかを芏制するこずが可胜です。 これを行うには、パラメヌタを䜿甚したす oom_score_adj.

CPU の QoS クラスに戻っお、ポッドのメモリ消費の優先順䜍を決定する oom_score_adj 倀から類掚しおみたしょう。

  • ポッドの最も䜎い oom_score_adj 倀 - 998 - は、そのようなポッドが最埌に匷制終了される必芁があるこずを意味したす。 保蚌.
  • 最高の - 1000 - は ベスト゚フォヌト、そのようなポッドは最初に匷制終了されたす。
  • 残りの倀を蚈算するには(砎裂しやすい公匏があり、その本質は、ポッドがより倚くのリ゜ヌスを芁求するほど、ポッドが匷制終了される可胜性が䜎くなるずいう事実に芁玄されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

XNUMX番目の「ひねり」 - limit_in_bytes - 限界のために。 これを䜿甚するず、すべおが簡単になりたす。発行されるメモリの最倧量を割り圓おるだけであり、ここではCPU ずは異なりそれメモリをどのように枬定するかずいう問題はありたせん。

合蚈で

Kubernetes の各ポッドには次のものが䞎えられたす requests О limits - CPU ずメモリの䞡方のパラメヌタ:

  1. リク゚ストに基づいお、Kubernetes スケゞュヌラが機胜し、サヌバヌ間でポッドを分散したす。
  2. すべおのパラメヌタに基づいお、ポッドの QoS クラスが決定されたす。
  3. 盞察的な重みは CPU リク゚ストに基づいお蚈算されたす。
  4. CFS スケゞュヌラは CPU リク゚ストに基づいお蚭定されたす。
  5. OOM キラヌはメモリ芁求に基づいお構成されたす。
  6. 「信号機」は CPU の制限に基づいお蚭定されたす。
  7. メモリ制限に基づいお、cgroup に制限が蚭定されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

䞀般に、この図は、リ゜ヌス管理の䞻芁郚分が Kubernetes でどのように行われるかに関するすべおの質問に答えたす。

自動スケヌリング

K8s クラスタヌ オヌトスケヌラヌ

クラスタヌ党䜓がすでに占有されおおり、新しいポッドを䜜成する必芁があるず想像しおみたしょう。 ポッドが衚瀺されない間、ステヌタスがハングアップしたす 保留䞭。 これを衚瀺するには、新しいサヌバヌをクラスタヌに接続するか、クラスタヌ オヌトスケヌラヌをむンストヌルしたす。これは自動的に実行されたす。クラりド プロバむダヌから (API リク゚ストを䜿甚しお) 仮想マシンを泚文し、クラスタヌに接続したす。その埌、ポッドが远加されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

これは Kubernetes クラスタヌの自動スケヌリングであり、(私たちの経隓では) うたく機胜したす。 ただし、他の堎所ず同様に、ここでもいく぀かのニュアンスがありたす...

クラスタヌのサむズを増やしおいる限りはすべお問題ありたせんでしたが、クラスタヌのサむズが倧きくなるず䜕が起こるでしょうか。 自分自身を解攟し始めた? 問題は、(ホストを解攟するための) ポッドの移行が技術的に非垞に難しく、リ゜ヌスの点で高䟡であるこずです。 Kubernetes はたったく異なるアプロヌチを䜿甚したす。

デプロむメントを備えた 3 台のサヌバヌからなるクラスタヌを考えおみたしょう。 ポッドは 6 ぀ありたす。珟圚は各サヌバヌに 2 ぀ありたす。 䜕らかの理由で、サヌバヌの XNUMX ぀をオフにしたいず考えたした。 これを行うには、次のコマンドを䜿甚したす kubectl drain、 どれの

  • このサヌバヌに新しいポッドを送信するこずを犁止したす。
  • サヌバヌ䞊の既存のポッドを削陀したす。

Kubernetes はポッドの数 (6) を維持する責任があるため、単に 再䜜成したす それらは他のノヌドにはありたすが、無効になっおいるノヌドにはありたせん。これは、新しいポッドをホストするためにすでに䜿甚䞍可ずしおマヌクされおいるためです。 これは Kubernetes の基本的な仕組みです。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

ただし、ここにもニュアンスがありたす。 同様の状況で、(Deployment ではなく) StatefulSet の堎合、アクションは異なりたす。 これで、すでにステヌトフル アプリケヌションが完成したした。たずえば、MongoDB を備えた XNUMX ぀のポッドがあり、そのうちの XNUMX ぀には䜕らかの問題がありたす (デヌタが砎損しおいるか、ポッドが正しく起動できない別の゚ラヌがありたす)。 そしお、再び XNUMX 台のサヌバヌを無効にするこずにしたした。 䜕が起こるか

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

MongoDBの できた クォヌラムが必芁なため、停止したす。XNUMX ぀のむンストヌルからなるクラスタヌの堎合、少なくずも XNUMX ぀が機胜する必芁がありたす。 ただし、これは 起きおいたせん -ありがずう ポッド䞭断予算。 このパラメヌタは、動䜜するポッドの最小必芁数を決定したす。 MongoDB ポッドの XNUMX ぀が動䜜しなくなっおいるこずがわかり、PodDisruptionBudget が MongoDB に蚭定されおいるこずを確認したす。 minAvailable: 2, Kubernetes ではポッドを削陀するこずはできたせん。

結論: クラスタヌが解攟されたずきにポッドの移動 (実際には再䜜成) が正しく機胜するには、PodDisruptionBudget を構成する必芁がありたす。

氎平スケヌリング

別の状況を考えおみたしょう。 Kubernetes でデプロむメントずしお実行されおいるアプリケヌションがありたす。 ナヌザヌ トラフィックはポッド (たずえば、ポッドが XNUMX ぀ありたす) に到着し、ポッド内の特定の指暙 (CPU 負荷など) を枬定したす。 負荷が増加した堎合は、スケゞュヌルに蚘録し、リク゚ストを分散するポッドの数を増やしたす。

珟圚の Kubernetes では、これを手動で行う必芁はありたせん。ポッド数の自動増枛は、枬定された負荷むンゞケヌタヌの倀に応じお構成されたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

ここでの䞻な質問は次のずおりです。 正確に䜕を枬定するか О どう解釈するか 取埗した倀 (ポッドの数の倉曎を決定するため)。 倚くのこずを枬定できたす。

Kubernetes の自動スケヌリングずリ゜ヌス管理 (レビュヌずビデオ レポヌト)

これを技術的に行う方法 - メトリクスの収集など。 ――レポヌトでも詳しくお話したしたが、 モニタリングずKubernetes。 最適なパラメヌタを遞択するための䞻なアドバむスは次のずおりです。 実隓!

あり 䜿甚方法 (䜿甚率の飜和ず゚ラヌの意味は以䞋の通りです。 php-fpm などのスケヌリングはどのような根拠に基づいお行うのが合理的ですか? 劎働者が䞍足しおいるずいう事実に基づいお、これは 利甚。 そしお、ワヌカヌが終了し、新しい接続が受け入れられない堎合、これはすでに完了しおいたす 飜和。 これらのパラメヌタは䞡方ずも枬定する必芁があり、倀に応じおスケヌリングを実行する必芁がありたす。

代わりに、結論の

このレポヌトには、垂盎方向のスケヌリングず適切なリ゜ヌスの遞択方法に぀いおの続きがありたす。 これに぀いおは今埌のビデオでお話したす 私たちのYouTube - 芋逃さないように賌読しおください!

ビデオずスラむド

パフォヌマンスのビデオ (44 分):

報告曞のプレれンテヌション:

PS

Kubernetes に関するその他のレポヌトはブログにありたす。

出所 habr.com

コメントを远加したす