高性能サービス ガバナンス フレームワーク Kmesh について知る

3 月、openEuler コミュニティは、アーキテクチャの革新を通じてサービス グリッドに新しいデータ プレーン エクスペリエンスをもたらす、高性能サービス ガバナンス フレームワーク Kmesh という革新的なプロジェクトを立ち上げました。この記事はサービス グリッドから始まり、Kmesh の過去と現在を理解するのに役立ちます。

現在の Kmesh プロジェクトは openEuler 23.03 でリリースされており、興味のあるパートナーはダウンロードして使用することができます。

倉庫アドレス: https://gitee.com/openeuler/Kmesh

サービスメッシュとは

サービス グリッドは、Linkerd ソフトウェアを開発した好調な企業によって 2016 年に提案されました。William Morgan (Linkerd CEO) によって与えられた元の定義Service Mesh:

サービス メッシュは、サービス間通信を処理するための専用のインフラストラクチャ層です。最新のクラウド ネイティブ アプリケーションを構成するサービスの複雑なトポロジを通じて、リクエストを確実に配信する役割を果たします。実際には、サービス メッシュは通常、アプリケーション コードと一緒にデプロイされる軽量ネットワーク プロキシの配列として実装され、アプリケーションはそれを意識する必要がありません。

大まかに言うと、サービス メッシュはサービス間の通信を処理するインフラストラクチャ層です。ネットワーク プロキシ アレイの形式を通じて、最新のクラウド ネイティブ アプリケーションに透過的で信頼性の高いネットワーク通信を提供します。

サービス グリッドの本質は、マイクロサービス間の通信を改善する方法の問題を解決することであり、負荷分散、グレースケール ルーティング、サーキット ブレーカーの電流制限などのガバナンス ルールを通じて、トラフィックを合理的に配置し、クラスター サービスの機能を最大化します。サービスガバナンスの進化の産物。

サービス ガバナンスの進化プロセスを 3 つの世代に分けて簡単に比較すると、サービス ガバナンスの機能が徐々にビジネスから切り離され、インフラストラクチャに集約されていくことがわかります。

写真

サービス グリッドは、サービス間通信を処理するインフラストラクチャ層として、マイクロサービス ガバナンスにおける K8 の欠点を効果的に補い、クラウド ネイティブな次世代テクノロジとして、クラウド インフラストラクチャの重要なコンポーネントとなっています。

近年のテクノロジーのトレンドとして、業界ではLinkerd、Istio、Consul Connect、Kumaなど、同様のソフトウェアアーキテクチャを持ったサービスグリッドソフトウェアが多数誕生しています。サービス グリッドの基本的なアーキテクチャを以下に示します。

写真

k8s クラスターを例にとると、Pod インスタンスが作成されると、サービス グリッド ソフトウェアは透過的に Proxy コンテナ (サイドカーとも呼ばれ、Istio のデフォルトのサイドカー ソフトウェアは Envoy) を Pod 内に作成します。Pod 通信の基本的なフローは次のとおりです。以下に続きます:

  • トラフィックは、iptables ルールを通じてポッド内のプロキシ コンポーネントに透過的にハイジャックされます。
  • プロキシ コンポーネントは、リクエストに従ってトラフィック管理ロジック (ヒューズ、ルーティング、ロード バランシングなど) を完了し、通信するピア サービス インスタンスを見つけて、メッセージを転送します。
  • ピア Pod のプロキシ コンポーネントは外部トラフィックをハイジャックし、基本的なトラフィック管理ロジック (電流制限など) を実行してから、トラフィックを Pod に転送します。
  • Pod の処理が完了すると、元のパスに従って応答メッセージが要求元の Pod に返されます。

サービス メッシュ データ プレーンの問題点と課題

上記からわかるように、サービス グリッドは、データ プレーンにプロキシ層を導入することにより、アプリケーションに対して透過的なサービス ガバナンスを実装します。ただし、これにはコストがかかり、プロキシ層の導入によりサービス通信の遅延が増加し、パフォーマンスが低下することは避けられません。

