分析するまず、自分で実装する場合にどのように設計するかを想像することができます。 Informer は現在 ListWatch メカニズムであり、サーバーはストリーミング List をサポートしていないため、クライアントとサーバーの両方が適応する必要があるのは避けられません。したがって、予備的な方向性は次のようになります。
クライアントの適応は比較的単純であり、サーバー側でそれをどのように実装するかに依然として焦点が当てられています。まず、前回の Stale Read で紹介した以前のリストのロジックを確認しましょう。
新しいバージョンでは、リストの古い読み取りの問題が修正されました。最初の 2 つのケースでは、まず kube-apiserver から Etcd の最新の RV を取得し、WatchCache Store のコンテンツが RV に追いつくのを待ってから、すべてを一度に返します。 つまり、サーバーは最新の完全なデータがすでにあるかどうかを認識し、それに基づいてストリーミング形式でデータを返すことができます。既存のストリーミング API は Watch なので、これに基づいて List 効果をサポートできます。リストのリクエストに基づいて変更してみませんか?リストを変更すると、クライアント側の調整が過度に必要になるためです。 List は単独で使用されることが多いですが、Watch は基本的に Informer で使用されます。 したがって、最終的な作業は、Watch API を使用して List 効果を実現する方法になりますが、データは引き続きストリーミング形式でクライアントに返され、同時に、Informer は ListWatch メソッドを変更して、Watch API のみを使用して以前の効果を実現します。以下の記事では主にサーバーの実装を詳しく紹介し、クライアントの適応部分については簡単に紹介します。 原理Watch API に SendInitialEvents=true パラメータを追加することで、リスト効果をサポートします。 Watch リクエストを受信した後、サーバーは InitEvents としてクライアントに送信するデータを決定します。これらのデータを送信した後、サーバーは、InitEvents が送信されたことをクライアントに通知するサインとして、特定の BOOKMARK イベント (RV が以下の bookmarkAfterRV に対応する特定の注釈を持つ BOOKMARK) をクライアントに送信します。指定された BOOKMARK イベントを受信した後、クライアントは以前に受信したすべての InitEvents を List の結果として処理します。 タイミング図以下はv1.29コードに基づいた分析です。現時点では、v1.29 はまだアルファ状態です。記載されている古いバージョンは 1.27 より前のバージョンを指し、新しいバージョンは v1.29 を指します。表示されるコードが以下の説明と一致しない場合は、コードのバージョンが原因である可能性があります。 写真 WatchCache から始まり、右側の青い 4 つは kube-apiserver の起動時に実行されます。 G1 と G2 は、Etcd からデータを取得し、クライアントの CacheWatcher 入力チャネルにデータを送信するために使用される 2 つの goroutine を表します。
上記のプロセスは、サーバー起動時のデータ処理フローを説明しています。次に、クライアントからのリクエストがあった場合の処理フローを見てみましょう。
2a WatchCache ストアから返されるデータの取得を開始します。このときの処理ロジックは旧バージョンと同じです。ストア内のすべてのデータが返され、次のステップのためにストア データの最大 RV が記録されます。 2b 入力チャネル内のイベントを消費し、その RV が 2a で渡された RV より大きいかどうかを比較します。それが BOOKMARK タイプであり、その RV が 2a で渡された RV と等しく、bookmarkAfterRV イベントが送信されていない場合、この BOOKMARK イベントはリストの終了と見なされ、Annotation: k8s.io/initial-events-end が設定され、最終的にクライアントに送信されます。 これまで、サーバーの主なプロセスが紹介され、クライアント Informer も対応する適応を行いました。 WatchList 機能がオンになっている場合は、完全なデータを取得するために Watch 要求が送信されます。アノテーション k8s.io/initial-events-end を含む BOOKMARK イベントを受信すると、その RV が記録され、この期間中に受信および処理されたオブジェクトがリスト結果として使用されます。最後に、上記の RV をパラメータとして Watch リクエストが再度呼び出されます。このステップからは、Informer の従来の Watch ロジックになります。 データフロー写真 この画像は KEP 3157 ウォッチリストから取得したもので、実際にはタイミング図も含まれています。しかし、本のシーケンス図のタイミング図には、コードと一致しない問題がいくつかあります。したがって、タイミング図はここでは直接使用されず、再描画されます。 上記の 2 つの図を組み合わせると、全体のプロセスを理解できます。上図の a はタイミング図の 2a に対応し、b はタイミング図の 2b に対応し、c はタイミング図の G2.1 に対応します。下部の白い部分はタイミング図のG1のロジック、つまりEtcdからデータを取得することに対応しています。クライアント要求の処理は上から下へ行われ、データの返送は下から上へ行われます。 知らせ上記の処理ロジックには多くの詳細があり、特別な注意が必要です。
要約するこの記事では、WatchList の実装原理とロジックを主に分析し、いくつかの詳細を説明します。詳細については後ほどコミュニティとさらに話し合う予定です。この KEP では、kube-apiserver のメモリ負荷を軽減するための 2 つの変更も導入されています。スペースの都合上、次回の記事で紹介させていただきます。同時に、すべての最適化作業が完了する前と完了した後の効果の比較も示します。乞うご期待〜 |
<<: ガートナー: クラウドネイティブテクノロジーを導入してデジタル変革を加速する方法
今月初めに、Vultr.com が市場シェアを拡大し続けるために 50 ドルを無料で提供したこと...
2019 年 3 月、Alibaba は OpenJDK ディストリビューション Alibaba D...
エッジ コンピューティングは、エンタープライズ アプリケーションをデータ ソースに近づける分散コンピ...
クラウド コンピューティングは、インターネットの存在に基づいて動的にスケーラブルな仮想化リソースを通...
HostUS は現在、クリスマス プロモーションを開始しており、すべての KVM および OpenV...
国内の仮想ホスト市場は巨大なケーキであり、多くの海外のウェブサイトスペースプロバイダーが中国市場を獲...
昨日、私は「ロシアの VPS サーバー: melbicom、苦情反対、著作権無視、無制限のトラフィッ...
北京、2010 年 1 月 13 日 - HP は本日、通信事業者が 62 億ドル規模の市場機会を活...
多くの場合、ウェブサイトにメンバーが集まった後、メンバーのアクティビティを向上させる方法について考え...
モノのインターネット (IoT) エッジ コンピューティングとは、IoT インフラストラクチャ内のセ...
検索エンジン最適化により、より多くの業界がインターネットに参入できるようになりました。検索エンジンの...
Cloudcone は、皆様への恩返しとして、旧正月に小さなイベントを開催しました。概要は次のとおり...
Chicagogovps のブラック フライデー プロモーションは部分的にリリースされており、仮想ホ...
Siteground からの公式ニュース: 11 月 29 日から 12 月 3 日まで、仮想ホスト...
インターネットは独自の世界であり、わずか数十年の間にさまざまな流派に発展してきました。 Web1.0...