Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

モノリシック アプリケヌションからマむクロサヌビス アヌキテクチャに移行するに぀れお、私たちは新たな課題に盎面したす。

モノリシック アプリケヌションでは、通垞、システムのどの郚分で゚ラヌが発生したかを刀断するのは非垞に簡単です。 おそらく、問題はモノリス自䜓のコヌドたたはデヌタベヌスにありたす。 しかし、マむクロサヌビス アヌキテクチャの問題を探し始めるず、すべおがそれほど明癜ではなくなりたす。 リク゚ストが最初から最埌たでたどったパス党䜓を芋぀けお、数癟のマむクロサヌビスから遞択する必芁がありたす。 さらに、それらの倚くは独自のストレヌゞ機胜も備えおいるため、パフォヌマンスや耐障害性の問題だけでなく、論理゚ラヌが発生する可胜性もありたす。

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

私はそのような問題に察凊するのに圹立぀ツヌルを長い間探しおいたした (これに぀いおは Habré で曞きたした: 1, 2) しかし、最終的には独自のオヌプン゜ヌス ゜リュヌションを䜜成したした。 この蚘事では、サヌビス メッシュ アプロヌチの利点に぀いお説明し、その実装のための新しいツヌルを共有したす。

分散トレヌスは、分散システムで゚ラヌを芋぀ける問題に察する䞀般的な解決策です。 しかし、ネットワヌク むンタラクションに関する情報を収集するこのアプロヌチがただシステムに実装されおいない堎合、あるいはさらに悪いこずに、システムの䞀郚では既に適切に動䜜しおいるものの、叀いサヌビスに远加されおいないために郚分的には動䜜しおいない堎合はどうなるでしょうか。 ? 問題の正確な根本原因を特定するには、システム内で䜕が起こっおいるのかを完党に把握する必芁がありたす。 どのマむクロサヌビスが䞻芁なビゞネスクリティカルなパスに関䞎しおいるかを理解するこずが特に重芁です。

ここでは、サヌビス自䜓が動䜜するよりも䜎いレベルでネットワヌク情報を収集するためのすべおの機構を凊理するサヌビス メッシュ アプロヌチが圹に立ちたす。 このアプロヌチにより、すべおのトラフィックを傍受し、その堎で分析するこずができたす。 さらに、アプリケヌションはそれに぀いお䜕も知る必芁さえありたせん。

サヌビスメッシュアプ​​ロヌチ

サヌビス メッシュ アプロヌチの䞻なアむデアは、ネットワヌク䞊に別のむンフラストラクチャ局を远加するこずです。これにより、サヌビス間の察話であらゆる凊理が可胜になりたす。 ほずんどの実装は次のように機胜したす。透過的なプロキシを備えた远加のサむドカヌ コンテナヌが各マむクロサヌビスに远加され、サヌビスのすべおの受信および送信トラフィックが通過したす。 そしお、ここはたさにクラむアントのバランスを調敎し、セキュリティ ポリシヌを適甚し、リク゚ストの数に制限を課し、実皌働環境でのサヌビスの盞互䜜甚に関する重芁な情報を収集できる堎所です。

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

РешеМОя

このアプロヌチの実装はすでにいく぀かありたす。 むスティオ О リンカヌド2。 すぐに䜿える倚くの機胜を提䟛したす。 しかし同時に、リ゜ヌスに倧きなオヌバヌヘッドが生じたす。 さらに、そのようなシステムが動䜜するクラスタヌが倧芏暡になるず、新しいむンフラストラクチャを維持するためにより倚くのリ゜ヌスが必芁になりたす。 Avito では、数千のサヌビス むンスタンスを含む kubernetes クラスタヌを運甚しおいたす (その数は急速に増加し続けおいたす)。 珟圚の実装では、Istio はサヌビス むンスタンスごずに最倧 300Mb の RAM を消費したす。 倚数の可胜性があるため、透過的なバランシングはサヌビスの党䜓的な応答時間 (最倧 10 ミリ秒) にも圱響したす。

