1. リソースコントローラの主な機能k8s の重要な概念の 1 つは宣言型 API であることはご存知でしょう。たとえば、kubectl apply は宣言型 API の実装です。 その結果、リソース オブジェクトの実行状態は宣言と一致している必要があります。たとえば、kubectl がデプロイメント yml を適用する場合、必要なステータスはデプロイメントが正常に実行されることです。 そこで疑問になるのが、k8s はどのようにしてリソース オブジェクトを「監視」し、宣言した状態が常に維持されるようにするのかということです。答えは「コントローラー」です。 kube-controller-manager コンポーネントに加えて、カスタム コントローラーとも呼ばれる独自のコントローラーを作成することもできます (便宜上、以下では総称してカスタム コントローラーと呼びます)。 次に、コントローラーの背後にある「秘密」を分析してみましょう 2. プロセスの概要まず、コミュニティによって提供されたコントローラー アーキテクチャ図を見てみましょう。 主なオブジェクト (構造) には、Reflector、Informer、Indexer などがあります。 ReflectorとIndexerについては、次回以降で順に説明していきます。 この記事では主にInformerについて説明します。 図からわかるように、主に9つのステップがあります。ここでは、9 つのステップを 3 つの主要なステップにまとめます。 (絵がちょっと汚いです-__-!!!) 大きなステップ 1 : Reflector はリソース オブジェクトのイベントを Delta FIFO キューに追加します。 ここでは Delta FIFO キューについて紹介します。いわゆるデルタは変化を意味します。どのような変化ですか?リソースオブジェクトの変更です。 つまり、リソース オブジェクトに対するすべての変更が Delta FIFO キューに追加されます。今では簡単に理解できます。 大きなステップ 2 : Informer は Delta FIFO キュー内のオブジェクト データをローカル キャッシュに追加します。 さらに、このローカル キャッシュには、監視リソース オブジェクトの最新バージョンがキャッシュされます。キャッシュされた現在のクラスター内のリソース情報です。 大きなステップ 3 : ワークキューを使用してビジネス ロジックを処理します。 3. ステップ分析コミュニティによって書かれたカスタム コントローラーの使用例に基づいてソース コード分析を実行しましょう。ここで使用されているバージョンは client-go v0.20.5 です。
大きなステップ1アーキテクチャ図の中央に境界線があり、プロセスが 2 つに分割されており、上半分には主に主要なステップ 1 と 2 が含まれていることがわかります。 これら 2 つのステップは実際には相互に関連しています。エントリ コードは次の行です: informer.Run()。今のところは無視して構いません。 まず、ユースケースにおける Informer の初期化エントリ コードを見てみましょう。 NewIndexerInformer のコードは次のとおりです。 実際の Informer の初期化は newInformer です。 381 行目は Delta FIFO の初期化であることに注意してください。アーキテクチャ図の Delta FIFO キューはここでインスタンス化されます。 newInformer は低レベルの Controller インターフェイスを返すことがわかりました。このインターフェースは非常にシンプルで、メソッドは 3 つだけです。 実行(stopCh <-chan 構造体{}):
HasSynced() ブール値:
LastSyncResourceVersion() 文字列:
次に、3 つのメソッドを見て、これがコントローラーでどのように実装されているかを確認しましょう。 419 行目の低レベル コントローラーの初期化のコードに直接ジャンプすると、Run メソッドの実装を簡単に確認できます。 コードの大部分は Reflector の初期化です。 152 行目はコルーチンを開始します。 *r.Run* は、Reflector の実行ロジックです。リソース オブジェクトを一覧表示および監視し、オブジェクトを Delta FIFO キューに追加します。 「ジャンプ」をクリックして、ListAndWatch メソッドに直接ジャンプしてみましょう。このコードは長くて乱雑ですが (文句を言わずにはいられません)、実行する必要があるのは非常に単純で、たった 4 つのことだけです。ここでキーコードをコピーします。 まず最初に初期化した cache.ListWatch オブジェクトの ListFunc を使用してリソース オブジェクトを取得し、オブジェクトを Delta FIFO キューに同期します。 簡単に説明します。 r.syncWith(items, resourceVersion) は主に Delta FIFO キューの Replace() を通じてリソースを同期します。重要なロジックの 1 つは次のとおりです。 f.populated = true は、リソース オブジェクトがキューに入るアクションが発生したことを確認します。 f.initialPopulationCount は、キュー内にすでに存在するオブジェクトの数を決定します。 次に、インフォーマー HasSynced() の基礎となるロジックを見てみましょう。 そして、f.initialPopulationCount-- は以下のポップで発生します。 LastSyncResourceVersion() 文字列 返されるバージョンは、r.setLastSyncResourceVersion(resourceVersion) によって設定されたバージョンです。 2番目リソースを再度同期します。 ユースケース コードでは、cache.NewIndexerInformer() が resyncPeriod パラメータを設定し、これがここで機能します。 0 に設定されているため、このコルーチンは case<-resyncCh の場合は永久にブロックされます。 この詳細なロジックについては、後ほど Delta FIFO キューについて説明するときに説明します。簡単に言えば、インデクサーによってキャッシュされたデータを Delta FIFO キューに同期します。 3つ目は初期化した cache.ListWatch オブジェクトの WatchFunc ウォッチ オブジェクトを使用します。
4番目監視対象オブジェクトを Delta FIFO キューに追加します。 簡単にまとめると、次の 2 つがあります。
ビッグステップ2Indexerer は、実際にはメモリ内データベースの抽象インターフェースです。このうち、Store は当然ストレージを表し、その他はインデックスに関連しています。 キャッシュはインターフェースの実装、つまりキャッシュです。インデックスは検索に必ず使用され、その使用法については以下の最適化のセクションで確認できます。 次に、Run メソッドのスクリーンショットの 154 行目に戻り、2 番目の主要なステップのロジックを確認します。 wait.Until はタイマーであり、次のコードに簡略化できます。 実行ロジックは c.processLoop です。 実際、コードは理解しやすいです。キュー (デルタ FIFO キュー) からアイテムをポップし、処理関数を呼び出して ResourceEventHandler 内のメソッドを実行します。 まず、ポップコードを見てみましょう。 その内容は実は非常にシンプルです。ここでは主なロジックのみを記載します。誰でも理解できると信じています。また、同期を決定する上で前述した重要なロジックf.initialPopulationCountも確認しました。 つまり、Delta FIFO キュー内のすべてのデータがインデクサーに同期された場合にのみ、インフォーマーのデータ同期が完了します。 次に、newInformer スクリーンショットの 393 行目のプロセスを見てみましょう。拡張された方法は次のとおりです。 Process 匿名関数の行パラメータを見てみましょう。 obj はポップアウトされるオブジェクトです。 Delta タイプ d.Type に基づいてオブジェクトの処理方法を決定します。 clientState は Indexer であり、h は ResourceEventHandler です。 したがって、ポップアウトされたオブジェクトはすぐに Indexer に入り、ResourceEventHandler の対応するメソッドを呼び出します。ここで、オブジェクトのキーをワークキューに追加します。 さまざまなメソッドの対応する操作がこのコードです。 ビッグステップ3最後に、さまざまなリソース イベント (追加、更新、削除) を処理するのは独自のアプリケーションです。 Workqueue の存在により、キュー内の要素の処理が簡素化されます。 processNextItem 関数を直接見ることができます。 55行目、キュー内のデータを取得します。 65 行目は、処理オブジェクトのビジネス ロジックです。 syncToStdout はいくつかのログを出力するだけですが、obj, exists, err := c.indexer.GetByKey(key) の行は、インデクサーからリソース オブジェクトを取得するためのキーです。これにより、さまざまなビジネスロジックを処理できます。たとえば、私の仕事は一般的に、ResourceEventHandler によって定義された変更 (AddFunc、UpdateFunc、DeleteFunc、AddFunc のみ可能) を含むオブジェクトを独自のクラウド プラットフォームに書き戻すことです。 同様のコードは次のとおりです (syncToStdout はアクションに置き換えられます)。 この時点で、3 つの主要なステップが完了します。 4. 知識を追加します:3 番目のステップは、主にワークキューを呼び出すことです。ワークキューには 3 つの種類があります。
遅延キューは通常のキューをカプセル化したものです。速度制限キューは、追加の速度リミッターを備えた遅延キューをカプセル化したものです。 通常、エラーを処理するときに再試行できるように、レート制限のあるキューを使用します。 処理後は、処理中のキーをキューから削除することを忘れないでください。 再試行と削除はユースケース コードに明確に記述されています。これら 2 つの重要なロジックを見逃さないようにしてください。 死の「最適化」ワークキューが少し冗長であることがわかるかもしれません。 ResourceEventHandler でビジネス ロジックを直接処理できます。コードは次のとおりです。 ここで、Indexer の情報も確認してみることにしました。 GetIndexer は名前空間ごとに集約されたデータを出力します。これは、次の SQL ステートメント select namespace from xx_table として簡単に理解できます。 なぜ死を招くと言うのですか?私たちの友人の中には、コンポーネントに依存しないことが「最適化」であると考えてこのように書いた人もいましたが、公式のユースケースやマネージャーでワークキューが使用される理由については考えていませんでした。 そこで疑問が生じます。なぜワークキューを使用するのでしょうか?理由は次のとおりです。
失敗後の再試行に便利です。 目玉焼きを加えるこれはサイドストーリーシリーズと考えることができます、そして興味がない友人はそれを直接スキップすることができます。 実際、多くのキュー (Delta FIFO キュー、ワークキュー) がないと実行できないことに気づいた学生もおり、小さなデータベース (インデクサー) を使用することさえありました。 オブジェクトを直接観察できますか?これは、etcd watch API を直接呼び出すのと同じです。答えはイエスです。 ここからいくつかコードを借りてみましょう。 ポッドウォッチを実装するためのコードは次のようになります。 ただし、直接の視聴は推奨されません。その 1 つは、ビジネスの観点から見た定期的なイベントです。つまり、リソース オブジェクトの更新アクションは複数のイベントを受信します。 5. まとめ私たちがよく話題にするコントローラーのコア機能は、リソースの変更を監視することです。これは、宣言型の概念であるインフォーマーで状態を保証するための重要なテクノロジです。プロセスは次のとおりです。
次に、誤った*最適化*の例を使用して、ワークキューの重要性を説明しました。 もう少しマニアックになって、オブジェクトの変更イベントを直接監視することもできますが、個人的にはこれをお勧めしません。 この記事では、主に、リソース イベントがインフォーマーから ResourceEventHandler に転送される一般的なプロセスを紹介しますが、詳細についてはあまり触れません。 デルタFIFOキュー、インデクサー、ワークキューなど、いくつかの重要なコンポーネントも習得する必要があるためです。 これらが明確になれば、プロセスの詳細を理解するのは非常に簡単になります。 もちろん、上記の内容を知ることに加えて、sharedInformer と、Controller を記述するための「アーティファクト」(controller-runtime によってカプセル化されたマネージャー) も習得する必要があります。 ご興味がございましたら、以下の記事で詳しくご紹介させていただきます。これらを理解すれば、コントローラーの技術的な詳細は難しくなくなると思います。 |
<<: ハイブリッドクラウドプロジェクトの成功率を向上させる方法
>>: 手遅れになる前に企業がツールを活用してクラウドコストを管理する方法
今月、米国西海岸のシアトルに Dedipath の新しいデータセンターが開設され、専用サーバーと V...
Googleの補足資料問題は、今年さらに注目を集めたSEO問題です。以前に、どの問題が補足資料になる...
コンテンツとは、インターネット上で公開されるすべての情報を指します。コンテンツは、ユーザーが読んでニ...
Doubanは3月29日に非公開グループの閉鎖を発表したばかりで、3月30日にはWeiboに「不正競...
中国ソフトウェアテストセンターが29日に発表した「ウェブサイト利用者のパスワード処理の安全性に関する...
格安 VPS 販売業者の Racknerd は、設立以来、低価格で安価な VPS 路線を追求してきま...
クラウド コンピューティングが非常に普及している今日、クラウド ホストをレンタルするだけでクラウド ...
フィンテックは金融業界を変革しています。デジタル時代において、金融業界は変化をさらに迅速に受け入れる...
より多くのテクノロジー企業がソリューションを最適化し、運用コストを削減するより簡単な方法を模索するに...
2009 年 9 月 1 日は私にとって特別な日でした。私の最初の Web サイトである Jiang...
クラウド コンピューティング環境を管理する場合は、「ホット スタンバイ」や「パイロット ライト」など...
私は2009年にインターネットに触れ始めました。当時、彼氏は私に、あなたは文章を書くのが上手だから、...
大規模なハッキングやエクスプロイトを準備する際、サイバー攻撃者は自身のスキルや狡猾さよりも、被害者の...
Baidu が発表した声明を見ると、ほとんどすべての重み調整と不正行為防止メカニズムはユーザー エク...
多くの企業のWeChatパブリックアカウント編集者にとって、WeChatに投稿する適切な時間を選択す...