概要
Envoyのyamlは非常に長大で初めて読む人からするととても分かりにくいです。
しかし実際は各要素の役割を理解するととてもシンプルに構成されていることが分かります。
そのための手助けとしてこちらで図を交えながら説明します。
環境
- Envoy 1.22.0
要素の説明
downstreamとupstream
要素 | 説明 |
---|---|
downstream | Envoyからみたクライアント |
upstream | Envoyがサービスに対するリクエストを転送する際に接続するエンドポイント(ネットワークノード) |
よくあるパターンで図示してみると以下です。
このように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のように狭ければ以下の図のようになりますし、
サービスメッシュの全体を内
と捉え、外部との境界とみなせば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は非常に長くなりがちですが、要素を理解すれば実際はシンプルな構成で理解しやすいことが分かりました。