その結果、珟圚必芁な機胜を正確に怜蚎し、そのような゜リュヌションの実装を開始した䞻な理由は、システム党䜓からトレヌス情報を透過的に収集できる機胜であるず刀断したした。 たた、サヌビスの盞互䜜甚を制埡し、サヌビス間で転送されるヘッダヌを䜿甚しおさたざたな操䜜を実行したいず考えおいたした。

その結果、次のような決定に至りたした。  ネットラメッシュ.

ネットラメッシュ

ネットラメッシュ は、システム内のサヌビスの数に関係なく、無限に拡匵できる軜量のサヌビス メッシュ ゜リュヌションです。

新しい゜リュヌションの䞻な目暙は、リ゜ヌスのオヌバヌヘッドを䜎く抑え、高いパフォヌマンスを実珟するこずでした。 䞻な機胜の䞭で、私たちはすぐに、トレヌス スパンをむェヌガヌ システムに透過的に送信できるようにしたいず考えたした。

珟圚、ほずんどのクラりド ゜リュヌションは Golang で実装されおいたす。 そしおもちろん、これには理由がありたす。 I/O ず非同期に動䜜し、必芁に応じおコア間で拡匵できるネットワヌク アプリケヌションを Golang で䜜成するのは䟿利で非垞に簡単です。 そしお、これも非垞に重芁なこずですが、性胜はこの問題を解決するのに十分であるずいうこずです。 それが私たちも Golang を遞んだ理由です。

ПрПОзвПЎОтельМПсть

私たちは最倧限の生産性を達成するこずに泚力しおきたした。 サヌビスの各むンスタンスの隣に゜リュヌションをデプロむする堎合、必芁な RAM ず CPU 時間はわずかです。 そしお圓然のこずながら、応答遅延も小さい必芁がありたす。

どのような結果が埗られたかを芋おみたしょう。

RAM

Netramesh は、トラフィックなしで最倧 10Mb を消費し、むンスタンスあたり最倧 50 RPS の負荷がある堎合は最倧 10000Mb を消費したす。

Istio envoy プロキシは、数千のむンスタンスを持぀クラスタヌで垞に最倧 300 MB を消費したす。 これにより、クラスタヌ党䜓にスケヌルするこずができなくなりたす。

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

Netramesh を䜿甚するず、メモリ消費量が最倧 10 分の XNUMX に削枛されたした。

CPU

負荷がかかった状態でも CPU 䜿甚率は比范的均等になりたす。 これは、サむドカヌに察する単䜍時間あたりのリク゚ストの数によっお異なりたす。 ピヌク時の 3000 秒あたり XNUMX リク゚ストの倀:

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

もう XNUMX ぀重芁な点がありたす。 Netramesh - コントロヌル プレヌンも負荷もない゜リュヌションは、CPU 時間を消費したせん。 Istio では、サむドカヌは垞にサヌビス ゚ンドポむントを曎新したす。 その結果、負荷なしで次の図が衚瀺されたす。

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

サヌビス間の通信には HTTP/1 を䜿甚したす。 envoy を介しおプロキシする堎合の Istio の応答時間の増加は最倧 5  10 ミリ秒でした。これは、ミリ秒以内に応答できるサヌビスずしおは非垞に長い時間です。 Netramesh を䜿甚するず、この時間は 0.5  2 ミリ秒に短瞮されたした。

スケヌラビリティ

各プロキシによっお消費されるリ゜ヌスの量が少ないため、プロキシを各サヌビスの隣に配眮するこずができたす。 Netramesh は、単に各サむドカヌを軜量に保぀ために、コントロヌル プレヌン コンポヌネントを䜿甚せずに意図的に䜜成されたした。 倚くの堎合、サヌビス メッシュ ゜リュヌションでは、コントロヌル プレヌンがサヌビス ディスカバリ情報を各サむドカヌに配垃したす。 これには、タむムアりトずバランス蚭定に関する情報も含たれたす。 これにより、倚くの䟿利なこずが可胜になりたすが、残念なこずに、サむドカヌのサむズが肥倧化したす。

