FSM Gateway 流量管理策略系列:
- 故障注入
- 黑白名单访问控制
- 限速
- 重试
- 会话保持
- 健康检查
- 负载均衡算法
- TLS 上游
- 双向 TLS
在微服务和 API 网关架构中,负载均衡是至关重要的,它确保每个服务实例都能平均地处理请求,同时也为高可用性和故障恢复提供了机制。FSM Gateway 提供了多种负载均衡算法,让可以根据业务需求和流量模式选择最适合的方法。
支持多种负载均衡算法,方便高效地分配流量,最大化资源利用率,提高服务的响应时间:
- RoundRobinLoadBalancer:这是最常见的负载均衡算法,请求将按顺序分配给每个服务实例。如果不特别指定,FSM Gateway 默认使用此算法。
- HashingLoadBalancer:根据请求的某些属性(如来源 IP 或请求头)计算哈希值,然后根据该哈希值将请求路由到特定的服务实例。这确保了相同的请求者或相同类型的请求总是被路由到同一服务实例。
- LeastConnectionLoadBalancer:这种算法会考虑每个服务实例的当前工作负载(连接数),并将新的请求分配给当前负载最小的实例,从而确保更均匀的资源利用。
前置条件
- Kubernetes 集群
- kubectl 工具
环境准备
安装 FSM Gateway
FSM Gateway 的安装,可以参考 安装文档。这里选择 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 来模拟的。
kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: pipy
spec:selector:app: pipyports:- protocol: TCPport: 8080targetPort: 8080---
apiVersion: v1
kind: Pod
metadata:name: pipy-1labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},'Hello, world'))"]---
apiVersion: v1
kind: Pod
metadata:name: pipy-2labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["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-clslisteners:- protocol: HTTPport: 8000name: httpallowedRoutes:namespaces:from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:name: fortio-route
spec:parentRefs:- name: simple-fsm-gatewayport: 8000rules:- matches:- path:type: PathPrefixvalue: /backendRefs:- name: pipyport: 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, worldcurl http://$GATEWAY_IP:8000/
Hello, worldcurl http://$GATEWAY_IP:8000/
Hi, world
负载均衡策略验证
负载均衡策略的配置可以参考文档 LoadBalancerPolicy。
轮询负载均衡算法
使用 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: Servicename: pipynamespace: serverports:- port: 8080type: 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: Servicename: pipynamespace: serverports:- port: 8080type: 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 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。