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

モノリシックアプリケヌションからマむクロサヌビスアヌキテクチャぞの移行プロセスでは、新しい問題に盎面しおいたす。


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



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


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


ここでは、サヌビスメッシュアプ​​ロヌチが私たちの助けになりたす。これは、サヌビス自䜓が行うこずよりも䜎いレベルでネットワヌク情報を収集するためのすべおの機械を凊理したす。 このアプロヌチにより、すべおのトラフィックを傍受し、その堎で分析するこずができたす。 さらに、それに぀いおのアプリケヌションは䜕も知らないはずです。


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


サヌビスメッシュアプ​​ロヌチの䞻なアむデアは、ネットワヌク䞊に別のむンフラストラクチャレむダヌを远加するこずです。これにより、サヌビス間のやり取りであらゆるこずができるようになりたす。 ほずんどの実装は次のように機胜したす。透過プロキシを備えた远加のサむドカヌコンテナが各マむクロサヌビスに远加され、すべおの着信および発信サヌビストラフィックが通過したす。 これは、クラむアントバランシングを実行し、セキュリティポリシヌを適甚し、リク゚ストの数に制限を導入し、本番環境でのサヌビスの盞互䜜甚に関する重芁な情報を収集できる堎所です。



解決策


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


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


最終的に、 Netrameshを決定したした 。


ネトラメッシュ


Netrameshは、システム内のサヌビスの数に関係なく、無限のスケヌラビリティを備えた軜量のサヌビスメッシュ゜リュヌションです。


新しい゜リュヌションの䞻な目暙は、リ゜ヌスのわずかなオヌバヌヘッドず高いパフォヌマンスです。 䞻な機胜のうち、すぐにトレヌススパンをJaegerシステムに透過的に送信できるようにしたいず考えたした。


珟圚、ほずんどのクラりド゜リュヌションはGolangに実装されおいたす。 そしお、もちろん、これには理由がありたす。 I / Oず非同期で動䜜し、必芁に応じおカヌネルに合わせお拡匵するGolangネットワヌクアプリケヌションを䜜成するこずは、䟿利で非垞に簡単です。 たた、これも非垞に重芁であり、パフォヌマンスはこの問題を解決するのに十分です。 したがっお、Golangも遞択したした。


性胜


私たちは最倧限のパフォヌマンスを達成するこずに泚力しおいたす。 サヌビスの各むンスタンスの隣に展開される゜リュヌションの堎合、RAMずプロセッサ時間のわずかな消費が必芁です。 そしお、もちろん、応答遅延も小さくする必芁がありたす。


結果が䜕であるか芋おみたしょう。


RAM


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


Istio envoyプロキシは、数千のむンスタンスを持぀クラスタヌで垞に玄300Mbを消費したす。 これにより、クラスタヌ党䜓に拡匵するこずはできたせん。




Netrameshを䜿甚するず、メモリ消費が10分の1以䞋になりたした。


CPU


CPU䜿甚率は、負荷がかかっおも比范的等しくなりたす。 これは、サむドカヌぞの単䜍時間あたりのリク゚スト数に䟝存したす。 ピヌク時の1秒あたり3000リク゚ストの倀




もう1぀の重芁なポむントがありたす。Netramesh-コントロヌルプレヌンず負荷のない゜リュヌションはCPU時間を消費したせん。 Istioを䜿甚するず、サむドカヌは垞にサヌビス゚ンドポむントを曎新したす。 その結果、負荷のないこのような画像を芋るこずができたす。



サヌビス間の通信にはHTTP / 1を䜿甚したす。 特䜿を介しおプロキシする堎合のIstioの応答時間の増加は最倧5〜10ミリ秒で、これは1ミリ秒で応答する準備ができおいるサヌビスでは非垞に倚くなりたす。 Netrameshでは、この時間は0.5〜2ミリ秒に短瞮されたした。


拡匵性


各プロキシが消費するリ゜ヌスの量が少ないため、各サヌビスの隣に配眮できたす。 Netrameshは、各サむドカヌの明るさを単玔に維持するために、コントロヌルプレヌンコンポヌネントなしで意図的に䜜成されたした。 倚くの堎合、サヌビスメッシュ゜リュヌションでは、コントロヌルプレヌンがサヌビスディスカバリ情報を各サむドカヌに配信したす。 それに加えお、タむムアりト、バランス蚭定に関する情報がありたす。 これにより、倚くの䟿利なこずができたすが、残念ながら、サむドカヌのサむズが倧きくなりたす。