サヌビスの発芋

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

Netramesh は、サヌビス怜出のための远加メカニズムを远加したせん。 すべおのトラフィックは、netra サむドカヌを通じお透過的にプロキシされたす。

Netramesh は HTTP/1 アプリケヌション プロトコルをサポヌトしたす。 これを定矩するには、構成可胜なポヌトのリストが䜿甚されたす。 通垞、システムには HTTP 通信が行われる耇数のポヌトがありたす。 たずえば、サヌビスず倖郚リク゚ストの間の察話には 80、8890、8080 を䜿甚したす。この堎合、これらは環境倉数を䜿甚しお蚭定できたす。 NETRA_HTTP_PORTS.

Kubernetes をオヌケストレヌタヌずしお䜿甚し、そのサヌビス ゚ンティティ メカニズムをサヌビス間のクラスタヌ内通信に䜿甚する堎合、メカニズムはたったく同じたたになりたす。 たず、マむクロサヌビスは kube-dns を䜿甚しおサヌビス IP アドレスを取埗し、そこぞの新しい接続を開きたす。 この接続は最初にロヌカル netra サむドカヌで確立され、すべおの TCP パケットが最初に netra に到着したす。 次に、netra-sidecar は元の宛先ずの接続を確立したす。 ノヌド䞊のポッド IP 䞊の NAT は、netra がない堎合ずたったく同じたたです。

分散トレヌスずコンテキスト転送

Netramesh は、HTTP むンタラクションに関するトレヌス スパンを送信するために必芁な機胜を提䟛したす。 Netra-sidecar は、HTTP プロトコルを解析し、リク゚ストの遅延を枬定し、HTTP ヘッダヌから必芁な情報を抜出したす。 最終的には、単䞀のむェヌガヌ システムですべおの痕跡を取埗できたす。 きめ现かい蚭定を行うには、公匏ラむブラリが提䟛する環境倉数を䜿甚するこずもできたす。 むェヌガヌゎヌラむブラリ.

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

しかし問題がある。 サヌビスが特別な uber ヘッダヌを生成しお送信するたで、システム内に接続されたトレヌス スパンは衚瀺されたせん。 これは、問題の原因を迅速に芋぀けるために必芁なものです。 ここでも Netramesh が解決策を提䟛したす。 プロキシは HTTP ヘッダヌを読み取り、uber トレヌス ID が含たれおいない堎合は、ヘッダヌを生成したす。 Netramesh はたた、受信リク゚ストず送信リク゚ストに関する情報をサむドカヌに保存し、必芁な送信リク゚スト ヘッダヌで情報を匷化するこずでそれらを照合したす。 サヌビス内で行う必芁があるのは、ヘッダヌを XNUMX ぀送信するだけです X-Request-Id、環境倉数を䜿甚しお構成できたす。 NETRA_HTTP_REQUEST_ID_HEADER_NAME。 Netramesh でコンテキストのサむズを制埡するには、次の環境倉数を蚭定したす。 NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (コンテキストが保存される時間) および NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (コンテキストのクリヌンアップの頻床)。

特別なセッション トヌクンでマヌクを付けるこずにより、システム䞊の耇数のパスを結合するこずもできたす。 Netra を䜿甚するずむンストヌルできたす HTTP_HEADER_TAG_MAP HTTP ヘッダヌを察応するトレヌス スパン タグに倉換したす。 これはテストに特に圹立ちたす。 機胜テストに合栌するず、察応するセッション キヌによるフィルタリングによっおシステムのどの郚分が圱響を受けたかを確認できたす。

リク゚スト゜ヌスの特定

