(Envoy)もよく耳にするので勉強しました。ProxyEnvoyとは?EnvoyはクラウドネイティブなWebサービスのために設計されたロードバランサーです。よって管理されています。Envoyには大きく2つの用途があります。サービスメッシュ内の各サービス間の通信を制御するプロキシ。サービスディスカバリーや流量の制御をする。サービス内のプライベートネットワークとサービス外をつなぐプロキシ。データセンターやKubernetesクラスタの外からのアクセスを受け付ける。背景モノリスで巨大なWebシステムが成長するとき、開発者はマイクロサービス化という選択肢を迫られます。マイクロサービスなどの分散システムを構築・運用するには、モノリスなシステムと比較して新たな難しさも見えてきます。Lyftも初めはモノリスなアーキテクチャでしが、成長と共にサービス数が増えて、ネットワークの制御に苦労するようになりました。そこでLyftはEnvoyを開発しました。マイクロサービスアーキテクチャを運用する上で、サービス間のネットワーク制御は不可欠です。リトライやサーキットブレーカー、帯域制限が必要です。デバッグ時に利用する分散トレーシングやログ情報も必要になります。ネットワーク制御の仕組みをライブラリとして提供すると、各サービスで採用してる言語やフレームワークに応じて用意して、それをメンテナンスする必要があります。マイクロサービスではそれぞれのサービスが自由な言語・フレームワークが使えるというメリットがある一方、こういったライブラリが使いにくいという課題もあります。そこでLyftはライブラリではなくネットワークプロキシとして利用できるEnvoyが開発されました。Envoyの利用実績Envoyは現在多くのサービスで採用されています。JAPANなどで採用されてます。Kubernetesと共にサービスメッシュ化も加速し、今後もユースケースが増えるでしょう。ContourなどのEnvoyをラップしたアプリケーションも存在します。Projectに認定され、CNCFの中でも十分成熟したプロジェクトとして認定されました。GraduatedとなったプロジェクトにKubernetesとPrometheusがあります。そのためEnvoyはこれらと肩を並べるほどの利用実績と信頼性があるということです。Envoyのデザイン基本コンセプトEnvoyは次の思想のもと開発されました。ネットワークまたはアプリケーションに問題が発生したとき原因の特定が簡単だからだ。Envoyはサービス間のネットワーク制御を、ライブラリではなくネットワークプロキシとして開発しました。それぞれのサービスはEnvoyを経由して別のサービスに接続します。Envoyを利用したアーキテクチャでは、アプリケーションと同じホスト(正確にはネットワークを共有してるホスト)上にEnvoyを構築します。Kubernetesなどでは、Envoyを各アプリケーションのサイドカーコンテナとしてデプロイします。各サービスは別のサービスを直接参照するのではなく、localhostに建てられたEnvoyに接続します。サイドカーとして立てられたEnvoyでは、別サービスのIPアドレスなどを知っています。アプリケーション自体が別のサービスのIPアドレスを知らなくとも、localhostにあるEnvoyのポートのみを知ればよいです。経路制御やサービスのIPアドレスが変わったときも、Envoyの設定を更新さえすれば、アプリケーションはネットワークで何が起こったかを知る必要がありません。基本用語クライアントがEnvoyに接続する側をDownstreamと呼び、Envoyがサーバー接続する側をUpstreamと呼びます。Envoyのプロキシ設定は、ListenerとClusterのペアを設定します。EnvoyがUpstreamに接続するホストグループです。Cluster内にあるメンバーの1つで、Upstreamのホストです。DownstreamがEnvoyに接続するための情報で、アドレス・ポートやUNIXドメインソケットを指定できます。URLやHTTPヘッダからどのClusterに接続するかの経路情報です。動的な設定変更とxDSEnvoyの設定は全て静的なファイルで与えることができますし、Envoyをシャットダウンせず設定の更新もできます。APIや、ファイルの更新などがサポートされいます。APIによる設定変更は、Envoy”が”制御サーバーにEnvoyの設定を問い合わせます。APIではサーバーをポーリングして設定をリロードし、gRPCではgRPCストリームを使って新しい設定をロードします。EnvoyではこのAPI提供する制御サーバーをコントロールプレーンと呼び、Envoy側をデータプレーンと呼びます。設定を取得するAPIは、Envoyの各種項目毎に用意されてます。