區域加權負載平衡

此範例示範 Envoy 代理中的 區域加權負載平衡 功能。此演示模擬後端服務位於兩個本機區域和一個遠端區域的情境。

此演示中使用的組件如下:

  • 一個用戶端容器:執行 Envoy 代理

  • 與用戶端位於同一區域的後端容器,優先順序設定為 0,稱為 local-1

  • 與用戶端位於同一區域的後端容器,優先順序設定為 1,稱為 local-2

  • 位於遠端區域的後端容器,優先順序設定為 1,稱為 remote-1

  • 位於遠端區域的後端容器,優先順序設定為 2,稱為 remote-2

用戶端 Envoy 代理在同一個 Envoy 叢集中配置 4 個後端容器,以便 Envoy 處理對這些後端伺服器的負載平衡。從這裡我們可以看到,我們有 3 個不同優先順序的區域

  • 優先順序 0: local-1

  • 優先順序 1: local-2remote-1

  • 優先順序 2: remote-2

在 Envoy 中,當給定區域的健康狀況降至低於閾值(預設為 71%)時,下一個優先順序的區域將開始分擔請求負載。下面的演示將顯示此行為。

步驟 1:啟動所有容器

在終端機中,移至 examples/locality_load_balancing 目錄。

若要建置此沙盒範例並啟動範例服務,請執行下列命令

# Start demo
$ docker compose up --build -d

區域配置是透過靜態 Envoy 配置檔案在用戶端容器中設定的。請參閱 proxy 配置 檔案的 cluster 區段。

注意

必須在 common_lb_config 中設定 locality_weighted_lb_config,才能使用 load_balancing_weight

步驟 2:最高優先順序區域有一個副本的情境

在此情境中,每個區域都有 1 個運作正常的副本,所有請求都應傳送到具有最高優先順序的區域(即優先順序設定的最低整數 - 0),即 local-1

# all requests to local-1
$ docker compose exec -T client-envoy python3 client.py https://127.0.0.1:3000/ 100
Hello from backend-local-1!: 100, 100.0%
Failed: 0

如果區域 local-1 變得不健康(即無法通過 Envoy 健康檢查),則請求應在後續優先順序的區域(即 local-2remote-1)之間進行負載平衡。它們的優先順序都是 1。然後我們向後端叢集發送 100 個請求,並檢查回應者。

# bring down local-1
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_1:8080/unhealthy
[backend-local-1] Set to unhealthy

# local-2 and remote-1 localities split the traffic 50:50
$ docker compose exec -T client-envoy python3 client.py https://127.0.0.1:3000/ 100
Hello from backend-remote-1!: 51, 51.0%
Hello from backend-local-2!: 49, 49.0%
Failed: 0

現在,如果 local-2 也變得不健康,則優先順序 1 的區域只有 50% 的健康狀況。因此,優先順序 2 的區域開始分擔請求負載。請求將傳送到 remote-1remote-2

# bring down local-2
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-2_1:8080/unhealthy

# remote-1 locality receive 100% of the traffic
$ docker compose exec -T client-envoy python3 client.py https://127.0.0.1:3000/ 100
Hello from backend-remote-1!: actual weight 69.0%
Hello from backend-remote-2!: actual weight 31.0%
Failed: 0

步驟 3:恢復伺服器

在繼續之前,我們需要先啟動 local-1 和 local-2 伺服器。

# recover local-1 and local-2 after the demo
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_1:8080/healthy
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-2_1:8080/healthy

步驟 4:最高優先順序區域有多個副本的情境

為了示範基於區域的負載平衡在多個副本設定中如何運作,現在讓我們將 local-1 區域擴展到 5 個副本。

$ docker compose up --scale backend-local-1=5 -d

我們將展示 local-1 只是部分健康的情境。因此,讓我們關閉 local-1 中的 4 個副本。

# bring down local-1 replicas
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_2:8080/unhealthy
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_3:8080/unhealthy
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_4:8080/unhealthy
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-1_5:8080/unhealthy

然後我們再次檢查端點

# check healthiness
$ docker compose exec -T client-envoy curl -s localhost:8001/clusters | grep health_flags

backend::172.28.0.4:8080::health_flags::/failed_active_hc
backend::172.28.0.2:8080::health_flags::/failed_active_hc
backend::172.28.0.5:8080::health_flags::/failed_active_hc
backend::172.28.0.6:8080::health_flags::/failed_active_hc
backend::172.28.0.7:8080::health_flags::healthy
backend::172.28.0.8:8080::health_flags::healthy
backend::172.28.0.3:8080::health_flags::healthy

我們可以確認 4 個後端端點變得不健康。

現在我們再次發送 100 個請求。

# watch traffic change
$ docker compose exec -T client-envoy python3 client.py https://127.0.0.1:3000/ 100

Hello from backend-remote-1!: actual weight 37.0%
Hello from backend-local-2!: actual weight 36.0%
Hello from backend-local-1!: actual weight 27.0%
Failed: 0

由於 local-1 沒有足夠的健康工作負載,因此請求會部分地由次要區域分擔。

如果我們關閉優先順序 1 的區域中的所有伺服器,將使優先順序 1 的區域的健康狀況為 0%。流量應在優先順序 0 和優先順序 2 的區域之間分配。

$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-local-2_1:8080/unhealthy
$ docker compose exec -T client-envoy curl -s locality-load-balancing_backend-remote-1_1:8080/unhealthy
$ docker compose exec -T client-envoy python3 client.py https://127.0.0.1:3000/ 100

Hello from backend-remote-2!: actual weight 77.0%
Hello from backend-local-1!: actual weight 23.0%
Failed: 0