当 AI 遇到 Kubernetes:在生产环境部署与管理 AI 服务的终极指南
AI 服务正在成为微服务架构中的一等公民。但如何将推理服务、RAG 服务、Agent 服务稳定地运行在 Kubernetes 上?GPU 如何调度?模型如何更新?弹性如何实现?本文将从实战出发,系统讲解在 K8s 上部署和管理 AI 服务的核心技术与最佳实践。
目录
为什么要在 Kubernetes 上运行 AI 服务?
挑战与K8s的解题思路
GPU 调度:从基础到进阶
3.1 启用 GPU 支持
3.2 节点选择与资源预留
3.3 多实例共享 GPU(MIG / vGPU)
3.4 GPU 指标监控与弹性伸缩
AI 服务的 K8s 部署模式
4.1 推理服务:Deployment + HPA
4.2 RAG 服务:搭配向量数据库的 StatefulSet
4.3 Agent 服务:事件驱动与异步任务
4.4 记忆服务:有状态与持久化存储
网络与流量管理
5.1 gRPC 负载均衡与服务网格
5.2 模型版本的金丝雀发布
使用 Argo CD 落地 GitOps
6.1 AI 服务的 App of Apps 管理
6.2 模型配置与镜像同步更新
监控与可观测性
成本优化与冷启动缓解
总结:让 AI 服务像普通微服务一样可靠
1. 为什么要在 Kubernetes 上运行 AI 服务?
你可能听过“AI 服务应该跑在专用 GPU 服务器上,由 Python FastAPI 单独管理”。但在 2026 年的今天,当你的整个业务已经容器化并跑在 K8s 上时,让 AI 服务成为 Kubernetes 集群的一部分会带来巨大收益:
统一编排:不再需要为 AI 工作负载维护独立的部署系统,K8s 统一管理 CPU 和 GPU 节点。
声明式与自愈:Pod 挂了自动重启,节点宕机自动漂移,这是生产 AI 服务的基本可靠性保障。
弹性伸缩:根据请求负载自动增减推理实例,应对峰值流量。
多租户与资源隔离:不同团队的 AI 服务可以共享 GPU 节点,通过 namespace 和 ResourceQuota 分配算力。
GitOps 友好:借助 Argo CD 等工具,AI 服务的配置、模型版本、部署策略都可以版本化并自动同步。
Kubernetes 已经成为云原生的事实标准,AI 服务没有理由例外。
2. 挑战与 K8s 的解题思路
AI 服务在 K8s 上运行并非天然简单,主要挑战在于:
| 挑战 | K8s 解题思路 |
|---|---|
| GPU 资源稀缺,需要精细调度 | Device Plugin + Node Selector + 亲和性调度 |
| 模型文件大,镜像臃肿 | Init Container 拉取模型到共享 PV,或使用模型网关 |
| 推理延迟敏感,服务发现要低开销 | gRPC 长连接 + Istio/Envoy 无代理模式 |
| 模型更新频繁,需要灰度验证 | 金丝雀发布 + 流量分割 + Prometheus 指标对比 |
| 成本易失控 | HPA 自定义指标缩容 + 竞价节点 + GPU 共享 |
| 多 AI 服务协作(推理/RAG/Agent) | 服务网格统一治理 + 事件驱动架构 |
Kubernetes 丰富的扩展机制恰恰可以一一化解这些痛点。
3. GPU 调度:从基础到进阶
3.1 启用 GPU 支持
K8s 通过Device Plugin机制暴露 GPU 资源。你需要在 GPU 节点上安装 NVIDIA 驱动和nvidia-device-plugin:
bash
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/main/nvidia-device-plugin.yml
安装后,节点会报告nvidia.com/gpu资源,Pod 只需声明即可使用:
yaml
resources: limits: nvidia.com/gpu: 1
3.2 节点选择与资源预留
为避免非 GPU 工作负载占用 GPU 节点,使用nodeSelector或nodeAffinity精确调度:
yaml
nodeSelector: accelerator: nvidia-t4
同时,在 GPU 节点上设置Taint/Toleration防止普通 Pod 落入:
bash
kubectl taint nodes gpu-node1 nvidia.com/gpu=true:NoSchedule
Pod 侧需要添加 Toleration 才能调度上去。
3.3 多实例共享 GPU(MIG / vGPU)
对于轻量级推理(如 QLoRA 小模型),一张 GPU 远未跑满。利用 NVIDIA MIG(Multi-Instance GPU)或第三方 vGPU 方案,可将一张物理 GPU 切分为多个逻辑 GPU,供多个推理实例共享。
启用 MIG 后,节点会暴露多个nvidia.com/mig-<slice>资源,每个 Pod 请求一小片即可。
3.4 GPU 指标监控与弹性伸缩
K8s 原生 HPA 仅支持 CPU/内存。要基于 GPU 利用率或推理请求队列长度伸缩,需要安装Prometheus Adapter和DCGM(Data Center GPU Manager)导出 GPU 指标。
一个典型的基于 GPU 利用率的 HPA 配置(需要自定义指标):
yaml
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: inference-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: inference-service metrics: - type: Pods pods: metric: name: gpu_utilization target: type: AverageValue averageValue: 70 minReplicas: 1 maxReplicas: 10
对于突发流量,更推荐使用请求队列长度或并发请求数作为伸缩指标,更贴近实际业务压力。
4. AI 服务的 K8s 部署模式
对应 AI-Integrated 架构中的四类服务,我们来看各自的 K8s 部署范式。
4.1 推理服务:Deployment + HPA
推理服务是无状态的,直接用 Deployment 管理。例如部署一个 vLLM 推理引擎:
yaml
apiVersion: apps/v1 kind: Deployment metadata: name: inference-vllm spec: replicas: 2 selector: matchLabels: app: inference-vllm template: metadata: labels: app: inference-vllm spec: nodeSelector: accelerator: nvidia-a100 containers: - name: vllm image: vllm/vllm-openai:latest args: ["--model", "meta-llama/Llama-3-70B", "--port", "8000"] ports: - containerPort: 8000 resources: limits: nvidia.com/gpu: 1 volumeMounts: - name: model-cache mountPath: /models readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 60 volumes: - name: model-cache persistentVolumeClaim: claimName: model-cache-pvc
使用readinessProbe确保模型完全加载后才接收流量。
模型文件通过 PVC 持久化,避免每次拉取。
4.2 RAG 服务:搭配向量数据库的 StatefulSet
RAG 服务通常需要向量数据库(如 Milvus、Qdrant)和文档处理流程。向量数据库本身是有状态的,应使用 StatefulSet 部署:
yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: qdrant spec: serviceName: qdrant replicas: 3 selector: matchLabels: app: qdrant template: # ... 容器定义,挂载持久化存储 volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 100Gi
RAG 服务本身可以作为一个 Deployment,通过 gRPC 调用推理服务,通过客户端库连接向量数据库。它们之间的交互完全在集群内完成,低延迟高安全。
4.3 Agent 服务:事件驱动与异步任务
Agent 服务的执行耗时可能长达数分钟,适合用事件驱动模式。可以使用 Knative Eventing 或简单的消息队列(Kafka、NATS)驱动:
text
用户请求 → 业务服务 → 发布事件 → Agent 服务订阅 → 调用推理/工具 → 回调业务服务
Agent 服务部署为 Deployment 或 KEDA(Kubernetes Event-driven Autoscaling)自动伸缩,可根据消息积压量扩展实例。
yaml
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: agent-scaler spec: scaleTargetRef: name: agent-service triggers: - type: kafka metadata: bootstrapServers: kafka:9092 consumerGroup: agent-group topic: agent-tasks lagThreshold: "5"
4.4 记忆服务:有状态与持久化存储
记忆服务需要存储用户画像、对话历史,通常依赖图数据库或键值数据库。同样使用 StatefulSet + PVC 实现持久化,并可以配合读写分离设计。
5. 网络与流量管理
5.1 gRPC 负载均衡与服务网格
AI 服务间通信多采用 gRPC(流式推理、低延迟)。但 K8s 原生 Service 的负载均衡对 gRPC 不友好(长连接导致流量不均)。解决方案:
使用 Istio / Linkerd 等服务网格:它们能理解 gRPC 协议,自动实现连接级负载均衡。
使用 headless Service + gRPC 客户端负载均衡(如 gRPC DNS resolver)。
Istio 的 DestinationRule可配置一致性哈希,将相同会话的请求路由到同一推理实例以利用 KV-cache。
5.2 模型版本的金丝雀发布
推理服务模型版本更新频繁,借助 Istio 的流量分割可以轻松实现金丝雀:
yaml
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: inference-vs spec: hosts: - inference http: - match: - headers: model-version: exact: v2 route: - destination: host: inference subset: v2 weight: 10 - route: - destination: host: inference subset: v1 weight: 90
配合 Prometheus 监控新旧版本的错误率、延迟和 token 质量,决定是否全量切换。
6. 使用 Argo CD 落地 GitOps
我们已经在之前的文章中搭建了 Argo CD,现在就用它来管理所有的 AI 服务。
6.1 AI 服务的 App of Apps 管理
在 Git 仓库中组织 AI 服务层配置:
text
ai-services/ ├── app-of-apps.yaml ├── inference/ │ ├── deployment.yaml │ ├── service.yaml │ └── hpa.yaml ├── rag/ │ ├── deployment.yaml │ └── qdrant-statefulset.yaml ├── agent/ │ ├── deployment.yaml │ └── scaledobject.yaml └── memory/ ├── deployment.yaml └── neo4j-statefulset.yaml
创建一个父 Application,指向此目录,Argo CD 将自动管理所有子应用。任何人对模型的更新(如修改推理 Deployment 的镜像 tag)只需要提 PR 到 Git,Argo CD 自动同步。
6.2 模型配置与镜像同步更新
模型变更通常涉及:
新模型文件上传到对象存储 → 更新 PVC 中的模型(或通过 Init Container 预热)
推理服务镜像 tag 变更(若模型打包在镜像内)或启动参数更改
推荐将模型以卷的形式挂载,镜像保持不变。这样模型更新只需替换卷数据,Pod 滚动重启即可,无需重新构建镜像。
结合 CI 流水线,当模型训练平台发布新版本时,触发 Argo CD 的同步或直接通过 API 更新 Application 的参数(如 Helm values),实现端到端自动化。
7. 监控与可观测性
AI 服务除了常规的 RED 指标(Rate/Errors/Duration),还要关注:
GPU 利用率、显存、温度:通过 DCGM Exporter → Prometheus → Grafana 仪表板。
推理延迟分布:P50/P95/P99,尤其关注长尾延迟。
Token 消耗与成本:每条请求的 token 数,汇总到成本看板。
模型版本与性能指标:在 Prometheus 中打上
model_version标签,对比不同版本的性能。
Istio 的分布式追踪(Jaeger)可以串联业务服务 → AI 服务层的完整调用链,定位延迟瓶颈。
8. 成本优化与冷启动缓解
GPU 很贵,必须精打细算:
竞价/可抢占实例:在云上使用 Spot 实例运行非关键的推理副本,配合 K8s 的 PodDisruptionBudget 保证可用性。
GPU 共享:使用 MIG、Time-slicing 或 vCUDA 方案提升 GPU 利用率。
模型预热:冷启动时加载大模型可能耗时几分钟。可以在集群中保留一小批“暖备” Pod,或通过 Init Container 在 Pod 启动前将模型预热到 GPU 显存。
弹性缩容到零:对于低频使用的 Agent 或 RAG 服务,可通过 KEDA 支持缩容到 0,触发请求时自动唤醒,虽然有一定启动延迟,但大幅节省成本。
9. 总结:让 AI 服务像普通微服务一样可靠
Kubernetes 为 AI 服务提供了统一的运行平台,使其能够融入现有的云原生生态。GPU 调度、弹性伸缩、服务网格、GitOps 这些曾经只属于业务微服务的能力,如今同样适用于推理、RAG、Agent 和记忆服务。
2026 年,我们不再把 AI 当作特殊的“魔法”组件,而是以一种工程化的方式将其落地——这就是 AI-Integrated 微服务的真谛。Kubernetes,正是承载这场融合的最佳基座。
如果你在 K8s 上部署 AI 服务时遇到过哪些坑?或者有独家的优化经验?欢迎在评论区分享,一起推动 AI 工程化的成熟。