今回は「Try Envoy」の「Controlling load balancing policies」を紹介する.Envoy でサポートされている「ロードバランスポリシー」の種類を学べる.ただし,Weighted round robin の動作確認は期待通りに動かず,消化不良な感じになってしまった.個人的には「Controlling load balancing policies」は実施しなくて良いと思う.可能なら Katacoda 側で内容を見直してもらえると良さそう.
Detecting Down Services with Health Checks
手順は以下の「計3種類」ある.
- Step.1 「Load balancing policies」
- Step.2 「Weighted round robin」
- Step.3 「Generating Traffic」
なお,最近 Try Envoy にあるリンクは 404 エラーになってしまった(年末までは見れていた).ただ Katacoda を使えば,引き続き同じコンテンツを実施できる.
Step.1 「Load balancing policies」
Envoy では Cluster の lb_policy
に「ロードバランスポリシー」を設定できる.今まで試してきた Try Envoy では,全て ROUND_ROBIN
を使っていたけど,実際には多くの種類が実装されている.
- Weighted round robin (
ROUND_ROBIN
)- デフォルト設定
- Weighted least request (
LEAST_REQUEST
) - Ring hash (
RING_HASH
) - Random (
RANDOM
) Original destination (ORIGINAL_DST_LB
)- Envoy v1.12.0 から非推奨で
CLUSTER_PROVIDED
を使う
- Envoy v1.12.0 から非推奨で
- Maglev (
MAGLEV
) - Cluster Provided (
CLUSTER_PROVIDED
)
RING_HASH
は名前の通り Consistent Hashing の実装となる.ドキュメントを読むと ketama という C で実装されたライブラリのリンクがあり,Envoy の内部で使われているとのことだった.また MAGLEV
は今回はじめて知ったけど,Google から論文が出ているアルゴリズムらしく,ketama よりも高速とのこと.気になる!
「ロードバランスポリシー」の詳細は以下のドキュメントに載っている.
Step.2 「Weighted round robin」
envoy.yaml
で lb_policy
に ROUND_ROBIN
を設定する.今までの Try Envoy で何度も試したため,正直言うと他のロードバランスポリシーを試したかった.なお,今回は clusters
の中に hosts
を設定せず,新しく load_assignment
を設定していた.よくよく調べると,Envoy v1.8.0 から hosts
は非推奨になり load_assignment
が推奨になっていた.今までの Try Envoy は非推奨の設定を使っていたことに気付く.ううう!
さらに load_assignment
の挿入場所に誤りがあり,Envoy の起動時にエラーになる.正しくは clusters
のパラメータなので,以下のように lb_policy
と並べる必要がある.修正はプルリクエストを送っているけど,取り込まれるまでは要注意!
static_resources: listeners: - name: listener_0 address: socket_address: { address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: - name: envoy.http_connection_manager config: codec_type: auto stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: - "*" routes: - match: prefix: "/" route: cluster: targetCluster http_filters: - name: envoy.router clusters: - name: targetCluster connect_timeout: 0.25s type: STRICT_DNS dns_lookup_family: V4_ONLY lb_policy: ROUND_ROBIN load_assignment: cluster_name: targetCluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 172.18.0.3 port_value: 80 load_balancing_weight: 90 - lb_endpoints: - endpoint: address: socket_address: address: 172.18.0.4 port_value: 80
そして,Envoy と katacoda/docker-http-server:healthy
を起動する.
$ docker run --name=proxy -d \ -p 80:10000 \ -p 9901:9901 \ -v $(pwd)/envoy/:/etc/envoy \ envoyproxy/envoy:latest $ docker run -d katacoda/docker-http-server:healthy; $ docker run -d katacoda/docker-http-server:healthy;
Step.3 「Generating Traffic」
実際に while
で Envoy にリクエストを送り続ける.
ドキュメントを読むと,endpoint.LocalityLbEndpoints
と endpoint.LbEndpoint
に対する load_balancing_weight
があり,混乱した.今回は前者の設定となり,172.18.0.3
側に多くのリクエストが送られるのかと予想したけど,動作確認をしてもルーティングに差は出なかった.うーん?理解が間違っている?よくわからず,もう少し Try Envoy として解説を書いて欲しいなと思う.
$ while true; do curl localhost; sleep .5; done
まとめ
- 「Try Envoy」のコンテンツ「Controlling load balancing policies」を試した
- Weighted round robin の動作確認は期待通りに動かず,消化不良な感じになってしまった
- 実施しなくて良いと思う 😇
残るは1個!引き続き,進めていくぞ!
プルリクエスト
試しながら気付いた誤りを修正してプルリクエストを送っておいた!
Try Envoy 関連
- 「Try Envoy」で Envoy を学ぼう!「Getting Started with Envoy」を試した - kakakakakku blog
- nginx と Envoy の設定を比較して学べる「Migrating from NGINX to Envoy Proxy」を試した - kakakakakku blog
- Envoy で HTTPS 接続をする設定を学べる「Securing traffic with HTTPS and SSL/TLS」を試した - kakakakakku blog
- Envoy のディスカバリサービス (xDS) を学べる「File Based Dynamic Routing Configuration」を試した - kakakakakku blog
- Envoy の EDS を REST API で体験する「API Based Dynamic Routing Configuration」を試した - kakakakakku blog
- Envoy の Health Checking と Outlier Detection の違いを学べる「Detecting Down Services with Health Checks」を試した - kakakakakku blog
- Envoy の route.HeaderMatcher を使う「Implementing Blue / Green Rollouts」を試した - kakakakakku blog