ACK Gateway with Inference Extension 组件基于 Kubernetes Gateway API 及 Inference Extension 规范实现。结合 Knative Serverless 架构,该方案能够简化生成式 AI 推理服务的管理流程,支持在多个推理服务工作负载之间进行高效的七层路由和负载均衡,并根据请求并发数实现 GPU 资源的弹性伸缩。
工作原理
Gateway with Inference Extension 通过以下 CRD 扩展了 Gateway API 的能力,以适应 AI 推理场景。
InferencePool:逻辑上对 AI 模型服务资源进行分组。代表一组共享相同计算配置、加速器类型、基础模型和模型服务器的 Pod。一个 InferencePool 可跨越多个节点,提供高可用性。
InferenceObjective:定义模型服务的属性和目标。指定了 InferencePool 中 Pod 提供服务的模型名称以及关键性等级(Criticality)。标记为
Critical的工作负载将获得优先处理。
在 Knative 中,通过启用 AI 网关Annotation,Knative Service 将自动对接上述能力,实现流量的智能调度。
准备工作
已创建ACK托管集群Pro版且符合以下要求:
已部署Knative,请参见部署与管理Knative组件。
已安装 Gateway API 组件。
已安装 v1.4.0-apsara.4及以上版本的Gateway with Inference Extension组件,并在安装时勾选启用Gateway API推理扩展。
包含 GPU 节点,且单节点内存 ≥ 32 GiB(本文以运行 Qwen1.5-4B 为例),并通过节点标签(Labels)为节点添加指定标签(键
ack.aliyun.com/nvidia-driver-version,值为550.144.03)以指定驱动版本。建议 GPU 节点驱动版本为 550.144.03 或更高。可参见通过指定版本号自定义节点GPU驱动版本进行配置。
建议选择与集群相同的地域,可免内网流量费用,同时减少跨地域传输延迟。
步骤一:在 Knative 中开启 Gateway API 支持
修改 Knative 的网络配置,指定使用 Gateway API 作为 Ingress 控制器。
编辑config-network 的 ConfigMap。
kubectl edit configmap config-network -n knative-serving在
data字段下,修改ingress.class,然后保存修改。apiVersion: v1 data: ... # 修改ingress.class,使用Gateway API作为Ingress Controller ingress.class: gateway-api.ingress.networking.knative.dev ... kind: ConfigMap metadata: name: config-network namespace: knative-serving ...
查看修改是否生效。
kubectl get configmap config-network -n knative-serving -o yaml | grep "ingress.class"预期输出:
ingress.class: gateway-api.ingress.networking.knative.dev
步骤二:创建推理网关资源
创建 Gateway 资源以监听外部请求。本示例配置网关监听 8888 端口。
创建网关配置文件
knative-gateway.yaml。kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: knative-gateway namespace: knative-serving spec: gatewayClassName: ack-gateway listeners: - name: default port: 80 protocol: HTTP allowedRoutes: namespaces: from: All - name: llm-gw protocol: HTTP # 推理服务监听端口 port: 8888 allowedRoutes: namespaces: from: All部署网关资源。
kubectl apply -f knative-gateway.yaml查看网关状态。
kubectl get gateway knative-gateway -n knative-serving输出中,确保
PROGRAMMED为True且已分配 IP 地址(ADDRESS字段)。NAME CLASS ADDRESS PROGRAMMED AGE knative-gateway ack-gateway 47.XX.XX.198 True 22s
步骤三:准备模型数据并配置存储
为避免容器启动时重复下载模型,建议使用 OSS 静态存储卷挂载模型数据。
1. 下载模型并上传至 OSS
本步骤以 Qwen1.5-4B-Chat 模型为例。可临时购买一台ECS实例用于准备模型数据并在使用完成后释放。
下载模型到本地。
# 安装 Git LFS sudo yum install -y git git-lfs git lfs install # 克隆模型仓库(跳过校验以加速) GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/qwen/Qwen1.5-4B-Chat.git # 下载实际的大文件 cd Qwen1.5-4B-Chat git lfs pull使用 ossutil 将模型上传至 OSS Bucket。
请将
<Bucket-Name>替换为实际 OSS Bucket 名称。如需安装ossutil,请参见安装ossutil。
# 创建目录 ossutil mkdir oss://<Bucket-Name>/models/Qwen1.5-4B-Chat # 上传文件(-r 表示递归上传) ossutil cp -r ./ oss://<Bucket-Name>/models/Qwen1.5-4B-Chat
2. 配置PV和PVC
为提高模型加载性能,本示例创建 OSS 静态存储卷。操作详见使用ossfs 1.0静态存储卷。
创建 OSS 访问凭证(Secret)。
请替换
<AccessKey-ID>和<AccessKey-Secret>为实际信息。kubectl create secret generic oss-secret \ --from-literal=akId='<AccessKey-ID>' \ --from-literal=akSecret='<AccessKey-Secret>' \ --namespace default创建文件
oss-storage.yaml。apiVersion: v1 kind: PersistentVolume metadata: name: llm-model labels: alicloud-pvname: llm-model spec: capacity: storage: 30Gi # 访问模式 accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: oss csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: llm-model # 通过Secret对象来获取AccessKey信息 nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: # 请替换为实际OSS Bucket 名称 bucket: "<Your-Bucket-Name>" # Bucket所在地域的Endpoint url: "http://oss-cn-hangzhou-internal.aliyuncs.com" # OSS 中的相对路径 path: "/models/Qwen1.5-4B-Chat" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llm-model namespace: default spec: accessModes: - ReadWriteMany storageClassName: oss resources: requests: # 声明存储容量,不能大于存储卷总量 storage: 30Gi selector: matchLabels: # 通过PV标签精确匹配PV alicloud-pvname: llm-model部署PV和PVC。
kubectl apply -f oss-storage.yaml
步骤四:部署 Knative 推理服务
创建 Knative Service,启用 AI 网关功能,并配置 vLLM 引擎进行推理。
创建服务配置文件
qwen-service.yaml。关键配置说明:
knative.aliyun.com/ai-gateway: inference:启用推理网关扩展。autoscaling.knative.dev/metric: "concurrency":基于并发请求数进行自动伸缩。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: qwen namespace: default annotations: # 启用 AI 推理网关 knative.aliyun.com/ai-gateway: inference knative.aliyun.com/ai-gateway-inference-priority: "1" labels: release: qwen spec: template: metadata: annotations: # 弹性指标:并发数 autoscaling.knative.dev/metric: "concurrency" # 目标并发数 autoscaling.knative.dev/target: "2" # 最大实例数 autoscaling.knative.dev/max-scale: "3" # 最小实例数。大模型容器启动耗时较长,建议保留至少 1 个常驻实例,避免请求超时 autoscaling.knative.dev/min-scale: "1" labels: release: qwen spec: containers: - name: vllm-container image: ac2-registry.cn-hangzhou.cr.aliyuncs.com/ac2/vllm:0.4.1-ubuntu22.04 command: - sh - -c - python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --model /models/Qwen1.5-4B-Chat/ --gpu-memory-utilization 0.95 --max-model-len 8192 --dtype half ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 15 periodSeconds: 5 resources: limits: cpu: "32" memory: 64Gi # 申请 GPU 资源 nvidia.com/gpu: "1" requests: cpu: "8" memory: 32Gi nvidia.com/gpu: "1" volumeMounts: # 挂载路径需与启动命令中的 model 参数一致 - mountPath: /models/Qwen1.5-4B-Chat name: llm-model volumes: - name: llm-model persistentVolumeClaim: claimName: llm-model部署服务。
kubectl apply -f qwen-service.yaml查看部署进度(等待
Ready为True)。kubectl get ksvc qwen -n default
步骤五:验证推理服务
服务部署成功后,通过网关地址访问推理接口。
获取网关 IP。
export GATEWAY_HOST=$(kubectl -n knative-serving get gateway/knative-gateway -o jsonpath='{.status.addresses[0].value}') echo "网关地址: $GATEWAY_HOST"发送测试请求。
本步骤模拟一个 OpenAI 格式的对话请求。
curl http://${GATEWAY_HOST}:8888/v1/chat/completions \ -H "Host: qwen.default.example.com" \ -H "Content-Type: application/json" \ -d '{ "model": "/models/Qwen1.5-4B-Chat/", "messages": [ {"role": "user", "content": "请用一句话介绍Kubernetes"} ], "max_tokens": 50 }'终端应返回包含
choices字段的 JSON 数据,其中content包含模型的回答内容。
计费说明
Knative组件本身不产生额外费用。但在使用过程中产生的计算资源、网络资源等费用,由各云产品收取。例如:
详见云产品资源费用。
相关文档
支持在 Knative 中部署 A2A、部署 MCP Server,以利用其Serverless架构优势,实现AI服务的按需扩缩容、事件驱动等高级特性。