kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Envoy の lb_policy は ROUND_ROBIN 以外にもある!「Controlling load balancing policies」を試した

今回は「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 を使えば,引き続き同じコンテンツを実施できる.

www.katacoda.com

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 を使う
  • Maglev (MAGLEV)
  • Cluster Provided (CLUSTER_PROVIDED)

RING_HASH は名前の通り Consistent Hashing の実装となる.ドキュメントを読むと ketama という C で実装されたライブラリのリンクがあり,Envoy の内部で使われているとのことだった.また MAGLEV は今回はじめて知ったけど,Google から論文が出ているアルゴリズムらしく,ketama よりも高速とのこと.気になる!

github.com

「ロードバランスポリシー」の詳細は以下のドキュメントに載っている.

www.envoyproxy.io

www.envoyproxy.io

Step.2 「Weighted round robin」

envoy.yamllb_policyROUND_ROBIN を設定する.今までの Try Envoy で何度も試したため,正直言うと他のロードバランスポリシーを試したかった.なお,今回は clusters の中に hosts を設定せず,新しく load_assignment を設定していた.よくよく調べると,Envoy v1.8.0 から hosts は非推奨になり load_assignment が推奨になっていた.今までの Try Envoy は非推奨の設定を使っていたことに気付く.ううう!

www.envoyproxy.io

さらに load_assignment の挿入場所に誤りがあり,Envoy の起動時にエラーになる.正しくは clusters のパラメータなので,以下のように lb_policy と並べる必要がある.修正はプルリクエストを送っているけど,取り込まれるまでは要注意!

envoyproxy.io

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.LocalityLbEndpointsendpoint.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個!引き続き,進めていくぞ!

プルリクエスト

試しながら気付いた誤りを修正してプルリクエストを送っておいた!

github.com

Try Envoy 関連