KubeAI 评测:把 vLLM 和 Ollama 塞进 Kubernetes 的推理 Operator
AI Inference Operator for Kubernetes. The easiest way to serve ML models in production. Supports VLMs, LLMs, embeddings, and speech-to-text.
秒懂
- 它是什么?
- KubeAI 用 Model CRD 直接管理推理 Pod,并自带前缀感知的负载均衡代理,省掉 Istio、Knative 和 Prometheus 适配器。它适合已经在 K8s 上跑 GPU 推理、又被 kube-proxy 随机转发拖慢首 token 延迟的团队。
- 适合谁用?
- 如果你的集群里已经跑着 vLLM 多副本,并且发现 kube-proxy 的随机转发让 TTFT 忽高忽低,KubeAI 的 prefix-aware 代理是值得先验证的一环。如果你只需要单副本推理、或者团队不接受多一个 Operator 常驻在集群里,直接写 Deployment 更省事。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 12 天前。
- 用什么语言写的?
- 主要是 Go(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
KubeAI 解决的是哪一段运维负担
在 Kubernetes 上跑一个 LLM 服务,真正耗时间的往往不是选模型,而是围绕模型的那些重复动作:把权重从远端拉下来、挂到 Pod 里、给 vLLM 调一堆启动参数、再想办法在没人用的时候把副本缩到零。KubeAI 把这些动作收进一个 Model CRD,由 Operator 去创建和管理后端的 server Pod。README 里列出的能力包括模型缓存(自动下载并挂载 EFS 等存储)、动态 LoRA adapter 在多个副本间的编排,以及从零副本扩容。
它的目标读者是已经有 Kubernetes 集群、并且希望推理服务和其他工作负载用同一套发布流程的团队。README 里列出的已知采用方包括 Telescope(多区域批量 LLM 推理)、Arcee(多区域多租户 SLM 推理)和 Seeweb(面向客户的 GPU 推理),Google Cloud Distributed Edge 把它作为边缘推理的参考架构。这些场景的共同点是副本数不止一个、区域不止一个,单机跑一个模型脚本解决不了问题。
它不打算解决的是模型训练、微调流水线,也不处理数据准备。仓库的定位就是推理侧的 Operator。
代理和 Operator 两个组件各管什么
根据 README 的架构说明,KubeAI 由两个子组件构成,默认部署在同一个 Deployment 里,但 issue #430 提到它们也可以分开部署。
第一个是 model proxy。它对外提供 OpenAI 兼容的 API,内部实现了一个前缀感知(prefix-aware)的负载均衡策略。README 给出的理由是:vLLM 不是无状态的,它的性能受 KV cache 状态影响很大,而 kube-proxy 背后标准 Kubernetes Service 用的是随机负载均衡,在多副本场景下会拖累 TTFT 和吞吐。代理还负责请求排队(在系统从零副本扩容的过程中)和请求重试。
第二个是 model operator。它直接管理后端 server Pod,通过 Model CRD 自动化下载模型、挂载卷、加载 LoRA adapter。
这里有一个值得留意的设计取舍:代理是有状态的,它需要知道每个后端副本的 KV cache 前缀分布才能做出有效决策。这意味着代理不能随意重启而不丢信息,也意味着扩容出来的新副本在缓存为空时会被区别对待。README 没有展开讲代理如何维护这份状态、失效后如何恢复,这一块文档是薄的,上生产前需要自己读代码确认。
支持的 API 端点包括 /v1/chat/completions、/v1/completions、/v1/embeddings、/v1/rerank、/v1/models 和 /v1/audio/transcriptions。注意 /v1/rerank 不是 OpenAI 官方端点,客户端库不一定认。
从 kind 集群到第一个模型的实际命令
README 的 Local Quickstart 给了一条最短路径。先建本地集群:
kind create cluster
或者 minikube start。如果用的是 Podman 驱动的 kind,README 特别提醒默认内存上限是 2G,需要重建 machine:
podman machine stop podman machine rm podman machine init --memory 6144 --disk-size 120 podman machine start
接着加 Helm 仓库并安装:
helm repo add kubeai https://www.kubeai.org helm repo update helm install kubeai kubeai/kubeai --wait --timeout 10m
然后通过 kubeai/models 这个 chart 启用预置模型。README 的示例写了一个 kubeai-models.yaml,里面用 catalog 作为顶层键,每个模型是一个条目:
catalog: deepseek-r1-1.5b-cpu: enabled: true features: [TextGeneration] url: 'ollama://deepseek-r1:1.5b' engine: OLlama minReplicas: 1 resourceProfile: 'cpu:1' qwen2-500m-cpu: enabled: true nomic-embed-text-cpu: enabled: true
再执行 helm install kubeai-models kubeai/models -f ./kubeai-models.yaml。
从这段配置能读出几个关键字段:url 用 engine 专属的 scheme 前缀(ollama:// 对应 OLlama 引擎),features 声明这个模型提供哪类能力(示例里是 TextGeneration),minReplicas 控制最小副本数,resourceProfile 用类似 cpu:1 的字符串绑定资源档位。注意 url 的 scheme 和 engine 字段必须匹配,写错了 Operator 大概率不会给你友好报错。
README 里还提到项目自带一份按常见 GPU 类型预配置的模型 catalog,目的是减少手动调 vLLM flag 的时间。
零依赖是卖点,也是能力边界
KubeAI 明确宣传不依赖 Istio、Knative(用于 scale-from-zero)和 Prometheus metrics adapter(用于自动扩缩)。README 给的理由是任何 Kubernetes 集群都能开箱即用,日常运维也不用担心多个项目之间的版本和配置错配。
这个取舍是双向的。好处很直接:少装三个组件就少三个升级路径、少三类配置漂移、少三个半夜报警的来源。代价是这些能力必须由 KubeAI 自己实现,也就意味着你只能用它提供的那一套。比如自动扩缩,README 说它不依赖 Prometheus adapter,但没有在给出的材料里说明它实际依据什么指标做决策(是队列长度、并发数还是别的)。如果你的团队已经围绕 Prometheus 和 KEDA 建好了统一的扩缩策略,KubeAI 自带的这一套会和现有体系并行存在,而不是复用。
同样地,scale-from-zero 由代理的请求排队配合完成,而不是交给 Knative。请求在排队期间会占用连接,客户端需要能接受这种等待,或者自己设好超时。这一点在文档里没有给出具体的队列上限和超时默认值,属于需要实测的参数。
前缀感知负载均衡的适用条件
README 把性能优势归因于一个具体机制:标准 Kubernetes Service 背后的 kube-proxy 使用随机负载均衡,而 vLLM 的性能受 KV cache 状态影响,随机转发会让多个副本各自维护不完整的缓存。KubeAI 的代理改为前缀感知,目标是提高 KV cache 的复用率。README 附了一张 TTFT 对比图和一篇完整论文(blog/posts/llm-load-balancing-at-scale-chwbl.md)。
这里必须说清楚:那些数字来自项目自己的论文和图表,本文没有复现,也不对其准确性背书。要判断它是否对你的负载有效,只能在自己的流量上测。
从机制上讲,前缀感知的收益高度依赖请求之间共享前缀的比例。如果你的应用是大量用户各自提问、彼此无关的对话,共享前缀主要来自 system prompt,收益有限。如果是同一份长文档上的批量问答、或者同一套工具调用的 agent 循环,前缀重复度高,收益才明显。换句话说,这个特性不是无条件的性能提升,而是一个和流量形态强相关的优化。
多副本是前提。单副本部署下,负载均衡策略根本无从发挥,KubeAI 的价值就只剩下模型生命周期管理。
什么时候不该用它
第一,单机或者单副本场景。如果你只是在一台 GPU 机器上跑一个模型对外提供 API,KubeAI 引入的 Operator、CRD 和代理都是纯开销。直接跑 vLLM 容器更直接。
第二,集群里已经有一套成熟的推理平台。KubeAI 会接管 Pod 的创建方式,如果你的团队已经用 KServe、Ray Serve 或者自研控制器管理推理负载,两套控制器同时管同一批 Pod 会打架。README 提到两个子组件理论上可以独立部署,但那是 issue #430 里的设想,不是文档承诺的稳定用法。
第三,需要非 OpenAI 语义的接口。KubeAI 的对外接口是 OpenAI 兼容的那一组端点。如果你的下游需要 gRPC、Triton 的 KServe 协议或者自定义的流式格式,代理这一层会成为阻碍而不是帮助。
第四,对模型格式有强要求。README 列出的引擎是 vLLM、Ollama、FasterWhisper 和 Infinity,覆盖 LLM、VLM、embedding、rerank 和语音转写。如果你的模型需要 TensorRT-LLM、TGI 之类的其他运行时,从给出的材料看没有对应支持。
和直接写 Deployment 加 Service 的差别
最直接的替代方案不是另一个 Operator,而是手写 Deployment 加 Service 加 HPA。这个方案零新增组件,任何 Kubernetes 用户都会写,调试路径也最短。
差别落在三处。一是模型分发:手写方案里,下载权重、挂载存储、处理多副本共享缓存这些逻辑要你自己写 initContainer 或者 sidecar,KubeAI 把它收进 Model CRD 的 url 字段和缓存机制。二是扩缩:手写方案靠 HPA 看 CPU/GPU 利用率,而推理负载的瓶颈往往在队列而不是利用率上,从零扩容需要额外的机制,KubeAI 用代理排队加 Operator 自己实现。三是路由:这是差别最大的一点,Service 的转发策略在 Kubernetes 里基本不可控,而 KubeAI 换掉了这一层。
如果你的推理服务常年保持固定副本数、流量前缀重复度低、也不追求缩到零,那么手写 Deployment 在可维护性上反而更好,因为出问题时你知道该看哪一层。KubeAI 的价值集中在多副本、有缩容需求、前缀重复度高的场景。
版本节奏、许可证与升级成本
仓库使用 Apache-2.0 许可证。这个许可证允许商用和修改,包含专利授权条款,但不提供任何担保。具体到你所在组织的合规要求,需要法务自己判断,本文不构成法律意见。
从给出的发布记录看,2026 年 7 月 20 日发布 v0.23.3,7 月 30 日发布 helm-chart-kubeai-0.23.4 和 helm-chart-models-0.23.4,最后推送时间是 2026 年 9 月 3 日。版本号还在 0.x,说明 API 尚未进入稳定期,CRD 字段和 Helm values 的键名在次版本之间发生变动的可能性是存在的。
升级成本主要体现在两处。一是 CRD:Kubernetes 的 CRD 升级不会自动迁移已有对象,改字段语义时需要自己处理存量 Model 资源。二是两个 Helm chart 要一起升,kubeai 和 kubeai-models 的版本号是对齐发布的(都是 0.23.4),分开升级容易出现 values 不匹配。
README 里对未来的表述是计划构建模型优化流水线,这属于路线图而非现有能力,不要按它做技术选型。
编辑结论
如果你的集群里已经跑着 vLLM 多副本,并且发现 kube-proxy 的随机转发让 TTFT 忽高忽低,KubeAI 的 prefix-aware 代理是值得先验证的一环。如果你只需要单副本推理、或者团队不接受多一个 Operator 常驻在集群里,直接写 Deployment 更省事。上手前先确认三件事:你的 K8s 版本能否跑通 helm install kubeai kubeai/kubeai --wait --timeout 10m;你要用的模型是否在 kubeai-models 这个 Helm chart 的 catalog 里;以及本地集群的内存够不够,README 里给 Podman 的建议是 6144MB,默认的 2G 会在拉起模型时卡住。
社区笔记