Isito 公式 Web サイトで提供されているデータを例にとると、クラスター規模では、マイクロサービス間のデータ プレーン上のシングルホップ通信遅延が 2.65ms 増加します。マイクロサービス クラスターでは、外部アクセスが頻繁に通過することがわかります。クラスター内の複数のマイクロサービスを介して呼び出しを行う場合、グリッドによってもたらされる遅延オーバーヘッドは非常に大きく、サービス グリッドの使用が増えるにつれて、プロキシ アーキテクチャによって生じる追加の遅延オーバーヘッドがサービス グリッドが直面する重要な問題になっています。

写真

この目的のために、HTTP サービス L7 ロード バランシングのシナリオをテストし、グリッド データ プレーンの通信のパフォーマンス管理を行いました。時間のかかる割合は次のとおりです。

写真

グリッド トラフィックの詳細な分析から、マイクロサービスの相互運用性は 1 つのリンク確立から 3 つのリンク確立に、2 つの入口および出口プロトコル スタックから 6 つの入口および出口プロトコル スタックに変化し、時間のかかる作業は主に複数のデータ コピー、リンク構築に集中しています。通信、コンテキスト スケジューリングのスイッチングなど、トラフィック管理の実際のオーバーヘッドの割合は大きくありません。

次に問題は、アプリケーションに対するグリッドの透過的なガバナンスを維持しながら、グリッドのレイテンシ オーバーヘッドを削減するかどうかです。

高性能サービス グリッド ガバナンス フレームワーク Kmesh

上記のパフォーマンス分析に基づいて、グリッド データ サーフェスのパフォーマンスを 2 段階で最適化しました。

Kmesh1.0: ソックマップに基づいてグリッド データ サーフェスを高速化

Sockmap は Linux 4.14 で導入された ebpf 機能で、複雑なカーネル プロトコル スタックを経由せずにノード内のソケット間のデータ フローのリダイレクトを実現し、リンク上のソケット間のデータ転送パフォーマンスを最適化します。

サービス グリッド シナリオでは、ポッド内のビジネス コンテナとローカル プロキシ コンポーネントの間で完全なカーネル プロトコル スタックがデフォルトで使用されます。このオーバーヘッドは、次の図に示すように、ソックマップを通じて最適化できます。

写真

ソックマップ アクセラレーションの基本的な手順は次のとおりです。

  • リンク構築プロセス中に ebpf プログラム (ebpf prog type: BPF_PROG_TYPE_SOCK_OPS) をマウントして、すべての TCP リンク構築アクションをインターセプトします。

    通信相手の正側と負側のソケット情報をソックマップテーブルに格納します。

    • BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB ステータスはクライアント側のソックマップ レコードを追加します。
    • BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB ステータスはサーバー側のソックマップ レコードを追加します。
  • ebpf プログラム (ebpf prog タイプ: BPF_PROG_TYPE_SK_MSG) を sendmsg プロセスにマウントして、メッセージ送信アクションをインターセプトします。

    • 現在のソケット情報に従ってソックマップ テーブルを検索し、相手側のソケット情報を関連付けて見つけ、トラフィックを相手側ソケットの受信キューに直接リダイレクトします。

ソックマップ アクセラレーション サービス グリッド データ サーフェスに基づくと、60 の長いリンク シナリオの実測では、サービス アクセスの平均遅延が元のグリッドと比較して 10% ~ 15% 削減されました。

写真

Sockmap は現在、サービス グリッドのデータ サーフェスを最適化するための比較的一般的なソリューションですが、効果の観点から見ると、通信遅延を 15% 削減しても、グリッド遅延のパフォーマンスが悪いという問題は実際には解決されません。

Kmesh2.0: プログラマブル カーネルに基づき、トラフィック管理を OS にシンク

