當前位置: 妍妍網 > 碼農

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

2024-01-27碼農

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:
    gateway className: 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