Envoy Proxyの公式チュートリアル — Getting Started with Envoy

Envoy Proxyには公式チュートリアル集「TRY ENVOY」があります。 Katacodaで実際に操作しながら動作を確認できるため分かりやすいです。

www.envoyproxy.io

この中から、Beginner向けとなっている「Getting Started with Envoy」の内容をまとめました。 このチュートリアルでは、Step1~Step3でEnvoyの基礎とHTTPリクエストをGoogle.comに転送するプロキシ設定、Step4でFlask*1を使った複数の簡易Webサーバに対してURLによってリクエストをルーティングするプロキシ設定が紹介されています。

Step1~Step3では最終的にEnvoyの設定を記述した以下のYAMLファイルを作成します。

Create Proxy Config

Envoyではプロキシの動作をenvoy.yamlというYAMLファイルで設定します。 この例では、全ての設定をあらかじめ定義しておくStatic Configuration APIを使用して設定を行います。 ここでは扱っていませんが、Envoyでは動的な設定を行うこともできます。

Resources

まず、envoy.yamlで使用するAPIを定義します。 今回はStatic Configuration APIを使用するため、1行目にstatic_resources:と記述します。

Listeners

Listenerにはリクエストを受けるために必要なIPアドレスやポートといったネットワーク設定を行います。 EnvoyはDockerコンテナで動作させるため、IPアドレス0.0.0.010000番ポートをリッスンします。

Filter Chains and Filters

この例では、Envoyのエンドポイントへのリクエストに対して、URLを変えずにGoogle.comを転送する設定を行います。 Filterは定義に一致するリクエストをターゲットに転送することができ、Listenerにはfilter_chainsで複数のFilterを設定することができます。 ここでは、envoy.http_connection_managerというHTTP接続専用のビルトインFilterを使用します。

  • stat_prefix: connection managerの統計を出力するときに使用する人間が読める形式のprefix
  • route_config: ルーティング設定
  • routes: route設定でURL prefixに一致するときの動作を定義
  • host_rewrite: HTTPリクエストのHostヘッダーの書き換え
  • cluster: リクエストを処理するClusterの名前
  • http_filters: 処理されたリクエストを修正するFilter

Clusters

リクエストがFilterに一致したとき、リクエストはClusterに転送されます。 この例では、HTTPSで動作するGoogle.comをホストとして定義しています。

Admin

このListenerもリクエストに対してマッチする複数のFilterを設定できます。

Start Proxy

Envoyの設定ファイルを作成したら、コンテナを起動します。 このとき、Docker側で/etc/envoy/envoy.yamlをマウントしておきます。

docker run --name=proxy -d \
  -p 80:10000 \
  -v $(pwd)/envoy/envoy.yaml:/etc/envoy/envoy.yaml \
  envoyproxy/envoy:latest

localhost:80へcurlすることで結果が得られます。

curl localhost

この結果として、URLは同じままGoogle.comのページが表示されます。

Admin View

Envoyは設定や統計、ログやその他のEnvoyの内部データを表示することができる管理者ビューを提供します。

docker run --name=proxy-with-admin -d \
    -p 9901:9901 \
    -p 10000:10000 \
    -v $(pwd)/envoy/envoy.yaml:/etc/envoy/envoy.yaml \
    envoyproxy/envoy:latest

Route to Docker Containers

この例では、URLによってリクエストを複数のWebサーバにルーティングするEnvoyの設定を行います。 設定やソースコードGitHubで公開されています。

github.com