Netflixはこの投稿で、EnvoyコミュニティとKinvolkと協力して、Lyft が開発したオープンソース プロキシであるEnvoyの新機能を実装した理由について説明している。On-Demand Cluster Discoveryと呼ばれるこの新機能は、Netflixが設定不要のサービスメッシュを実装するのに役立った。
プロセス間通信(IPC)は、Netflixにとって極めて重要なものだ。同社は2010年にすべてのインフラをクラウド(AWS)に移行して以来、クラウドネイティブ環境のためのツールを必要としてきた。その中には、市販のものもあれば、社内で開発されたものもある。IPCを簡単に管理するために、Netflixはサービス・ディスカバリー用のEurekaとプロセス間通信用のRibbonを開発した。Eurekaの主な目的は、宛先サービス名を仮想IP(VIP)で抽象化し、必要に応じてセキュア仮想IP(VIP)で安全な通信を確保することだ。接続先サービス名と通信の種類(セキュアかどうか)は、サービスが他のサービスに接続するために必要な情報である。IPCクライアントは対象のVIPまたはSVIPでインスタンス化され、EurekaクライアントはVIPまたはSVIPとポートからIPのセットへの変換を行い、Eurekaサーバーから情報を取得する。欠点は、単一障害点が ロードバランサーからがEurekaに移行することだ。
How Netflix implements IPC with Eureka
このアーキテクチャは何十年もうまく機能してきたが、同社は3つの主な理由からサービスメッシュに移行する必要がある。
1.現在、異なるIPCテクノロジーは、REST、graphQL、gRPCの組み合わせである。
2.Javaベースのアーキテクチャからポリグロット・アーキテクチャへ移行
3.IPCクライアントに機能を追加
IPC機能を単一の実装に集中させ、言語ごとのクライアントを可能な限りシンプルに保つために、Envoyを使用することを決定した。さらに、EnvoyはDiscovery Abstractionをサポートしているので、IPCクライアントはそれを使い続ける。欠点は、Envoy ではプロキシのコンフィギュレーションでクラスターを指定する必要があり、サービスが潜在的に数十のクラスターと通信できるため、これが Netflixのアーキテクチャでは問題となった。さらに、Netflixのアーキテクチャは常に変化しているため、時間の経過とともにクラスタも変化する。これを克服するために、Netflixチームはいくつかのアプローチを評価した。
- サービスオーナーに、そのサービスが通信する必要のあるクラスタを定義してもらう。
- サービスのコールグラフに基づいてEnvoyコンフィグを自動生成する。
- すべてのアプリにすべてのクラスタをプッシュする
しかし、これらには複数の欠点があるため、見つかった解決策は、実行時にオンデマンドでクラスタ情報をフェッチすることだ。このソリューションを実装するには、Envoyの新機能が必要だった。Envoyコミュニティ、Netflix、Kinvolkのコラボレーションにより、オンデマンド・クラスタ・ディスカバリー(ODCDS)が開発された。これにより、プロキシは最初の接続時にクラスタ情報を検索できるようになった。新しいフローは以下のようになる。
1.クライアントからのリクエストがEnvoyに届く
2.Hostに基づいて対象のクラスタを抽出します。そのクラスタがすでに既知の場合は、ステップ7に進む
3.クラスタが存在しない場合、リクエストは一時停止される
4.コントロールプレーンのCDS(Cluster Discovery Service)エンドポイントにリクエストを行います。コントロールプレーンは、サービスの設定とEurekaの登録情報に基づいて、カスタマイズされたCDS応答を生成する
5.Envoyはクラスタ(CDS)を取得し、エンドポイントディスカバリサービス(EDS)を介してエンドポイントのトリガを引く。クラスタのエンドポイントは、VIPまたはSVIPのEurekaステータス情報に基づいて返される
6.クライアントのリクエストが一時停止されない
7.Envoyは通常通りリクエストを処理する。ロードバランシングアルゴリズムを使ってエンドポイントを選び、リクエストを発行する
このフローはミリ秒単位で実行されるが、サービスが低遅延を必要とするユースケースもある。これを克服するために、これまでに発見された解決策は以下の通りである。
1.サービスは、通信するクラスタを事前に定義するか、最初のリクエストの前に接続を準備する必要がある
2.過去のリクエストパターンに基づき、プロキシの起動時にコントロールプレーンのクラスタを事前にプッシュする
NetflixとEnvoyコミュニティは、Envoyを改善するために協力し続けている。