I·Infra Notes AI Infra 工程实践指南 ← 返回主博客
生产服务与端侧 / READING NOTES

16.1 容器与 Kubernetes:启动、就绪、存活三种状态

Kubernetes、监控、路由、扩缩容与容量成本

固定镜像 digest / tag、模型 revision / 文件校验、驱动与库版本。容器内模型目录、共享内存、CPU / 主机内存、GPU device plugin 和存储吞吐都属于运行条件;只申请 GPU 数量不能保证整个服务资源足够。vLLM Kubernetes 部署

vLLM Production Stack 提供 Kubernetes 集群部署的参考系统;KServe 用 InferenceService 等资源组织模型服务。选用这些方案时仍需检查镜像、模型挂载、路由、扩缩容和可观测性;平台不会自动确定本业务的 SLO 容量。先用单副本跑通请求与探针,再扩展副本和控制器。

探针 问题 避免的错误
Startup 下载、加载、编译 / 捕获完成了吗 正常慢启动被不断重启
Readiness 当前实例适合接收新请求吗 模型未就绪就分配流量
Liveness 进程是否失去恢复能力 将短时拥塞误判成死锁

配置 startup probe 后,Kubernetes 在启动成功前不会执行 readiness / liveness;失败阈值需覆盖正常启动分布,而非凭一个固定秒数猜测。Kubernetes Probe 语义

# Deployment 的 Pod template 片段;镜像、PVC、模型名需替换。
spec:
  terminationGracePeriodSeconds: 120
  containers:
    - name: inference
      image: "vllm/vllm-openai:<pinned-tag>"
      args: ["--model", "/models/model", "--host", "0.0.0.0", "--port", "8000"]
      ports:
        - containerPort: 8000
      resources:
        requests:
          cpu: "4"
          memory: "16Gi"
          nvidia.com/gpu: "1"
        limits:
          memory: "16Gi"
          nvidia.com/gpu: "1"
      volumeMounts:
        - name: models
          mountPath: /models
          readOnly: true
      startupProbe:
        httpGet: {path: /health, port: 8000}
        periodSeconds: 10
        failureThreshold: 60
      readinessProbe:
        httpGet: {path: /health, port: 8000}
        periodSeconds: 10
      livenessProbe:
        httpGet: {path: /health, port: 8000}
        periodSeconds: 30
        failureThreshold: 3
  volumes:
    - name: models
      persistentVolumeClaim: {claimName: model-weights}

资源值与时间阈值只是示例;模型、Graph、KV 与长请求可能需要更多 CPU / 内存。/health 反映进程健康,不一定保证有容量满足新请求 SLO,admission 与负载信号另外实现。上线先测正常慢启动、依赖失败和持续拥塞,确保探针不会导致重启风暴。

关闭时先停止接收新流量,再 drain 活跃请求,最后退出;终止宽限期、服务发现摘除延迟和流式请求最长持续时间一起设计。不能仅设置 grace period 就声称完成了优雅退出。