ACK Gateway with Inference Extension 組件基於 Kubernetes Gateway API 及 Inference Extension 規範實現。結合 Knative Serverless 架構,該方案能夠簡化產生式 AI 推理服務的管理流程,支援在多個推理服務工作負載之間進行高效的七層路由和負載平衡,並根據請求並發數實現 GPU 資源的Auto Scaling。
工作原理
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 為例),並通過節點標籤為節點添加指定標籤(鍵
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服務的按需擴縮容、事件驅動等進階特性。