Carpe Diem

備忘録

EnvoyのYAMLの読み方

概要

Envoyのyamlは非常に長大で初めて読む人からするととても分かりにくいです。

しかし実際は各要素の役割を理解するととてもシンプルに構成されていることが分かります。

そのための手助けとしてこちらで図を交えながら説明します。

環境

  • Envoy 1.22.0

要素の説明

downstreamとupstream

要素 説明
downstream Envoyからみたクライアント
upstream Envoyがサービスに対するリクエストを転送する際に接続するエンドポイント(ネットワークノード)

よくあるパターンで図示してみると以下です。

front proxyモデル

sidecarで外部からリクエストを受ける

sidecarでローカルアプリケーションからのリクエストを転送する

このようにsidecarモデルのローカルアプリケーションは、downstreamにもupstreamにもなり得ます。

ListenerとCluster

こちらの図が分かりやすいのでこれをベースに説明します。

ref: https://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#high-level-architecture

要素 役割
Listener downstreamからのリクエストとレスポンスに責任を持つ
Cluster upstreamへのコネクション、ヘルスチェック、負荷分散に責任を持つ

Ingress ListenerとEgress Listener

Listenerにはingressとegressがあります。

要素 説明
ingress listener 外から内に入ってくるリクエストを扱う
egress listener 内から外に出ていくリクエストを扱う

の定義がSidecarのように狭ければ以下の図のようになりますし、

Ingress

Egress

サービスメッシュの全体をと捉え、外部との境界とみなせばEdgeのProxyがingressとegressの境界にもなります。

ref: https://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#network-topology

各種Filter

Listenerには様々なFilterを設定することができ、これによってTLS終端をさせたりClusterへのルーティングを設定できます。

大きく以下の3つのFilterがあり、それぞれchainで処理を繋げられます。

  • Listener Filter
  • Network Filter
  • HTTP Filter

図で表すと以下です。

この中で

  • Network filter chainの最後はHCM(HTTP connection manager)
  • HTTP filter chainの最後はrouter

というルールあります。この順番を変更するenvoyは起動しません。

Listener filterを追加する例

例えばTLS終端させたい場合はListener FilterにTLS inspectorを入れます。

Network filterを追加する例

例えばrate limitやRBACを設定したい場合は、Network filterに入れます。

やりたいことがどのフィルタで実現できるかは、適宜調べてみてください。

yamlを見ながら説明

シンプルなケース

これまでの説明を元に、

Examples — envoy 1.23.0-dev-0bb12b documentation

にある設定を見ながら理解していきます。

ListenerとClusterを分ける

ListenerとClusterを分けます。

ListenerのFilterを確認する

このexampleは最低限の設定だけなので、Listener filterはありませんでした。
またNetwork filterやHTTP filterも最低限必要なHCM、routerのみでした。

追加のfilterがあるケース

Life of a Request — envoy 1.23.0-dev-3b0a85 documentation

ではTLSなどの設定があります。

一見長大ですが、これまでの概念を理解していれば簡単に分けて考えることができます。

各ListenerのFilterを確認する

このようにfilter部分を区別して考えれば後はTLSの設定だけであることが分かります。

まとめ

EnvoyのYAMLは非常に長くなりがちですが、要素を理解すれば実際はシンプルな構成で理解しやすいことが分かりました。

参考