81
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NRI OpenStandiaAdvent Calendar 2020

Day 19

Envoy Proxyを始めてみよう

Last updated at Posted at 2020-12-18

はじめに

NRI OpenStandia Advent Calendar 2020の19日目は、最近DropboxがNginxから移行したことでも話題になったEnvoy Proxyについて、これから利用したい方や学んでいきたい方に向けて、そもそもどんなものなのかを紹介していきたいと思います。

Envoyとは

Envoyは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://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://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にはオプションでアップストリームサービスクラスタへのヘルスチェックサブシステムが含まれています。
またサービスディスカバリーとヘルスチェック情報を使用して健全なロードバランシングも提供しています。
フロント/エッジプロキシサポート HTTPリクエストヘッダやパスに応じた通信経路の設定や複数経路の重み付けでロードバランシングも可能です。そのため、Blue-Greenデプロイやカナリアリリースに必要な機能が備わっています。

Envoyをかじる

まず、Envoy自体がどのようなものかが分からなければ、使いようも無いということでEnvoyの機能を利用してみるのがいいかと思います。
インストール方法などは公式ドキュメントに記載がありますが、Katacodaというサイトではインストール不要で基本的な設定・操作を学ぶことができます。
Getting Started with Envoy

Screenshot_2020-12-17 Getting Started with Envoy envoyproxy Katacoda.png

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

Screenshot_2020-12-17 Getting Started with Envoy envoyproxy Katacoda(1).png

Getting Startedの他にも10個のコースがあるので、気になったものがあれば試してみてください。
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の敷居がなかなか高いのですが・・・)

81
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
81
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?