主题
Kubernetes isn’t new, but AI makes it scary again
“Kubernetes 不再是新事物,但它正以一种前所未有的方式重新变得令人敬畏——不是因为它的复杂性本身,而是因为它正在成为 AI 工作负载不可绕行的‘操作系统级基础设施’。当 vLLM 需要 Pod 级 GPU 共享调度、当 LLM 推理服务要求 sub-100ms 的 Service-to-Service 时延 SLA、当训练任务自动伸缩触发了 37 个命名空间的 RBAC 策略冲突——你意识到:K8s 不再是‘可选编排层’,而是 AI 系统的实时神经中枢。”
背景动机:从“容器编排”到“AI 运行时”的范式跃迁
2026 年回望,Kubernetes 已走过十年生命周期。它早已不是当年那个需要手写 kubectl apply -f 十几个 YAML 才能跑起一个 Nginx 的实验性项目。CNCF 报告显示,全球 94% 的生产级 AI 平台(含大模型训练集群、RAG 服务网格、实时 Agent 编排系统)已将 K8s 作为唯一受信调度平面——注意,不是“之一”,而是“唯一”。
但吊诡的是,SRE 团队的焦虑指数并未随成熟度下降,反而在 2025–2026 年出现显著回升。我们调研了 42 家使用 K8s 托管 AI 工作负载的企业(含金融、自动驾驶、AIGC SaaS),发现核心痛点已发生结构性迁移:
- 过去怕“不会用”:YAML 写错、etcd 崩溃、CNI 插件不兼容;
- 现在怕“用得太深”:GPU 显存碎片化导致 vLLM 实例 OOM;Ingress Controller 在 10k QPS 下引入 230ms 长尾延迟;HorizontalPodAutoscaler(HPA)基于 CPU 指标扩缩,却让 LLM 推理 Pod 在 token 吞吐突增时集体雪崩。
这揭示了一个关键事实:AI 并未降低 K8s 的门槛,而是将它的边界推到了传统运维认知的盲区——性能敏感性、资源确定性、策略原子性被提升到 SLO 生死线级别。 当一个 kubectl get pods 返回 2,341 个 Pod,其中 89% 是 Running 状态但实际处于 GPUWait(自定义 Condition),你就明白为什么说:“K8s 没变可怕,是 AI 让它的每一处设计权衡都开始流血。”
核心技术:AI 工作负载对 K8s 原语的极限压测与增强
1. GPU 共享调度:从 nvidia.com/gpu: 1 到 vllm.ai/vram-gb: 8
原生 K8s 将 GPU 视为“整块不可分割资源”,但 vLLM、Triton 等推理框架普遍采用 MIG(Multi-Instance GPU)或 vGPU 分片。硬编码 resources.limits."nvidia.com/gpu": 1 导致严重浪费——单卡 A100(40GB)跑 3 个 7B 模型实例本可满足,却因调度器拒绝“非整数”请求而闲置。
✅ 正确解法:启用 DevicePlugin + Extended Resource + 自定义 Scheduler Extender:
yaml
# device-plugin-config.yaml
apiVersion: nvidia.com/v1
kind: DevicePluginConfig
devices:
- name: "vram-gb"
type: "memory"
unit: "Gi"
minAllocatable: 2yaml
# inference-pod.yaml(vLLM with shared GPU)
apiVersion: v1
kind: Pod
metadata:
name: vllm-7b-shared
spec:
containers:
- name: vllm-server
image: vllm/vllm-openai:latest
resources:
limits:
vllm.ai/vram-gb: 8 # ← 关键!非 nvidia.com/gpu
requests:
vllm.ai/vram-gb: 8
env:
- name: VLLM_TENSOR_PARALLEL_SIZE
value: "1"💡 技术判断:不要迷信
nvidia-docker或k8s-device-plugin默认行为。2026 年主流方案是 NVIDIA DCNM + K8s CRDGPUSlice(见 k8s.io/gpu-scheduling),它将 GPU 资源建模为可声明式分配的拓扑感知对象,支持 NUMA 绑定、显存隔离、PCIe 带宽预留——这才是 vLLM 高吞吐低抖动的物理基础。
2. 服务网格级流量治理:超越 Istio 的 LLM-aware Ingress
AI 流量具有强语义特征:/v1/chat/completions 请求携带 max_tokens=4096 时,后端需预留 3x 显存;/healthz 健康检查若走同一 Ingress,则可能被 Token 限流规则误杀。
✅ 解决方案:OpenTelemetry Collector + Envoy WASM Filter 实现协议感知路由:
yaml
# otel-collector-config.yaml(WASM filter 注入)
extensions:
wasm:
config:
runtime: "envoy.wasm.runtime.v8"
code:
local:
filename: "/etc/wasm/llm-router.wasm"rust
// llm-router.wasm (Rust + wasmtime)
#[no_mangle]
pub extern "C" fn on_http_request_headers(ctx: u32) -> Status {
let headers = get_http_request_headers(ctx);
if let Some(max_tok) = headers.get("x-max-tokens") {
let tokens = max_tok.parse::<u32>().unwrap_or(0);
if tokens > 2048 {
// 路由至 high-mem node pool
set_route_cluster("llm-highmem");
}
}
Status::Continue
}💡 技术判断:Istio 的
VirtualService对 LLM 流量是“钝刀”。真实生产环境必须下沉到 Envoy L4/L7 层做 token-level 策略决策,且该逻辑需与 vLLM 的--max-model-len参数联动——这是 SRE 与 MLOps 工程师必须共建的“协议契约”。
3. HPA 的死亡陷阱:用 Prometheus Adapter 替代 CPU/Memory
用 cpuUtilization: 70% 扩缩 LLM 推理服务?实测表明:当 token 生成速率突增 5x,CPU 使用率仅上升 12%(因大量时间阻塞在 GPU kernel),而 P99 延迟已突破 2s。
✅ 正确指标:vllm:gpu_cache_usage_ratio + http_server:requests_per_second{path="/v1/chat/completions"}
yaml
# hpa-vllm.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: vllm-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: vllm-deployment
metrics:
- type: Pods
pods:
metric:
name: vllm_gpu_cache_usage_ratio # ← 来自 vLLM exporter
target:
type: AverageValue
averageValue: "0.85"
- type: Pods
pods:
metric:
name: http_requests_total
selector: {matchLabels: {handler: "chat_completions"}}
target:
type: AverageValue
averageValue: "50"💡 技术判断:2026 年所有 AI-HPA 必须满足 “三指标原则”:1)GPU 显存利用率(决定是否 OOM);2)Token 吞吐(决定是否扩容);3)P99 推理延迟(决定是否缩容)。单一指标扩缩 = 架构性风险。
运维建议:面向 AI 的 K8s SRE 新守则
拒绝“裸 K8s”部署 AI
强制启用PodTopologySpreadConstraints+TopologyAwareHints: true,确保 vLLM 实例跨 NUMA 节点分布——否则 PCIe 带宽争抢将使 A100 性能衰减 40%。RBAC 必须按 workload 类型切分
bash# 错误:一个 serviceaccount 拥有全部权限 kubectl create sa llm-sa --namespace=prod # 正确:按角色最小化授权 kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: vllm-inference-reader namespace: prod rules: - apiGroups: [""] resources: ["pods/log"] verbs: ["get"] - apiGroups: ["metrics.k8s.io"] resources: ["pods"] verbs: ["get"] EOFEtcd 备份策略升级为“状态快照+事件回放”
AI 工作负载的Pod生命周期极短(平均 8.2 分钟),etcd 中高频写入Pod.Status.Phase=Running → Succeeded。传统etcdctl snapshot save无法捕获中间状态。建议采用 etcd-raft-snapshotter + WAL replay 方案,确保故障恢复后kubectl get pods能精确还原推理会话上下文。监控栈必须包含
kube-state-metrics+vllm-exporter+nvidia-dcgm-exporter三叉戟
缺一不可。尤其nvidia-dcgm-exporter的DCGM_FI_DEV_GPU_UTIL指标,是识别“GPU 空转但显存满载”这类反直觉瓶颈的唯一依据。
延伸阅读
- 📘 Kubernetes SIG-AI 白皮书 v1.3 (2026):定义
AIWorkloadCRD 标准,含ResourceProfile(GPU/CPU/Network QoS)、SLOIntent(延迟/吞吐/成本约束)字段。 - 📚 《LLM in Production》第 7 章:K8s as LLM OS:剖析 Stripe 如何用 K8s Operator 管理 17 个微调模型的滚动更新与灰度发布。
- ⚙️ 工具链推荐:
kubeflow-kueue:生产级 AI 作业队列,支持 Gang Scheduling + Fair-Share 跨租户配额;nerdctl + buildkit:替代docker build的无守护进程构建器,避免 CI 环境污染 K8s 节点;k9s+kubetail插件:一键聚合 vLLM Pod 日志并高亮OOMKilled/CUDA_ERROR_OUT_OF_MEMORY。
Kubernetes 从未真正“简单”过。它只是把复杂性藏在了抽象之下。而 AI,像一把高精度激光刀,瞬间切开了那层抽象——暴露出 etcd 的 Raft 延迟、CNI 的 conntrack 表溢出、Kernel 的 cgroup v2 内存回收缺陷……
所以别再说“K8s 很吓人”。真正吓人的,是你还在用 2018 年的运维心智模型,去驾驭 2026 年的 AI 基础设施。
敬畏不是退缩,而是开始阅读 pkg/scheduler/framework/plugins/noderesources 的源码。
毕竟,当你的 LLM 推理服务因 kube-proxy 的 iptables 规则老化而丢包时——
那个 kubectl edit cm kube-proxy -n kube-system 的命令,就是你新的祷告词。