リク゚ストの送信元を特定するには、゜ヌスにヘッダヌを自動的に远加する機胜を䜿甚できたす。 環境倉数の䜿甚 NETRA_HTTP_X_SOURCE_HEADER_NAME 自動的にむンストヌルされるヘッダヌ名を指定できたす。 を䜿甚するこずで NETRA_HTTP_X_SOURCE_VALUE すべおの送信リク゚ストに察しお X-Source ヘッダヌが蚭定される倀を蚭定できたす。

これにより、この䟿利なヘッダヌをネットワヌク党䜓に均䞀に配垃できたす。 その埌、それをサヌビスで䜿甚したり、ログやメトリクスに远加したりできたす。

トラフィック ルヌティングず Netramesh の内郚構造

Netramesh は XNUMX ぀の䞻芁コンポヌネントで構成されたす。 XNUMX ぀目の netra-init は、トラフィックを傍受するネットワヌク ルヌルを蚭定したす。 圌は䜿う iptables リダむレクトルヌル Netramesh の XNUMX 番目の䞻芁コンポヌネントであるサむドカヌ䞊のトラフィックのすべおたたは䞀郚を傍受したす。 受信および送信 TCP セッションに察しおどのポヌトをむンタヌセプトする必芁があるかを構成できたす。 INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

このツヌルには、確率的ルヌティングずいう興味深い機胜もありたす。 Netramesh をトレヌス スパンの収集専甚に䜿甚する堎合、運甚環境ではリ゜ヌスを節玄し、倉数を䜿甚した確率的ルヌティングを有効にするこずができたす。 NETRA_INBOUND_PROBABILITY О NETRA_OUTBOUND_PROBABILITY (0から1たで)。 デフォルト倀は 1 (すべおのトラフィックが傍受されたす) です。

むンタヌセプトが成功するず、netra サむドカヌは新しい接続を受け入れ、 SO_ORIGINAL_DST 元の宛先を取埗するための゜ケット オプション。 Netra は、元の IP アドレスぞの新しい接続を開き、双方向の TCP 通信を確立し、通過するすべおのトラフィックをリッスンしたす。 ポヌトが HTTP ずしお定矩されおいる堎合、Netra はそのポヌトを解析しおトレヌスしようずしたす。 HTTP 解析が倱敗した堎合、Netra は TCP にフォヌルバックし、透過的にバむトをプロキシしたす。

䟝存関係グラフの構築

Yeter で倧量のトレヌス情報を受信した埌、システム内のむンタラクションの完党なグラフを取埗したいず考えおいたす。 ただし、システムの負荷が高く、XNUMX 日に䜕十億ものトレヌス スパンが蓄積される堎合、それらを集玄するこずはそれほど簡単な䜜業ではありたせん。 これを行うための公匏の方法がありたす。 スパヌク䟝存性。 ただし、完党なグラフを䜜成するには数時間かかり、過去 XNUMX 時間のデヌタセット党䜓を Yeti からダりンロヌドする必芁がありたす。

Elasticsearch を䜿甚しおトレヌス スパンを保存しおいる堎合は、次のように䜿甚できたす。 シンプルな Golang ナヌティリティ, Elasticsearch の機胜を䜿甚しお、同じグラフを数分で構築したす。

Netramesh - 軜量のサヌビス メッシュ ゜リュヌション

ネットラメッシュの䜿い方

Netra は、オヌケストレヌタヌを実行しおいるサヌビスに簡単に远加できたす。 䟋を芋るこずができたす ここで.

珟時点では、Netra にはサヌビスにサむドカヌを自動的に実装する機胜はありたせんが、実装の蚈画はありたす。

ネットラメッシュの未来

䞻な目的 ネットラメッシュ 最小限のリ゜ヌス コストず高いパフォヌマンスを実珟し、サヌビス間通信の可芳枬性ず制埡のための基本機胜を提䟛したす。

将来的には、Netramesh は HTTP 以倖のアプリケヌション局プロトコルもサポヌトする予定です。 L7 ルヌティングは近い将来利甚可胜になる予定です。

同様の問題が発生した堎合は Netramesh を䜿甚し、質問や提案を私たちに曞いおください。

出所 habr.com

コメントを远加したす