当 ACK 集群对接外部 MaaS 服务(如百炼)时,为统一处理 API 密钥和请求路径,可基于AI推理网关(Gateway with Inference Extension),配置路由规则(HTTPRoute),实现请求凭证的自动注入及URL重写,从而快速集成模型服务。
工作原理
Gateway with Inference Extension是基于Kubernetes Gateway API的增强,可构建从客户端到外部MaaS(Model as a Service)服务的路由链路。以访问百炼为例,核心处理流程如下:
接收请求:客户端的请求首先到达网关(Gateway)。
路由与过滤:Gateway 根据 HTTPRoute 路由规则进行匹配。匹配成功后,请求将按顺序经过 HTTPRoute 中定义的过滤器链(Filter Chain)进行处理:
凭证注入 (
ExtensionRef):从预先创建的 Kubernetes Secret 中获取API Key,并自动注入到请求头的Authorization字段中,实现认证凭证的统一管理和自动注入。路径重写 (
URLRewrite):对请求路径进行重写(例如,将/v1重写为/compatible-mode/v1),以适配百炼服务要求的API格式。
后端请求:经过过滤器链处理后的请求,被发送至 HTTPRoute 中引用的 Backend 资源。
转发请求:Backend资源将请求转发到定义好的外部大模型服务平台百炼。
步骤一:开启组件功能
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
在组件管理页面,搜索Gateway with Inference Extension,在组件卡片中单击安装,在弹出的对话框中,勾选启用Gateway API推理扩展,按提示完成安装操作。请确保组件版本在1.4.0以上。
在组件管理页面,搜索Gateway API,在组件卡片中单击配置,在弹出的对话框中,勾选启用实验性通道功能,并单击确认。
步骤二:获取API Key并创建Secret
为使网关能够访问百炼服务,需将API Key存储在集群的保密字典(Secret)中,供后续网关路由配置引用。
将
<YOUR_BAILIAN_API_KEY>替换成实际的百炼API Key。export TOKEN=<YOUR_BAILIAN_API_KEY>创建Secret,存入百炼API Key。
kubectl create secret generic bailian-credential --from-literal=credential="Bearer $TOKEN"
步骤三:创建后端服务
Backend:声明并向网关注册外部百炼服务
dashscope.aliyuncs.com。BackendTLSPolicy:指定网关需以HTTPS协议与百炼服务进行通信。
将以下YAML内容保存为
maas-policy.yaml文件。apiVersion: gateway.envoyproxy.io/v1alpha1 kind: Backend metadata: name: bailian spec: endpoints: - fqdn: # 百炼服务的域名和端口 hostname: dashscope.aliyuncs.com port: 443 --- apiVersion: gateway.networking.k8s.io/v1alpha3 kind: BackendTLSPolicy metadata: name: enable-backend-tls spec: # 将策略应用到名为bailian的后端 targetRefs: - group: gateway.envoyproxy.io kind: Backend name: bailian validation: hostname: dashscope.aliyuncs.com wellKnownCACertificates: System创建后端资源。
kubectl apply -f maas-policy.yaml
步骤四:创建网关并配置路由规则
Gateway:声明一个监听HTTP协议、
8080端口的网关。HTTPRoute:指定网关上的路由规则,转发到百炼服务
dashscope.aliyuncs.com时,将请求中以/v1开头的路径的请求重写为/compatible-mode/v1,以实现与百炼API的兼容。HTTPRouteFilter:定义请求百炼时凭证注入逻辑。凭据默认将被注入到
Authorization标头中。如请求中已存在Authorization标头或指定的标头,只有将overwrite设置为true,凭据才会被注入。
将以下YAML内容保存为gateway-route.yaml文件,然后执行kubectl apply -f gateway-route.yaml命令。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: bailian-gateway
spec:
gatewayClassName: ack-gateway
listeners:
- name: http-bailian
protocol: HTTP
port: 8080
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: HTTPRouteFilter
metadata:
name: credential-injection
spec:
credentialInjection:
overwrite: true
# 引用步骤二中创建的Secret
credential:
valueRef:
name: bailian-credential
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: bailian-route
spec:
# 绑定到bailian-gateway
parentRefs:
- name: bailian-gateway
rules:
- backendRefs:
- group: gateway.envoyproxy.io
kind: Backend
name: bailian
filters:
# 过滤器执行顺序:先重写,后注入凭证
- type: URLRewrite
urlRewrite:
hostname: dashscope.aliyuncs.com
path:
type: ReplacePrefixMatch
replacePrefixMatch: /compatible-mode/v1
- type: ExtensionRef
extensionRef:
group: gateway.envoyproxy.io
kind: HTTPRouteFilter
name: credential-injection
matches:
# 匹配所有以/v1开头的请求
- path:
type: PathPrefix
value: /v1步骤五:验证路由配置
获取网关地址。
export GATEWAY_HOST=$(kubectl get gateway/bailian-gateway -o jsonpath='{.status.addresses[0].value}')发起测试请求。
curl http://$GATEWAY_HOST:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3-32b", "messages": [ {"role": "user", "content": "你好,这是一个测试"} ], "enable_thinking": false }' -v预期输出:
{ "choices": [ { "message": { "content": "你好!这是一个测试,对吧?有什么我可以帮忙的吗?", "reasoning_content": "", "role": "assistant" }, "finish_reason": "stop", "index": 0, "logprobs": null } ], "object": "chat.completion", "usage": { "prompt_tokens": 16, "completion_tokens": 15, "total_tokens": 31 }, "created": 1758263453, "system_fingerprint": null, "model": "qwen3-32b", "id": "chatcmpl-bb0d1343-cff5-41ae-a229-1e1f5ffc73eb" }
计费说明
百炼模型推理费用,请参见计费说明。