Envoy
ポリグロットなマイクロサービスに一貫したネットワーキング・可観測性・動的設定を与える、アウトオブプロセスの L4/L7 プロキシかつユニバーサルデータプレーン。
- カテゴリ: Service Mesh & Networking
- CNCF 成熟度: Graduated
- 言語: C++ (C++17/20 主体。ツール群に Go・Python・Rust・Starlark)
- ライセンス: Apache-2.0
- リポジトリ: envoyproxy/envoy
- ドキュメント基準コミット:
6a45c7d(タグv1.38.2近傍)
何をするものか
Envoy はアプリケーションサービスの傍ら、または前段で動き、そのネットワークトラフィックを捌くプロキシである。L4 (TCP/UDP) でコネクションを終端・転送し、L7 (HTTP/1.1・HTTP/2・HTTP/3・gRPC) でアプリケーションプロトコルをパースして、その途中でルーティング・ロードバランシング・リトライ・レートリミット・認可を適用する。サービスのネットワーク処理を言語ごとにライブラリで再実装するのではなく、アプリケーションの外側の一箇所に置くために作られた。
プロセスは固定数の worker スレッドを持つ単一の静的バイナリだ。メインスレッドが設定とライフサイクルを所有し、各 worker は自前のイベントループを回してロックを共有せずコネクションを処理する。設定は静的ファイルでも、xDS API 経由でランタイムにストリームされる形でもよい。これが、コントロールプレーンが多数の Envoy を再起動なしで再構成できる仕組みの核心である。
Envoy は多くの上位システムが土台にするデータプレーンでもある。Istio・Envoy Gateway・Contour・Emissary-ingress はいずれも自前のプロキシを書かず、xDS 経由で Envoy を駆動する。エントリポイントは source/exe/main.cc:16 で、そこから Envoy::MainCommon::main に渡る。
いつ使うか
- ポリグロットなマイクロサービスを運用し、言語ごとのライブラリではなく一貫したネットワーキング・リトライ・可観測性レイヤを 1 つ持ちたいとき。
- コントロールプレーンが xDS でプロキシを再起動なしに動的再構成できるデータプレーンが必要なとき。
- サービスメッシュや API ゲートウェイを作っており、プロキシのコアを自作せず実績ある実装を使いたいとき。
- エッジやサービス間で深い L7 機能 (HTTP/2・HTTP/3、gRPC、ヘッダベースのルーティング、outlier detection) が必要なとき。
静的な NGINX/HAProxy 設定で要件が足りる場合や、小さな依存 1 つで済ませたい場合には向かない。Envoy は大きな C++ バイナリで、設定モデルの学習コストがある。
このディープダイブの構成
- 歴史: 起源・マイルストーン・存在理由。
- アーキテクチャ: コンポーネントとリクエストの流れ。
- 採用事例・エコシステム: 誰が動かし、周囲に何があるか。
- 内部実装: ソースから読んだ重要なコードパス。
- はじめに: インストールと最初の動く構成。
出典
- envoyproxy/envoy、コミット
6a45c7d9fee960d6457c44205faf6307157efc24に固定 (2026-06-22)。 - CNCF プロジェクトページ: Envoy (2026-06-22)。
- Envoy joins the CNCF (Matt Klein, Lyft Eng) (2026-06-22)。
- 5 years of Envoy OSS (Matt Klein) (2026-06-22)。
- How Lyft Invented Envoy (2026-06-22)。
- Istio architecture (2026-06-22)。
- Envoy GOVERNANCE.md (2026-06-22)。
- Envoy quick start: run Envoy (2026-06-22)。
- Envoy 公式ドキュメント (2026-06-22)。