起源前回の記事では、kube-apiserver へのリストおよび監視リクエストを開始する Informer の実装を紹介しました。大規模なクラスターでは、特にメモリの面で kube-apiserver がボトルネックになることがわかっています。 kube-apiserver OOM などの問題に遭遇した人も多いと思います (偶然にも、kube-apiserver OOM の問題は最近オンラインで 2 回発生しました)。この記事では主に、kube-apiserver の Informer に必要な 2 つのインターフェース list と watch の実装について説明します。 インターネットで検索すると、ソースコード分析に関する記事がたくさん見つかります。ここではコードについてあまり詳しく説明しません。主に原則とプロセスについてお話しし、最後に理論と実践を組み合わせて現在の問題を簡単に紹介します。この記事では主に現在の実装について説明します。現在の実装と問題が発生する理由を理解することによってのみ、問題を解決する方法がわかります。次の記事では、これらの問題をどのように解決するかを詳しく分析します。 原理キャッシュ読み込み写真 コアコンポーネント: Cacher、watchCache、cacheWatcher、reflector。このうち、watchCache はリフレクタのストアとして使用され、Etcd は listerWatcher のストレージとして使用され、store と listerWatcher はリフレクタを構築するためのパラメータとして使用されます。データフローはおおよそ次のようになります。
写真 キャッシュデータフローデータをキャッシュするために使用されるコア構造は watchCache です。この中には、cache (循環バッファ) と store (スレッドセーフ ストア) という 2 つの主要な構造があり、それぞれ履歴 watchCacheEvent と実際のリソース オブジェクトを格納するために使用されます。ストアにはすべてのオブジェクトが格納されます。キャッシュのサイズは適応的ですが、最大容量の制限があるため、格納される watchCacheEvent によって表されるオブジェクト セットは、必ずしもストア内のすべてのデータをカバーするわけではありません。 歴史的問題kube-apiserver は、独自のメモリ使用量の最適化において多くの改善を行いましたが、まだ完全に解決されていない問題がいくつかあります。 kube-apiserver OOMメモリ消費源kube-apiserver のメモリ消費は、主に次の 2 つの原因で発生します。
リスト要求がより多くのメモリを消費する理由は次のとおりです。
一般的なシナリオkube-apiserver OOM を簡単に引き起こす可能性のある一般的なシナリオが 2 つあります。
リソースバージョンが古すぎる原理厳密に言えば、これは問題ではありません。仕組みはこのようになっており、理論的には1台のマシンのリソースが無制限であればこの現象は回避できる。説明の便宜上、リソースバージョンを表すために RV が使用されます。 その本質は、クライアントがウォッチ API を呼び出すときにゼロ以外の RV を運ぶことです。サーバーがキャッシャーのウォッチ実装ロジックに到達すると、渡された RV に基づいて、RV より大きいすべての watchCacheEvents を循環バッファーでバイナリ検索し、それらを初期イベントとしてクライアントに返す必要があります。循環バッファの最小 RV が受信 RV より大きい場合、つまり、サーバーによってキャッシュされたイベントの最小 RV がクライアントによって送信されたイベントの最小 RV より大きい場合、キャッシュされた履歴イベントが不完全であることを意味します。これは、イベントが多すぎてキャッシュ サイズが制限されているため、古い watchCacheEvent が上書きされたことが原因である可能性があります。 一般的なシナリオ
クライアント Informer がこのエラーに遭遇すると、ListAndWatch を終了して LIstAndWatch を再起動します。これにより、kube-apiserver のメモリが増加したり、OOM になったりする可能性があります。問題の根本的な原因: RV はグローバルです。シナリオ間の本質的な違いは、シナリオ 1 は 1 つのリソースでのスクリーニングによって発生するのに対し、シナリオ 2 は複数のリソース タイプ間の RV の大きな違いによって発生することです。 最適化上記の分析の結果、この問題には 2 つの原因が考えられます。
コミュニティでは、この問題が発生する可能性を減らすために、数バージョン前に最適化も行いました。 問題 1 については、適応型ウィンドウ サイズを採用しました。問題は依然として発生しますが、以前に値をハードコーディングした場合よりも問題が発生する可能性は低くなります。同時に、メモリリソースの無駄を避けるために、必要のない場合には長さを短縮します。 2 番目の問題には、2 つの最適化があります。 BOOKMARK メカニズムは、同じリソースに対する異なるフィルタリング条件によって発生する問題を最適化するために導入されました。 BOOKMARK は、最新の RV を定期的にクライアントに返すイベント タイプです。 ProgressNotify は、さまざまなリソース タイプの RV がまったく異なるという問題を解決するために導入されました。 kube-apiserver を再起動した後、Informer resume によって発生する問題は、基本的に Etcd の clientv3 ProgressNotify メカニズムの使用に起因します。 Etcd を監視する場合、kube-apiserver はこの機能を有効にするための特定のオプションを持ちます。 ProgressNotifyはEtcdの公式ドキュメント[1]を参照しています。 WithProgressNotify を使用すると、受信イベントがない場合でも、監視サーバーは 10 分ごとに定期的な進行状況の更新を送信します。進行状況の更新には、WatchResponse にイベントが 0 個あります。 詳細については、次のKEPを参照してください:956-watch-bookmark[2]および1904-efficient-watch-resumption[3] 古くなった読み物これは長年の課題です。これは、watchCache の登場以来存在しています。本質的には、以前は Etcd に直接アクセスするときに使用されていた線形一貫性読み取り (Etcd によって提供される機能) は、kube-apiserver キャッシュを読み取るシーケンシャル一貫性にダウングレードされました。 シナリオ
詳細については、第59848号[4]を参照してください。 考える私たちは、さまざまなソースコード解析や原理解析の記事をよく目にしますが、その内容を安易に信じてしまいがちです。ただし、バージョンの反復と一部の詳細の処理により、それらを完全に理解できなかったり、完全に習得できなかったりする場合があります。たとえば、リスト要求で RV=0 が渡された場合、kube-apiserver キャッシュが使用されますか?オンラインで検索すると動作すると表示されますが、コードを見るとそうではないことがわかります。たとえば、kube-apiserver の再起動後にデータが完全にロードされていない場合、RV=0 のリスト要求が発生すると、Etcd に直接アクセスしてデータを取得します。一見重要でない詳細が、問題に対処する際の私たちの考え方に影響を与える可能性があります。たとえば、Etcd の負荷が高い理由を知りたい場合、この詳細がわかっていれば、RV != 0 のリクエストだけでなく、すべてのリスト リクエストを意識的に確認することになります。 最後に、1 つ考えておきたいことがあります。kube-apiserver のメモリ負荷は、主にリスト リクエストによって発生します。では、リスト機能を実装するために、リスト要求の代わりにストリーミング処理を使用できるでしょうか?この方法では、メモリ消費を一定の空間複雑度に制限できますか?次の記事では、ストリーミングAPIを使用してリストによるメモリ爆発の問題を解決する方法を具体的に分析しますので、お楽しみに〜 参考文献[1]etcd: https://pkg.go.dev/github.com/coreos/etcd/clientv3#WithProgressNotify [2]ブックマーク: https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/956-watch-bookmark/README.md [3]ウォッチ再開: https://github.com/kubernetes/enhancements/blob/c63ac8e05de716370d1e03e298d226dd12ffc3c2/keps/sig-api-machinery/1904-efficient-watch-resumption/README.md [4]古い記事: https://github.com/kubernetes/kubernetes/issues/59848 |
<<: データセンターの進化: ローカルコンピューティングからクラウド、エッジコンピューティングへ
>>: 実証済みの分析戦略でデータの潜在能力を最大限に引き出します
Burst は Green Monday に非常にコスト効率の高い独立サーバーを導入しました。これま...
Xiaomi が今日のような業績を達成したのは偶然ではありません。Xiaomi は、短期間で会社をこ...
5月19日、筆者は「社内SEO研修についてお話しましょう」というタイトルの記事を書きました。この記事...
itnuthosting は 2009 年に設立されたバングラデシュのホスティング会社で、主にドメイ...
ハロウィーンが近づいており、tragicservers はハロウィーン VPS プロモーションを事前...
以前、インターネットページの価値に関する記事を読みました。Baidu のエンジニアは、インターネット...
ラボガイド人工知能とクラウドコンピューティングの統合がますます近づくにつれて、クラウドとAIエコシス...
3 大クラウド コンピューティング サービス プロバイダー (AWS、Google Cloud、Mi...
新年を祝うため、今から 1 月 18 日まで、friendhosting はすべての VPS と仮想...
朝早くにウェブサイトのインデックスを見て、おお、金塊だ!と思った。私が持っていた企業ウェブサイトのホ...
新浪科技報、北京時間1月12日朝のニュースによると、米国のソーシャルエンターテイメントウェブサイトG...
budgetvm は、わずか 45 ドルで非常に強力な構成の特別なサーバーを立ち上げました。もちろん...
オリンピック放送サービス(OBS)とアリババクラウドは9月19日、本日開幕した杭州雲奇カンファレンス...
IT サービス管理 (ITSM) の元のコード ベースはメインフレーム用に開発され、そのデータ構造は...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス業界ではよく知られている...