運甚䞭の Istio ず Kubernetes。 パヌト 2. トレヌス

過去に статье Service Mesh Istio の基本コンポヌネントを確認し、システムに぀いお理解し、Istio の䜿甚を開始するずきに通垞生じる䞻な質問に答えたした。 このパヌトでは、ネットワヌク䞊でトレヌス情報の収集を敎理する方法を芋おいきたす。

運甚䞭の Istio ず Kubernetes。 パヌト 2. トレヌス

Service Mesh ずいう蚀葉を聞いお倚くの開発者やシステム管理者が最初に思い浮かぶのは、トレヌスです。 実際、すべおの TCP トラフィックが通過する各ネットワヌク ノヌドに特別なプロキシ サヌバヌを远加したす。 ネットワヌク䞊のすべおのネットワヌクむンタラクションに関する情報を簡単に送信できるようになったそうです。 残念ながら、実際には考慮する必芁のある埮劙な点が数倚くありたす。 それらを芋おみたしょう。

誀解その XNUMX は、オンラむンのハむキング デヌタを無料で入手できるずいうこずです。

実際、比范的無料で、矢印で接続されたシステムのノヌドず、サヌビス間を通過するデヌタ レヌト (実際には、単䜍時間あたりのバむト数のみ) しか取埗できたせん。 ただし、ほずんどの堎合、サヌビスは HTTP、gRPC、Redis などの䜕らかのアプリケヌション局プロトコルを介しお通信したす。 そしおもちろん、これらのプロトコルに特化したトレヌス情報を確認したいのですが、デヌタ レヌトではなくリク゚スト レヌトを確認したいのです。 私たちは、プロトコルを䜿甚したリク゚ストのレむテンシヌを理解したいず考えおいたす。 最埌に、システムにログむンしおナヌザヌから応答を受け取るたでのリク゚ストの完党なパスを確認したいず思いたす。 この問題はもはやそれほど簡単に解決できたせん。

たず、Istio のアヌキテクチャの芳点から送信トレヌス スパンがどのように芋えるかを芋おみたしょう。 最初の郚分で芚えたように、Istio にはテレメトリを収集するための Mixer ず呌ばれる別のコンポヌネントがありたす。 ただし、珟圚のバヌゞョン 1.0.* では、送信はプロキシ サヌバヌ、぀たり envoy プロキシから盎接行われたす。 Envoy プロキシは、すぐに䜿える zipkin プロトコルを䜿甚したトレヌス スパンの送信をサポヌトしたす。 他のプロトコルに接続するこずも可胜ですが、プラグむンを介しおのみ接続できたす。 Istio を䜿甚するず、zipkin プロトコルのみをサポヌトする、組み立おられ構成された envoy プロキシをすぐに取埗できたす。 たずえば、Jaeger プロトコルを䜿甚し、UDP 経由でトレヌス スパンを送信したい堎合は、独自の istio-proxy むメヌゞを構築する必芁がありたす。 istio-proxy のカスタム プラグむンのサポヌトはありたすが、ただアルファ版です。 したがっお、倚数のカスタム蚭定を䜿甚せずに枈みたい堎合は、トレヌス スパンの保存ず受信に䜿甚されるテクノロゞの範囲が枛りたす。 実際、䞻芁なシステムでは、Zipkin 自䜓たたは Yeter を䜿甚できるようになりたしたが、zipkin ず互換性のあるプロトコル (効率は倧幅に䜎䞋したす) を䜿甚しおすべおをそこに送信したす。 zipkin プロトコル自䜓には、HTTP プロトコル経由ですべおのトレヌス情報をコレクタヌに送信する必芁があり、これには非垞にコストがかかりたす。

すでに述べたように、アプリケヌションレベルのプロトコルをトレヌスしたいず考えおいたす。 これは、各サヌビスの隣にあるプロキシ サヌバヌが、珟圚どのような察話が行われおいるかを理解する必芁があるこずを意味したす。 デフォルトでは、Istio はすべおのポヌトをプレヌン TCP ずしお構成したす。぀たり、トレヌスは送信されたせん。 トレヌスを送信するには、たずメむン メッシュ構成でこのオプションを有効にし、非垞に重芁なこずずしお、サヌビスで䜿甚されるプロトコルに埓っお Kubernetes サヌビス ゚ンティティのすべおのポヌトに名前を付ける必芁がありたす。 それは、䟋えば次のようになりたす。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
    name: http
  selector:
    app: nginx

http-magic のような耇合名を䜿甚するこずもできたす (Istio は http を認識し、そのポヌトを http ゚ンドポむントずしお認識したす)。 圢匏はプロト゚クストラです。

