配置基于正文的路由


了解如何配置基于正文的路由。GKE 推理网关的这项功能可让您通过直接从 HTTP 请求正文中提取模型名称来路由推理请求。

这对于遵循 OpenAI API 等规范的应用特别有用,因为这些规范的模型标识符通常嵌入在请求载荷中,而不是在标头或网址路径中。

基于身体的路由的工作原理

GKE 推理网关将基于正文的路由实现为 Envoy 代理的 ext_proc 扩展程序。请求流程旨在与您现有的 Gateway API 配置无缝集成:

  1. 接收请求:第 7 层负载均衡器接收传入的推理请求。
  2. 正文参数提取:第 7 层负载均衡器将请求转发到“正文到标头”扩展程序。此扩展程序从 HTTP 请求正文中提取标准 model 参数。
  3. 标头注入:提取的模型形参的值随后会作为新的请求标头(键为 X-Gateway-Model-Name)注入。
  4. 路由决策:现在,请求标头中包含模型名称,GKE 推理网关可以使用现有的 Gateway API HTTPRoute 构造来做出路由决策。例如,HTTPRoute 规则可以与注入的标头匹配,以将流量定向到相应的 InferencePool
  5. 端点选择:第 7 层负载均衡器选择适当的 InferencePool (BackendService) 和端点组。然后,它会将请求和端点信息转发给 Endpoint Picker 扩展程序,以便在所选池中进行精细的端点选择。
  6. 最终路由:请求会路由到端点选择器扩展程序选择的特定模型副本。

此过程可确保即使模型信息位于请求正文深处,GKE 推理网关也能智能地将流量路由到正确的后端服务。

配置基于正文的路由

GKE 推理网关的基于正文的路由 (BBR) 扩展程序以您在 Kubernetes 集群中管理的服务的形式运行。从第 7 层负载均衡器的角度来看,BBR 扩展程序是一个外部 gRPC 服务器。当负载均衡器需要检查请求正文以确定模型名称时,它会向 BBR 服务发出 gRPC 调用。然后,BBR 服务会处理请求,并向负载均衡器返回信息,例如要注入以进行路由的标头。

如需启用基于正文的路由,请将 BBR 扩展程序部署为 Pod,并使用 GCPRoutingExtensionHTTPRoute 资源进行集成。

前提条件

部署基于身体的路由器

基于正文的路由扩展程序部署为 Kubernetes Deployment 和 Service,以及集群中的 GCPRoutingExtension 资源。您可以使用 Helm 来简化安装。

如需为基于身体的路由器部署所需资源,请运行以下命令:

helm install body-based-router oci://registry.k8s.io/gateway-api-inference-extension/charts/body-based-routing \
    --set provider.name=gke \
    --set inferenceGateway.name=GATEWAY_NAME

GATEWAY_NAME 替换为您的网关资源的名称。

此命令会部署以下资源:

  • 基于身体的路由扩展服务的 Service 和 Deployment。
  • 一个 GCPRoutingExtension 资源和一个 GCPHealthCheckPolicy 资源,用于将基于正文的路由扩展程序附加到您的 GKE Gateway 资源。

为模型感知路由配置 HTTPRoute

部署并配置扩展程序后,您可以定义使用注入的标头 (X-Gateway-Model-Name) 来做出路由决策的 HTTPRoute 资源。

以下是用于实现模型感知型路由的 HTTPRoute 清单示例:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: routes-to-llms
spec:
  parentRefs:
  - name: GATEWAY_NAME
  rules:
  - matches:
    - headers:
      - type: Exact
        name: X-Gateway-Model-Name
        value: chatbot # Matches the extracted model name
      path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: gemma # Target InferencePool for 'chatbot' model
      kind: InferencePool
      group: "inference.networking.k8s.io"
  - matches:
    - headers:
      - type: Exact
        name: X-Gateway-Model-Name
        value: sentiment # Matches another extracted model name
      path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: llama # Target InferencePool for 'sentiment' model
      kind: InferencePool
      group: "inference.networking.k8s.io"

如需将此清单应用于集群,请将其另存为 httproute-for-models.yaml,然后运行以下命令:

kubectl apply -f httproute-for-models.yaml

注意事项和限制

在规划基于身体的路由实现时,请考虑以下事项:

  • 故障关闭行为:基于身体的路由扩展程序旨在以“故障关闭”模式运行。如果扩展程序不可用或无法处理请求,则会导致错误(例如,如果未配置默认后端,则会返回 404 或 503 响应代码),而不是错误地路由。 确保部署具备高可用性,以维持服务可靠性。

  • 请求正文大小和流式传输:处理大型 HTTP 请求正文(尤其是启用流式传输时)可能会带来复杂性。如果强制 Envoy 代理对请求正文进行流式传输(通常是针对大于 250 KB 的正文),则该代理可能无法注入新标头。这可能会导致路由失败(例如,如果无法应用标头匹配规则,则会显示 404 错误)。

  • 长期维护:基于正文的路由扩展程序作为组件在 GKE 集群中运行。您负责其生命周期管理,包括升级、安全补丁和确保其持续运行。

后续步骤