生产部署与运维
生产部署与运维
把模型跑通
localhost只是第一步。生产要的是:可水平扩展、可观测、可恢复、成本可控、安全可控。本文覆盖 Docker/K8s 部署、API 网关、监控、扩缩容、安全。
一、单机 Docker 部署 vLLM
# 直接用官方镜像
docker run --gpus all --shm-size=1g -p 8000:8000 \
-v /models:/models \
vllm/vllm-openai:latest \
--model /models/Qwen2.5-7B-Instruct \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.90 \
--enable-prefix-caching
--shm-size给 PagedAttention 的 block 表足够共享内存--gpus all需 nvidia-container-toolkit
二、K8s 部署(生产形态)
2.1 基础 Deployment + Service
apiVersion: apps/v1
kind: Deployment
metadata: { name: vllm-7b }
spec:
replicas: 2
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args: ["--model","Qwen/Qwen2.5-7B-Instruct","--tensor-parallel-size","1"]
resources:
limits: { nvidia.com/gpu: 1, memory: 32Gi }
ports: [{ containerPort: 8000 }]
readinessProbe:
httpGet: { path: /health, port: 8000 }
---
apiVersion: v1
kind: Service
metadata: { name: vllm-7b-svc }
spec:
selector: { app: vllm-7b }
ports: [{ port: 80, targetPort: 8000 }]
2.2 GPU 调度要点
- 用 GPU 资源声明
nvidia.com/gpu: 1(扩展器按卡分配) - 多卡 TP 必须 同节点(TP 走 NVLink),用
nodeSelector或podAntiAffinity的反面约束到单节点 - 长上下文/高并发要 大显存卡(H100 80GB / A100 80GB)
- 节点断电/驱逐:模型权重在本地或 PVC,重启后需重新加载(冷启动慢,建议预热)
2.3 进阶:GPU Operator + MIG
- MIG(A100/H100)把一张卡切成多个实例,适合小模型多副本隔离
- 配合 Cilium 做 Pod 网络策略与可观测
三、统一 API 网关(多模型/多引擎)
多个模型/引擎共存时,用网关做路由、限流、鉴权、fallback:
| 网关 | 特点 |
|---|---|
| LiteLLM | 统一 OpenAI 格式,路由到 vLLM/SGLang/云厂商,含预算/限流 |
| Higress / APISIX | 云原生网关,插件化限流/鉴权/灰度 |
| 自研 Envoy | 最灵活,但成本高 |
# LiteLLM 路由示例
model_list:
- model_name: qwen-7b
litellm_params: { model: "openai/qwen2.5-7b", api_base: "http://vllm-7b-svc:80" }
- model_name: qwen-72b
litellm_params: { model: "openai/qwen2.5-72b", api_base: "http://vllm-72b-svc:80" }
router_settings: { enable_pre_call_checks: true, max_parallel_requests: 100 }
四、关键监控指标
4.1 业务指标(SLO 核心)
| 指标 | 含义 | 告警建议 |
|---|---|---|
| TTFT | 首 token 延迟 | p99 > 2s 告警 |
| TPOT | 每 token 间隔 | p99 > 100ms 告警 |
| Throughput | 总 token/s | 低于基线 70% 查因 |
| Queue length | 排队请求数 | 持续 > 0 说明容量不足 |
| Error rate | 5xx 比例 | > 1% 告警 |
4.2 资源指标
vllm:gpu_cache_usage_sys:KV Cache 占用(>0.9 危险,见 KV Cache 原理与 PagedAttention)vllm:num_preemptions:抢占次数(>0 说明 KV 不够)DCGM_FI_PROF_GPU_UTIL:GPU 利用率DCGM_FI_PROF_DRAM_ACTIVE:HBM 带宽利用率(decode 瓶颈信号)
4.3 采集链路
vLLM /metrics → Prometheus → Grafana 看板
DCGM-exporter → Prometheus(GPU 指标)
Hubble (若 Cilium) → 网络层可观测
五、自动扩缩容
LLM 服务扩缩比普通服务难(模型大、冷启动慢):
方案A:固定副本 + 队列缓冲
→ 简单,适合流量平稳;波峰靠排队吸收
方案B:基于 GPU 利用率 / 队列长度 HPA
→ K8s HPA 自定义指标:queue_length > N 扩副本
→ 冷启动慢(加载权重 10-60s),需预热或缩容保护
方案C:分离式 + 独立扩缩 prefill/decode 池
→ 见 [[高并发调度与吞吐优化]],弹性最佳但架构复杂
实践建议:按”模型大小”分组部署(小模型多副本易扩、大模型少副本稳),配合网关限流兜底。
六、成本控制
| 杠杆 | 做法 |
|---|---|
| 量化 | 权重 INT4/FP8(见 LLM 推理量化部署)降显存 → 可用更小/更少卡 |
| 复用 | Prefix Cache 降重复 prefill 算力 |
| 调度 | 低谷缩容、spot 实例跑非核心 |
| 路由 | 简单任务路由小模型,省大模算力 |
| 能效 | 关注 tokens/watt(见 推理性能基准测试与调优) |
七、安全
| 风险 | 措施 |
|---|---|
| 未授权调用 | API 网关鉴权(key/OAuth)、网络策略隔离 |
| 提示注入/越权 | 输入校验、输出过滤、权限最小化 |
| 资源滥用 | 限流(per-key RPM/TPM)、max_tokens 上限 |
| 模型文件篡改 | 权重签名校验、私有模型仓库 + 镜像扫描 |
| 数据泄露 | 请求日志脱敏、不落盘用户 prompt |
与 K8s 安全加固、Cilium 网络策略 联动,构成推理服务的纵深防御。
关联知识
- LLM 推理服务化知识总览 — 系列定位
- LLM 推理引擎对比与选型 — 部署选哪个引擎
- KV Cache 原理与 PagedAttention — 监控指标来源
- 高并发调度与吞吐优化 — 扩缩容/分离式架构基础
- 推理性能基准测试与调优 — 容量规划与压测
- ../cilium/Cilium 知识总览 — Pod 网络与零信任
- ../k8s/网络架构/K8s 网络架构总览 — K8s 网络底座
- ../network/HTTP 与 WebSocket 连接模型与超时 — 网关传输层选型(SSE vs WebSocket)与首包超时兜底
参考资源
学习时间
| 阶段 | 时间 | 备注 |
|---|---|---|
| 内容创建 | 2026-07-20 | Docker/K8s 部署、API 网关、监控指标、扩缩容、成本、安全 |
状态标记
📖 已掌握 — K8s 部署形态、网关路由、监控指标、扩缩容难点、安全要点 📝 待补充 — Helm chart 实例、KServe/Triton 集成、spot 实例实战