Envoy Proxyを始めてみよう

# はじめに
[NRI OpenStandia Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nri-openstandia)の19日目は、最近[DropboxがNginxから移行したこと](https://dropbox.tech/infrastructure/how-we-migrated-dropbox-from-nginx-to-envoy)でも話題になった<u>Envoy  Proxy</u>について、これから利用したい方や学んでいきたい方に向けて、そもそもどんなものなのかを紹介していきたいと思います。


# Envoyとは

[Envoy](https://www.envoyproxy.io/)はNginxと似た機能を持つOSSで、マイクロサービスに対応するため、サービス間のネットワーク制御をライブラリとしてではなく、ネットワークプロキシとして提供することを目的に開発されました。
これにより個々のサービスはEnvoyを経由してそれぞれのサービスへ接続します。これはネットワークを抽象化して、アプリケーション開発者をビジネスロジックに集中できるようにするという目標のために行われています。

例えば、Envoyを利用したアーキテクチャでは、アプリケーションと同じホスト上にEnvoyを構築します。Kubernetesなどでは、Envoyを各アプリケーションのサイドカーコンテナとしてデプロイし、これにより、各サービスは別のサービスを直接参照するのではなくEnvoyを経由することになります。

![Screenshot_2020-12-17 https qiita-image-store s3 amazonaws com 0 91324 fd402b96-b906-d687-a030-c16518f9ce9d png (WEBP 画像, 1[...].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/fe774be4-db55-7876-beb8-e8877a177dac.png)


参照：https://www.slideshare.net/datawire/lyfts-envoy-from-monolith-to-service-mesh-matt-klein-lyft/13

サイドカーとして立てられたEnvoyは、各サービスのIPアドレスなどを知っており、アプリケーション自体が別のサービスのIPアドレスを知らなくても問題はなくなります。
このようにすることで、サービスの通信経路やIPアドレスが変更になった場合でも、Envoyの設定を更新するのみで、アプリケーションに手を加える必要がなくなります。
このようにして、Envoyはアプリケーションからネットワークの切り離しを実現しています。

このほかにも、サービス内のプライベートネットワークとサービス外をつなぐエッジプロキシとしても利用されています。
![Screenshot_2020-12-17 lyfts-envoy-from-monolith-to-service-mesh-matt-klein-lyft-14-638 jpg (JPEG 画像, 638x359 px).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/d2bf77fe-3b3b-5146-13fd-d83bb3b7c8ff.png)

参照：https://www.slideshare.net/datawire/lyfts-envoy-from-monolith-to-service-mesh-matt-klein-lyft/14


## 主な機能
機能としては以下のようなものが上げられます。

| 機能                                                     | 概要                                                         |
| -------------------------------------------------------- | ------------------------------------------------------------ |
| L3/L4フィルタ                          | プラガブルフィルタチェインメカニズムにより様々なTCPプロキシタスクを実行するためのフィルタを作成することが出来ます。フィルタはTCPプロキシ、HTTPプロキシ、TLSクライアント証明書認証などをサポートします。 |
| HTTP L7フィルタ                        | EnvoyはHTTP L7フィルタレイヤーをサポートしています。HTTPフィルタはバッファリング、レート制限、ルーティング/フォワーディング、Amazon DynamoDBのスニファリングのような様々なタスクをサポートします。 |
| HTTP/2サポート                                           | HTTPモードで動作している場合、EnvoyはHTTP/1.1とHTTP/2の両方をサポートします。これにより双方向で透過的なHTTP/1.1からHTTP/2プロキシとして動作します。 |
| HTTP L7ルーティング                                      | HTTPモードで動作している場合、ルーティングやパスに基づくリダイレクトリクエスト、認証、コンテンツタイプ、ランタイム値などルーティングサブシステムをサポートします。 |
| gRPCサポート                                             | EnvoyはgRPCリクエスト/レスポンスのルーティングおよび負荷分散の基盤として使用する必要のあるHTTP/2機能全てをサポートしています。 |
| MongoDB L7サポート                                       | L7のスニッフィング、統計生成、ロギングをサポートしています。 |
| DynamoDB L7サポート                                      | L7のスニッフィング、統計生成をサポートします。               |
| サービスディスカバリーとダイナミックコンフィグレーション | EnvoyはオプションとしてDNSを介してバックエンドホストの検出を行うことが出来ます。またxDS APIを使用してEnvoy内の設定を動的に更新することも可能です。 |
| ヘルスチェック                                           | Envoyにはオプションでアップストリームサービスクラスタへのヘルスチェックサブシステムが含まれています。<br/>またサービスディスカバリーとヘルスチェック情報を使用して健全なロードバランシングも提供しています。 |
| フロント/エッジプロキシサポート                          | HTTPリクエストヘッダやパスに応じた通信経路の設定や複数経路の重み付けでロードバランシングも可能です。そのため、Blue-Greenデプロイやカナリアリリースに必要な機能が備わっています。 |


# Envoyをかじる

まず、Envoy自体がどのようなものかが分からなければ、使いようも無いということでEnvoyの機能を利用してみるのがいいかと思います。
インストール方法などは[公式ドキュメント](https://www.envoyproxy.io/docs/envoy/latest/start/install)に記載がありますが、Katacodaというサイトではインストール不要で基本的な設定・操作を学ぶことができます。
[Getting Started with Envoy](https://www.katacoda.com/envoyproxy/scenarios/getting-started)

![Screenshot_2020-12-17 Getting Started with Envoy envoyproxy Katacoda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/6154024f-fceb-d66e-06b5-b74c575f102f.png)


各ステップ毎に左ウィンドウにあるに説明に合わせて、「Copy to Editor」をクリックしていけば、スニペットにあるコードが右上のenvoy.yamlに記述されていき、ターミナルにコマンドを入れて実行することで、Envoyの機能が利用できます。

![Screenshot_2020-12-17 Getting Started with Envoy envoyproxy Katacoda(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316808/e0c6f395-d811-91d6-b2d2-fc5a9193a119.png)


Getting Startedの他にも10個のコースがあるので、気になったものがあれば試してみてください。
[https://www.katacoda.com/envoyproxy](https://www.katacoda.com/envoyproxy)

# 設定の変更

Envoyの設定は前述にもあるように静的なファイルを更新することで、Envoyをシャットダウンせず設定の更新もできます。設定を動的に変更するには、gRPC、REST APIなどがサポートされます。gRPCとREST APIによる設定変更は、Envoyが制御サーバーにEnvoyの設定を問い合わせます。REST APIではサーバーをポーリングして設定をリロードし、gRPCではgRPCストリームを使って新しい設定をロードします。EnvoyではこのAPIを提供する制御サーバーをコントロールプレーンと呼び、Envoy側をデータプレーンと呼びます。

# 最後に
いかがだったでしょうか。主な概要と基礎部分のみを紹介しましたが、EnvoyをKubernetes上で動かす際のコントロールプレーンとして有名なIstioなども合わせて学ぶことで、マイクロサービスのトラフィック制御や監視なども行うことができます。（このIstioの敷居がなかなか高いのですが・・・）