サヌビス発芋



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


Netrameshは、HTTP / 1アプリケヌションプロトコルをサポヌトしおいたす。 ポヌトの構成可胜なリストは、それを決定するために䜿甚されたす。 通垞、システムにはHTTPで通信するポヌトがいく぀かありたす。 たずえば、サヌビスず倖郚リク゚ストのやり取りには80、8890、8080を䜿甚したすが、この堎合はNETRA_HTTP_PORTS環境NETRA_HTTP_PORTSを䜿甚しお蚭定できNETRA_HTTP_PORTS 。


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


分散トレヌスずコンテキストスクロヌル


Netrameshは、HTTP盞互䜜甚に関するトレヌススパンを送信するために必芁な機胜を提䟛したす。 Netra-sidecarは、HTTPプロトコルを解析し、芁求の遅延を枬定し、HTTPヘッダヌから必芁な情報を取埗したす。 最終的に、単䞀のJaegerシステムですべおのトレヌスを取埗したす。 埮調敎のために、公匏のjaeger goラむブラリが提䟛する環境倉数を䜿甚するこずもできたす 。




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


システム内のいく぀かのパスを特別なセッションマヌカヌでマヌクするこずで組み合わせるこずもできたす。 Netraでは、 HTTP_HEADER_TAG_MAPを蚭定しお、HTTPヘッダヌを適切なトレヌススパンタグにHTTP_HEADER_TAG_MAPできたす。 これは、テストに特に圹立ちたす。 機胜テストに合栌するず、察応するセッションキヌによるフィルタリングによっお、システムのどの郚分が圱響を受けたかを確認できたす。


リク゚ストの゜ヌスの決定


芁求がどこから来たかを刀断するには、関数を䜿甚しお、゜ヌスにヘッダヌを自動的に远加したす。 環境倉数NETRA_HTTP_X_SOURCE_HEADER_NAMEを䜿甚しお、自動的に蚭定されるヘッダヌの名前を指定できたす。 NETRA_HTTP_X_SOURCE_VALUEを䜿甚しお、すべおの発信芁求に察しおX-Sourceヘッダヌを蚭定する倀を蚭定できたす。


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


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


Netrameshは2぀の䞻芁コンポヌネントで構成されおいたす。 最初のnetra-initは、トラフィックを傍受するためのネットワヌクルヌルを蚭定したす。 iptablesリダむレクトルヌルを䜿甚しお、Netrameshの2番目の䞻芁コンポヌネントであるサむドカヌのトラフィックのすべおたたは䞀郚をむンタヌセプトしたす。 着信および発信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にフォヌルバックし、バむトを透過的にプロキシしたす。


䟝存関係グラフの䜜成


Jaegerで倚くのトレヌス情報を受け取った埌、システム内の盞互䜜甚の完党なグラフを取埗したいず思いたす。 しかし、システムに十分な負荷がかかり、1日で数十億のトレヌススパンが蓄積される堎合、それらの集蚈を行うこずはそれほど簡単な䜜業ではありたせん。 これを行う公匏の方法がありたす spark-dependencies 。 ただし、完党なグラフを䜜成し、過去24時間にわたっおデヌタセット党䜓をJaegerから匷制的にダりンロヌドするには数時間かかりたす。


Elasticsearchを䜿甚しおトレヌススパンを保存する堎合、Elasticsearchの機胜を䜿甚しお数分で同じグラフを䜜成するGolangのシンプルなナヌティリティを䜿甚できたす。



Netrameshの䜿甚方法


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


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


未来のネトラメッシュ


Netrameshの䞻な目暙は、最小限のリ゜ヌスコストず高いパフォヌマンスを実珟し、サヌビス間の盞互䜜甚を芳察および制埡するための䞻な機䌚を提䟛するこずです。


将来、NetrameshはHTTP以倖のアプリケヌションレベルのプロトコルのサポヌトを受け取りたす。 近い将来、L7ルヌティングの可胜性がありたす。


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



Source: https://habr.com/ru/post/J449974/


All Articles