Gateway API 實踐之(七)FSM Gateway 的負載均衡算法

2024年2月6日 23点热度 0人点赞

FSM Gateway 流量管理策略系列:

  • 故障註入

  • 黑白名單訪問控制

  • 限速

  • 重試

  • 會話保持

  • 健康檢查

  • • 負載均衡算法

  • • TLS 上遊

  • • 雙向 TLS


在微服務和 API 網關架構中,負載均衡是至關重要的,它確保每個服務實例都能平均地處理請求,同時也為高可用性和故障恢復提供了機制。FSM Gateway 提供了多種負載均衡算法,讓可以根據業務需求和流量模式選擇最適合的方法。

支持多種負載均衡算法,方便高效地分配流量,最大化資源利用率,提高服務的響應時間:

  • RoundRobinLoadBalancer:這是最常見的負載均衡算法,請求將按順序分配給每個服務實例。如果不特別指定,FSM Gateway 默認使用此算法。

  • HashingLoadBalancer:根據請求的某些屬性(如來源 IP 或請求頭)計算哈希值,然後根據該哈希值將請求路由到特定的服務實例。這確保了相同的請求者或相同類型的請求總是被路由到同一服務實例。


  • LeastConnectionLoadBalancer
    :這種算法會考慮每個服務實例的當前工作負載(連接數),並將新的請求分配給當前負載最小的實例,從而確保更均勻的資源利用。

前置條件

  • • Kubernetes 集群

  • • kubectl 工具

環境準備

安裝 FSM Gateway

FSM Gateway 的安裝,可以參考 安裝文檔[1]。這裡選擇 CLI 的方式安裝。

下載 FSM CLI。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.0
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安裝 FSM 時啟用 FSM Gateway,默認情況是不啟用的。

fsm install \
--set=fsm.fsmGateway.enabled=true

部署示例應用

為了驗證負載均衡功能,需要兩個響應不同狀態碼(200、201)和內容的端點。因此我們創建了 Service pipy,並為其創建了兩個返回不同響應的端點。這兩個端點使用可編程代理 Pipy[2] 來模擬的。

kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: pipy
spec:
selector:
app: pipy
ports:
- protocol: TCP
port: 8080
targetPort: 8080

---
apiVersion: v1
kind: Pod
metadata:
name: pipy-1
labels:
app: pipy
spec:
containers:
- name: pipy
image: flomesh/pipy:0.99.0-2
command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},'Hello, world'))"]

---
apiVersion: v1
kind: Pod
metadata:
name: pipy-2
labels:
app: pipy
spec:
containers:
- name: pipy
image: flomesh/pipy:0.99.0-2
command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 201},'Hi, world'))"]
EOF

創建網關和路由

接下來創建網關並為 Service pipy 創建路由。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: simple-fsm-gateway
spec:
gatewayClassName: fsm-gateway-cls
listeners:
- protocol: HTTP
port: 8000
name: http
allowedRoutes:
namespaces:
from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: fortio-route
spec:
parentRefs:
- name: simple-fsm-gateway
port: 8000
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: pipy
port: 8080
EOF

檢查應用是否可以正常訪問。通過結果可以看到,網關將請求負載均衡到了兩個端點上,默認使用的是輪詢負載均衡算法。

export GATEWAY_IP=$(kubectl get svc -n server -l app=fsm-gateway -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

curl http://$GATEWAY_IP:8000/
Hi, world

curl http://$GATEWAY_IP:8000/
Hello, world

curl http://$GATEWAY_IP:8000/
Hi, world

負載均衡策略驗證

負載均衡策略的配置可以參考文檔 LoadBalancerPolicy[3]

輪詢負載均衡算法

使用 fortio load 生成負載進行測試:使用 50 個並發發送 200 個請求。可以看到響應狀態碼 200 和 201 各占一半,這是因為默認情況下使用的是輪詢算法,請求被負載均衡到兩個端點。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 200 : 100 (50.0 %)
Code 201 : 100 (50.0 %)

哈希一致性負載均衡算法

讓我們設置負載均衡策略,將算法這是為 HashingLoadBalancer

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: LoadBalancerPolicy
metadata:
name: lb-policy-sample
spec:
targetRef:
group: ""
kind: Service
name: pipy
namespace: server
ports:
- port: 8080
type: HashingLoadBalancer
EOF

同樣還是發送同樣的負載,可以看到 200 個請求都被代理到同一個端點。對於同一個客戶端發送的請求,FSM Gateway 通過哈希一致性算法,都會選擇同一個端點來處理請求。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 201 : 200 (50.0 %)

最小連接數均衡算法

在 Kubernetes 中,同一個 Service 的多個端點的規格應該是相同的,使用最小連接數均衡算法,最終的效果實際跟輪詢的算法一致。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: LoadBalancerPolicy
metadata:
name: lb-policy-sample
spec:
targetRef:
group: ""
kind: Service
name: pipy
namespace: server
ports:
- port: 8080
type: LeastConnectionLoadBalancer
EOF

發送同樣的負載,與我們預想的一樣,負載被均勻的代理到兩個端點。

fortio load -quiet -c 50 -n 200 http://$GATEWAY_IP:8000/

Code 200 : 100 (50.0 %)
Code 201 : 100 (50.0 %)

關於 Flomesh

Flomesh(易衡科技)成立於 2018 年,自主研發並開源了高性能可編程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 為基礎,Flomesh 研發了軟件負載均衡、服務網格兩款軟件產品。為工信部認證的可信雲產品、可信開源項目。

Flomesh 核心競爭力來自完全自研的核心組件 Pipy,該組件高性能、高可靠、低延遲、可編程、可擴展、低依賴,采用 C 開發,內置自研的 JS 引擎,支持適用 JS 腳本做擴展開發。支持包括 x86、arm、龍芯、海光等硬件 CPU 架構;支持 Linux、FreeBSD、OpenWrt 等多種核心的操作系統。

Flomesh 成立以來,以技術為根基、以客戶為導向,產品被應用在頭部股份制商業銀行總行、大型保險公司、運營商總部以及研究院等眾多客戶和多個場景。

加入 Flomesh 社區

添加小 P 成為好友,參與社區互動,享受豐富互動並獲取獨傢周邊禮品!

引用鏈接

[1] 安裝文檔: https://fsm-docs.flomesh.io/guides/traffic_management/ingress/fsm_gateway/installation/#installation
[2] Pipy: https://github.com/flomesh-io/pipy
[3] LoadBalancerPolicy: https://fsm-docs.flomesh.io/api_reference/policyattachment/v1alpha1/#gateway.flomesh.io/v1alpha1.LoadBalancerPolicy