區域加權負載平衡
此範例示範 Envoy 代理中的 區域加權負載平衡 功能。此演示模擬後端服務位於兩個本機區域和一個遠端區域的情境。
此演示中使用的組件如下:
一個用戶端容器:執行 Envoy 代理
與用戶端位於同一區域的後端容器,優先順序設定為 0,稱為
local-1
。與用戶端位於同一區域的後端容器,優先順序設定為 1,稱為
local-2
。位於遠端區域的後端容器,優先順序設定為 1,稱為
remote-1
。位於遠端區域的後端容器,優先順序設定為 2,稱為
remote-2
。
用戶端 Envoy 代理在同一個 Envoy 叢集中配置 4 個後端容器,以便 Envoy 處理對這些後端伺服器的負載平衡。從這裡我們可以看到,我們有 3 個不同優先順序的區域
優先順序 0:
local-1
優先順序 1:
local-2
和remote-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-2
和 remote-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-1
和 remote-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