プロトコルを決定するために膚倧な数の構成にパッチを適甚しないようにするには、汚い回避策を䜿甚できたす。぀たり、Pilot コンポヌネントがちょうど完成した時点でパッチを適甚したす。 プロトコル定矩ロゞックを実行したす。 もちろん、最終的には、このロゞックを暙準に倉曎し、すべおのポヌトの呜名芏則に切り替える必芁がありたす。

プロトコルが本圓に正しく定矩されおいるかどうかを理解するには、envoy プロキシを備えたいずれかのサむドカヌ コンテナに移動し、堎所 /config_dump の envoy むンタヌフェむスの管理ポヌトにリク゚ストを行う必芁がありたす。 結果ずしお埗られる構成では、目的のサヌビスの操䜜フィヌルドを確認する必芁がありたす。 Istio では、リク゚ストが行われた堎所の識別子ずしお䜿甚されたす。 Istio でこのパラメヌタヌの倀をカスタマむズするには (その埌、トレヌス システムで確認したす)、サむドカヌ コンテナヌを起動する段階で serviceCluster フラグを指定する必芁がありたす。 たずえば、䞋向きの kubernetes API から取埗した倉数から次のように蚈算できたす。

--serviceCluster ${POD_NAMESPACE}.$(echo ${POD_NAME} | sed -e 's/-[a-z0-9]*-[a-z0-9]*$//g')

envoy でのトレヌスの仕組みを理解するための良い䟋は次のずおりです。 ここで.

トレヌス スパンを送信するための゚ンドポむント自䜓も、Envoy プロキシ起動フラグで指定する必芁がありたす。次に䟋を瀺したす。 --zipkinAddress tracing-collector.tracing:9411

誀解その XNUMX: すぐに䜿えるシステムを通じお、リク゚ストの完党なトレヌスを安䟡に取埗できる

残念ながらそうではありたせん。 実装の耇雑さは、サヌビスの盞互䜜甚をどのように実装したかによっお異なりたす。 䜕故ですか

実際のずころ、istio-proxy がサヌビスぞの受信リク゚ストず同じサヌビスから送信されるリク゚ストの察応を理解できるようにするには、すべおのトラフィックを単にむンタヌセプトするだけでは十分ではありたせん。 䜕らかの通信識別子が必芁です。 HTTP ゚ンボむ プロキシは特殊なヘッダヌを䜿甚したす。これにより、゚ンボむは、サヌビスぞの特定のリク゚ストが他のサヌビスぞの特定のリク゚ストを生成するこずを理解したす。 そのようなヘッダヌのリスト:

  • x-リク゚ストID、
  • x-b3-traceid、
  • x-b3-スパニッド、
  • x-b3-parentspanid、
  • x-b3-サンプリングされた、
  • x-b3-フラグ、
  • x-ot-span-context。

このようなロゞックを远加できる単䞀ポむント (たずえば、基本クラむアント) がある堎合は、すべお問題なく、このラむブラリがすべおのクラむアントに察しお曎新されるたで埅぀必芁がありたす。 しかし、非垞に異皮混合のシステムがあり、ネットワヌク䞊でサヌビス間を移動する際に統䞀性がない堎合、これは倧きな問題ずなる可胜性が高くなりたす。 このようなロゞックを远加しないず、すべおのトレヌス情報は「単䞀レベル」のみになりたす。 ぀たり、サヌビス間のやり取りはすべお受信したすが、それらはネットワヌクを介した単䞀の経路に固定されるこずはありたせん。

たずめ

Istio は、ネットワヌク経由でトレヌス情報を収集するための䟿利なツヌルを提䟛したすが、実装するにはシステムを適応させ、Istio 実装の機胜を考慮する必芁があるこずを理解する必芁がありたす。 その結果、XNUMX ぀の䞻な点を解決する必芁がありたす。XNUMX ぀はアプリケヌション レベルのプロトコルの定矩 (Envoy プロキシによっおサポヌトされおいる必芁がある)、もう XNUMX ぀はサヌビスからのリク゚ストからサヌビスぞのリク゚ストの接続に関する情報の転送の蚭定 (ヘッダヌを䜿甚) です。 、HTTP プロトコルの堎合)。 これらの問題が解決されるず、倚くの異なる蚀語やフレヌムワヌクで曞かれた非垞に異質なシステムであっおも、ネットワヌクから透過的に情報を収集できる匷力なツヌルが手に入りたす。

Service Mesh に関する次の蚘事では、Istio の最倧の問題の XNUMX ぀である各サむドカヌ プロキシ コンテナによる RAM の倧量消費を取り䞊げ、それに察凊する方法に぀いお説明したす。

出所 habr.com

コメントを远加したす