上記のパフォーマンス分析によると、グリッドによって導入される追加のオーバーヘッドのうち、トラフィック管理の実際のオーバーヘッドはそれほど高くなく、ほとんどの時間はトラフィックをプロキシ コンポーネントに送信するのに無駄に費やされていることがわかります。その場合、トラフィック ガバナンスは、このプロキシ コンポーネントを通過して、トラフィックの送受信のパスをたどることはできませんか? ネットワーク通信は当然カーネルプロトコルスタックを経由する必要がありますが、プロトコルスタックにトラフィックを管理する機能があれば、この問題は解決できるでしょうか?

Kmeshは当社が提案した高パフォーマンスなサービスガバナンスフレームワークです プログラマブルカーネルをベースにトラフィックガバナンスをOSに落とし込みました グリッドデータプレーンがプロキシコンポーネントを経由しなくなりました サービスの相互運用性が3ホップから1ホップに変化し、ガバナンスも作業は途中で本当に完了します。; マイクロサービス相互通信のトラフィック パスは次のとおりです。

写真

Kmesh のソフトウェア アーキテクチャ:

写真

Kmesh の主なコンポーネントは次のとおりです。

  • kmesh-controller: kmesh 管理プログラム。Kmesh ライフサイクル管理、XDS プロトコルのドッキング、観測の運用と保守、その他の機能を担当します。
  • kmesh-api: kmesh によって外部に提供される API インターフェイス層。主に、xds 変換後のオーケストレーション API、観測運用および保守チャネルなどが含まれます。
  • kmesh-runtime: L3 ~ L7 トラフィック オーケストレーションをサポートするカーネルに実装されたランタイム。
  • kmesh-orchestration: ルーティング、グレースケール、負荷分散など、ebpf に基づいて L3 ~ L7 トラフィック オーケストレーションを実装します。
  • kmesh-probe: エンドツーエンドの観察機能を提供する、観察操作およびメンテナンス プローブ。

Istio グリッド環境をデプロイし、異なるグリッド データ プレーン ソフトウェア (Envoy/Kmesh) を使用して、http サービス L7 ロード バランシングのシナリオにおけるグリッド データ プレーン (テスト ツール: fortio) のパフォーマンスの比較テストを実施しました。

写真

Kmesh に基づくグリッド内のサービス相互運用パフォーマンスは、Istio ネイティブ データ サーフェス (Envoy) のサービス相互運用パフォーマンスの 5 倍であることがわかります。同時に、非環境下で k8s に基づくサービス相互運用パフォーマンスもテストしました。 -grid は、Kmesh のパフォーマンス データとほぼ同等であり、Kmesh データ プレーンの遅延パフォーマンスをさらに証明します。(テスト シナリオは実験室環境での L7 負荷分散です。実際のガバナンス シナリオでのパフォーマンス効果はそれほど理想的ではありません。事前評価では Istio より 2 ~ 3 倍優れています)

要約する

サービス メッシュは、クラウド ネイティブの次世代テクノロジーとして、アプリケーションに透過的なサービス ガバナンスを提供すると同時に、そのプロキシ アーキテクチャに起因する追加の遅延オーバーヘッドを導入し、これがグリッド アプリケーションの推進の鍵となっています。 OS、Kmesh は、プログラミング カーネルのサービス ガバナンス フレームワークを提案し、トラフィック管理機能を OS にシンクすることにより、グリッド データ プレーンのパフォーマンスを大幅に向上させ、グリッド データ プレーンの開発に新しい考え方を提供します。

コミュニティの新しいプロジェクトとして、Kmesh はまだ初期段階にあり、今後も L4/L7 トラフィック管理機能の改善を続けていく予定です。詳細については、プロジェクトのホームページを確認してください: https://gitee.com/openeuler /Kメッシュ

おすすめ

転載: blog.csdn.net/openEuler_/article/details/131783531