Istioサービスメッシュ、賢いEnvoyプロキシの耳は一体いくつあるのか? 🧐

マイクロサービスアーキテクチャ(MSA)の複雑な通信を管理するためにIstioを使用していますか?もしそうなら、すべてのトラフィックを処理する主要な働き手であるEnvoyプロキシについて聞いたことがあるでしょう。すべてのサービスコンテナの隣にぴったりと寄り添うこの賢いサイドカーは、どのようにしてあらゆる種類のトラフィックを魔法のように処理するのでしょうか?

もしかして、「一つのプロキシだから、当然一つの通路(ポート)ですべてを聞いて処理するのだろう?」と考えましたか?🤔

今日はこのよくある誤解を正し、Envoyプロキシがいかに精巧かつ効率的に通信を管理しているか、その秘密を解き明かしていきます。


一つのプロキシ、一つのリスナー?🤔 誤解と真実

結論から言うと、Envoyプロキシは決して単一の「耳(Listener)」だけを持っているわけではありません。むしろ複数のリスナーを持つのが一般的であり、これがIstioが強力な機能を提供できる主要な秘訣の一つです。

まるで一人の警備員が複数の門(Gate)を同時に監視し、それぞれ異なる目的の訪問者を処理するようなものです。🚪

  • 門 A: 従業員専用(内部サービス間通信)
  • 門 B: 外部訪問者専用(外部からの通信)
  • 門 C: 貨物専用(特別な目的の通信)

Envoyのリスナーもこれに似ています。各リスナーは特定のIPアドレスとポートの組み合わせにバインドされ、定められた目的のトラフィックを専門的に処理する準備をしています。

なぜ複数のリスナーが必要なのか?🚦

Envoyが複数のリスナーを使用する理由は明確です。それは、トラフィックの「種類」と「方向」に応じて、それぞれ異なるポリシーとルールを適用するためです。

1. インバウンドトラフィック (Inbound Traffic) 📥

他のサービスから自分のサービスに入ってくるすべてのトラフィックを指します。

  • 役割: Envoyは、自分のアプリケーションコンテナに入ってくるリクエストを傍受します。
  • リスナー: このトラフィックを処理するための専用リスナーが存在します。例えば、サービスが8080ポートを使用する場合、Envoyはこのポートに来るトラフィックを検知し、mTLS暗号化解除、認可ポリシー(Authorization Policy)の適用、各種メトリック収集といった作業を実行した後、安全にアプリケーションへ転送します。

2. アウトバウンドトラフィック (Outbound Traffic) 📤

自分のサービスが他のサービスを呼び出す際に発生するトラフィックです。

  • 役割: アプリケーションが外部へ送信するすべてのリクエストを傍受します。
  • リスナー: Istioはここで非常に巧妙な方法を使用します。それが「仮想リスナー(Virtual Listener)」です。0.0.0.0:15001ポートで動作するこの特別なリスナーは、すべてのアウトバウンドトラフィックを一旦すべて受け入れます。そして、リクエストの宛先(Host, Port)を確認し、Istioコントロールプレーンから受け取ったサービスディスカバリ情報に基づいて、最も適切なクラスター(対象サービス)へトラフィックをルーティングします。この過程で、mTLS暗号化、再試行(Retry)、サーキットブレーカー(Circuit Breaker)といったルールが適用されます。

3. その他の特殊目的リスナー 📈

インバウンド、アウトバウンド以外にも、Envoyは様々な目的のために追加のリスナーを持ちます。

  • 管理および監視: Prometheusがメトリックを収集できるように/stats/prometheusエンドポイントを公開するリスナー(例: 15090ポート)
  • ヘルスチェック: IstioがEnvoyプロキシ自体の状態を確認できるようにするリスナー

実際のEnvoy設定を見てみよう:「百聞は一見に如かず」💻

言葉だけの説明ではピンとこないですよね?istioctlコマンドを使って、実際のPodに注入されたEnvoyプロキシのリスナー構成を直接確認してみましょう。

以下は、productpageという名前のPodに設定されたEnvoyリスナーリストの一部を簡略化した例です。

# istioctl proxy-config listeners productpage-v1-xxxxxxxxxx-xxxxx -n default

ADDRESS             PORT      TYPE        MATCH                                    DESTINATION
0.0.0.0             15001     TCP         ALL                                      Route: 15001
0.0.0.0             15006     TCP         ALL                                      Route: 15006
0.0.0.0             15090     HTTP        ALL                                      Route: 15090
...
# すべてのアウトバウンドトラフィックを処理する仮想リスナー
127.0.0.1           15001     HTTP        ALL                                      PassthroughCluster
...
# productpageサービス(9080ポート)へのインバウンドトラフィックリスナー
10.4.1.23           9080      HTTP        ALL                                      Route: inbound|9080||
...
# reviewsサービスへのアウトバウンドトラフィックのための仮想インバウンドリスナー
0.0.0.0             9080      HTTP        Transferred from 0.0.0.0:15001           Cluster: outbound|9080||reviews.default.svc.cluster.local

コード解説:

  • 0.0.0.0:15001: 先ほど説明したアウトバウンド仮想リスナーです。すべての送信トラフィックはこのリスナーを介して傍受されます。
  • 10.4.1.23:9080: productpageサービスのPod IPとサービスポート(9080)にバインドされたインバウンドリスナーです。外部からproductpageを呼び出すと、このリスナーがトラフィックを受信します。
  • 0.0.0.0:15090: Prometheusメトリック収集のためのリスナーです。http://:15090/stats/prometheusにアクセスすると、Envoyの様々な統計情報を確認できます。
  • 0.0.0.0:9080: 「Transferred from 0.0.0.0:15001」という説明が見えますか?これは、reviewsサービス(同様に9080ポートを使用)への送信トラフィックが15001仮想リスナーによって捕捉された後、実際の宛先であるreviewsサービスへルーティングされるために内部的に使用されるリスナーチェーンの一部です。

結論:多才なトラフィック指揮者、Envoy 🚀

これで、Envoyプロキシが単一の耳ではなく、複数の専門化された耳を持つ精巧なトラフィック指揮者であるという事実を理解していただけたでしょう。

  • インバウンドリスナーは、私たちの家を守る頼もしい門番のように、入ってくるトラフィックを検査し保護します。
  • アウトバウンド仮想リスナーは、すべての外部リクエストを一旦受け入れ、賢く道を見つける万能案内人の役割を果たします。
  • その他の特殊目的リスナーは、プロキシの健全性とパフォーマンスを継続的に報告します。

このような多重リスナーアーキテクチャのおかげで、Istioはサービス間の通信を透過的に傍受し、mTLS、トラフィック制御、豊富な可観測性(Observability)といった強力な機能をコード修正なしで提供できるのです。

次にIstio環境でネットワーク問題をデバッグしたり、トラフィックフローを分析したりする際には、Envoyが複数の耳を開いて熱心に働いているという事実を思い出してください!


Comments

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です