[feat] load balancing across different clusters and endpoints based on metrics (#3063)

This commit is contained in:
rinfx
2025-11-25 10:32:34 +08:00
committed by GitHub
parent 7a504fd67d
commit 42334f21df
12 changed files with 764 additions and 126 deletions

View File

@@ -15,13 +15,18 @@ description: 针对LLM服务的负载均衡策略
| 名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
|--------------------|-----------------|------------------|-------------|-------------------------------------|
| `lb_type` | string | 选填 | endpoint | 负载均衡类型,可选`endpoint`,`cluster` |
| `lb_policy` | string | 必填 | | 负载均衡策略类型 |
| `lb_config` | object | 必填 | | 当前负载均衡策略类型的配置 |
目前支持的负载均衡策略包括:
`lb_type``endpoint`支持的负载均衡策略包括:
- `global_least_request`: 基于redis实现的全局最小请求数负载均衡
- `prefix_cache`: 基于 prompt 前缀匹配选择后端节点,如果通过前缀匹配无法匹配到节点,则通过全局最小请求数进行服务节点的选择
- `least_busy`: [gateway-api-inference-extension](https://github.com/kubernetes-sigs/gateway-api-inference-extension/blob/main/README.md) 的 wasm 实现
- `endpoint_metrics`: 基于 llm 服务暴露的 metrics 进行负载均衡
`lb_type``cluster` 时支持的负载均衡策略包括:
- `cluster_metrics`: 基于网关统计的不同service的指标进行服务之间的负载均衡
# 全局最小请求数
## 功能说明
@@ -59,6 +64,7 @@ sequenceDiagram
## 配置示例
```yaml
lb_type: endpoint
lb_policy: global_least_request
lb_config:
serviceFQDN: redis.static
@@ -116,11 +122,12 @@ lb_config:
| `password` | string | 选填 | 空 | redis 密码 |
| `timeout` | int | 选填 | 3000ms | redis 请求超时时间 |
| `database` | int | 选填 | 0 | redis 数据库序号 |
| `redisKeyTTL` | int | 选填 | 1800ms | prompt 前缀对应的key的ttl |
| `redisKeyTTL` | int | 选填 | 1800s | prompt 前缀对应的key的ttl |
## 配置示例
```yaml
lb_type: endpoint
lb_policy: prefix_cache
lb_config:
serviceFQDN: redis.static
@@ -161,14 +168,73 @@ sequenceDiagram
| 名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
|--------------------|-----------------|------------------|-------------|-------------------------------------|
| `criticalModels` | []string | | | critical的模型列表 |
| `metric_policy` | string | | | 如何使用llm暴露的metrics做负载均衡当前支持`[default, least, most]` |
| `target_metric` | string | 选填 | | 要使用的metric名称`metric_policy` 取值为 `least` 或者 `most` 时生效 |
| `rate_limit` | string | 选填 | 1 | 单个节点处理请求比例上限取值范围0~1 |
## 配置示例
使用 [gateway-api-inference-extension](https://github.com/kubernetes-sigs/gateway-api-inference-extension/blob/main/README.md) 中的算法
```yaml
lb_type: endpoint
lb_policy: metrics_based
lb_config:
metric_policy: default
rate_limit: 0.6 # 单个节点承载的最大请求比例
```
根据当前排队请求数进行负载均衡
```yaml
lb_type: endpoint
lb_policy: metrics_based
lb_config:
metric_policy: least
target_metric: vllm:num_requests_waiting
rate_limit: 0.6 # 单个节点承载的最大请求比例
```
根据当前GPU中正在处理的请求数进行负载均衡
```yaml
lb_type: endpoint
lb_policy: metrics_based
lb_config:
metric_policy: least
target_metric: vllm:num_requests_running
rate_limit: 0.6 # 单个节点承载的最大请求比例
```
# 跨服务负载均衡
## 配置说明
| 名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
|--------------------|-----------------|------------------|-------------|-------------------------------------|
| `mode` | string | 必填 | | 如何使用服务级指标做负载均衡,当前支持`[LeastBusy, LeastTotalLatency, LeastFirstTokenLatency ]` |
| `service_list` | []string | 必填 | | 路由后端服务列表 |
| `rate_limit` | string | 选填 | 1 | 单个服务处理请求比例上限取值范围0~1 |
| `cluster_header` | string | 选填 | `x-envoy-target-cluster` | 通过取该header的值得知需要路由到哪个后端服务 |
| `queue_size` | int | 选填 | 100 | 根据最近的多少个请求进行观测指标的计算 |
`mode` 各取值含义如下:
- `LeastBusy`: 路由到当前并发请求数最少的服务
- `LeastTotalLatency`: 路由到当前RT最低的服务
- `LeastFirstTokenLatency`: 路由到当前首包RT最低的服务
## 配置示例
```yaml
lb_policy: least_busy
lb_type: cluster
lb_policy: cluster_metrics
lb_config:
criticalModels:
- meta-llama/Llama-2-7b-hf
- sql-lora
mode: LeastTotalLatency # 策略名称
queue_size: 100 # 统计指标时使用的最近请求数
rate_limit: 0.6 # 单个服务承载的最大请求比例
service_list:
- outbound|80||test-1.dns
- outbound|80||test-2.static
```