KServe 部署入门教程:基于 kubeadm + VMware 的可落地实战路线
-
- [一、前言:为什么这篇不是直接部署 Qwen 大模型?](#一、前言:为什么这篇不是直接部署 Qwen 大模型?)
- 二、本篇部署目标
- 三、我当前环境
- [四、KServe 生产部署模式选择](#四、KServe 生产部署模式选择)
- 五、部署前置条件
- [六、安装 cert-manager](#六、安装 cert-manager)
- [七、安装 KServe Standard 模式](#七、安装 KServe Standard 模式)
- [八、创建测试 namespace](#八、创建测试 namespace)
- [九、部署 CPU 版 sklearn-iris 模型服务](#九、部署 CPU 版 sklearn-iris 模型服务)
- 十、准备测试请求
- 十一、访问模型服务
- [十二、真正生产部署 Qwen / vLLM 需要什么?](#十二、真正生产部署 Qwen / vLLM 需要什么?)
一、前言:为什么这篇不是直接部署 Qwen 大模型?
大家都知道:
text
Kubernetes 负责管理容器
vLLM 负责高效运行大模型
KServe 负责把模型服务标准化部署到 Kubernetes 上
但是到了"生产部署"阶段,必须先面对一个现实问题:
我当前使用的是 kubeadm + VMware 搭建 Kubernetes 集群,虚拟机里只有 虚拟显卡,没有真实 NVIDIA GPU。
这意味着:
当前环境不适合直接部署 Qwen / DeepSeek 这类 GPU 大模型推理服务。
此外:Kubernetes 要调度 GPU Pod,节点上必须有真实 GPU、GPU 驱动以及对应的 GPU device plugin。
Kubernetes 官方文档说明,管理员需要先安装硬件厂商驱动,并运行对应的 device plugin,之后集群才会暴露 nvidia.com/gpu 这类可调度资源。
二、本篇部署目标
本篇目标:完成一套 KServe 生产化部署演练环境
text
kubeadm Kubernetes 集群
↓
安装 cert-manager
↓
安装 KServe Standard 模式
↓
创建 kserve-test namespace
↓
部署 CPU 版 sklearn-iris InferenceService
↓
通过 curl 调用模型服务
↓
理解后续 GPU / vLLM / Qwen 的升级路线
本博客采用官方 KServe 的第一个预测式推理示例 sklearn-iris,
它只需要 CPU 和内存,不需要 GPU。
所以本篇会部署一个 scikit-learn 模型实例,根据鸢尾花的四个特征预测类别。
三、我当前环境
text
虚拟化平台:VMware
Kubernetes 安装方式:kubeadm
GPU 情况:只有 VMware 虚拟显卡,没有真实 NVIDIA GPU
目标:先完成 KServe 生产部署流程学习
先检查节点:
bash
kubectl get nodes -o wide
查看节点资源:
bash
kubectl describe node
四、KServe 生产部署模式选择
KServe 有不同部署方式。
对于生产部署,尤其是生成式 AI 或需要直接控制资源的场景,官方推荐 Standard Deployment。
KServe 官方文档说明,Standard 模式支持 Predictive Inference 和 Generative Inference,并且依赖更少,底层使用标准 Kubernetes 资源,
例如 Deployment、Service、Ingress/Gateway API、HPA。
所以本阶段,我会选择 Standard 模式,
原因:
text
1. 不需要先深入 Knative
2. 更贴近 Kubernetes 原生资源
3. 方便观察 Deployment / Service / Pod
4. 更适合后续接入 GPU、大模型、vLLM
五、部署前置条件
KServe 0.18 官方文档要求:
text
Kubernetes 1.32+
cert-manager 1.15.0+
Gateway API 或 Ingress Controller
如果你的 kubeadm 集群版本低于 1.32,需要选择和自己 Kubernetes 版本匹配的 KServe 版本,不要盲目复制最新版本命令。
并且开始前,需查看所有 Pod 状态:
bash
kubectl get pods -A
如果集群本身还有 NotReady、CNI 异常、CoreDNS 异常,不要继续装 KServe。先保证 Kubernetes 基础环境正常。
六、安装 cert-manager
KServe 生产级安装需要 cert-manager 来处理 webhook 证书。
安装 cert-manager:
bash
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.2/cert-manager.yaml
检查状态:
bash
kubectl get pods -n cert-manager
正常情况下应该看到类似:
text
cert-manager
cert-manager-cainjector
cert-manager-webhook
并且都是:
text
Running
七、安装 KServe Standard 模式
以 KServe v0.18.0 为例,先安装 CRD:
bash
helm install kserve-crd oci://ghcr.io/kserve/charts/kserve-crd --version v0.18.0
再安装 KServe 资源,并指定 Standard 模式:
bash
helm install kserve oci://ghcr.io/kserve/charts/kserve-resources --version v0.18.0 \
--set kserve.controller.deploymentMode=Standard
KServe 官方文档中也说明,默认 KServe deployment mode 是 Knative,如果要使用 Standard 模式,需要显式设置 kserve.controller.deploymentMode=Standard。([kserve.github.io][5])
检查 KServe:
bash
kubectl get pods -n kserve
正常情况下,KServe controller 应该处于 Running 状态。
八、创建测试 namespace
不要把 InferenceService 部署到控制平面 namespace。KServe 官方文档提醒,不要把 InferenceService 部署到带有 control-plane label 的 namespace,否则可能导致 storage initializer 没有被注入。([kserve.github.io][4])
创建独立 namespace:
bash
kubectl create namespace kserve-test
这个 namespace 专门用于 KServe 实验:
text
kserve-test
↓
InferenceService
↓
模型服务 Pod
↓
测试请求
九、部署 CPU 版 sklearn-iris 模型服务
创建文件:
bash
vim sklearn-iris.yaml
写入:
yaml
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "sklearn-iris"
namespace: kserve-test
spec:
predictor:
model:
modelFormat:
name: sklearn
storageUri: "gs://kfserving-examples/models/sklearn/1.0/model"
resources:
requests:
cpu: "100m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
应用:
bash
kubectl apply -f sklearn-iris.yaml
这个示例来自 KServe 官方的第一个 Predictive InferenceService 教程。官方示例中也是使用 modelFormat: sklearn 和 gs://kfserving-examples/models/sklearn/1.0/model 作为模型地址。([kserve.github.io][4])
查看 InferenceService:
bash
kubectl get inferenceservice -n kserve-test

这就成功喽。
当然也可以简写为:
bash
kubectl get isvc -n kserve-test
查看 Pod:
bash
kubectl get pods -n kserve-test
查看底层资源:
bash
kubectl get deploy -n kserve-test
kubectl get svc -n kserve-test
这一步很关键,因为你会发现:
text
你只写了 InferenceService
但 KServe 自动帮你生成了 Deployment、Service 等底层资源
这就是 KServe 的价值:把模型服务抽象成 Kubernetes 原生资源。
十、准备测试请求
创建输入文件:
bash
cat <<EOF > iris-input.json
{
"instances": [
[6.8, 2.8, 4.8, 1.4],
[6.0, 3.4, 4.5, 1.6]
]
}
EOF
这四个数字分别代表鸢尾花的特征:
text
花萼长度
花萼宽度
花瓣长度
花瓣宽度
模型会根据这些输入预测类别。
十一、访问模型服务
如果你是在 VMware 本地环境,没有云厂商 LoadBalancer,一般外部 IP 会是 Pending。
可以使用 port-forward 测试:
bash
kubectl port-forward -n kserve-test svc/sklearn-iris-predictor 8080:80
然后发送请求:
bash
curl -v http://127.0.0.1:8080/v1/models/sklearn-iris:predict \
-H "Content-Type: application/json" \
-d @iris-input.json
如果返回类似:
json
{
"predictions": [1, 1]
}
说明模型服务已经成功跑通。
注意:不同 KServe 版本和不同部署模式下,Service 名称可能略有不同。如果 port-forward 失败,可以先执行:
bash
kubectl get svc -n kserve-test
找到实际生成的 Service 名称。
十二、真正生产部署 Qwen / vLLM 需要什么?
如果后续要部署 Qwen、DeepSeek、Llama 这类大模型,生产环境至少需要:
text
真实 NVIDIA GPU
Linux 物理机或支持 GPU passthrough / vGPU 的服务器环境
NVIDIA Driver
NVIDIA Container Toolkit
NVIDIA Kubernetes Device Plugin 或 GPU Operator
KServe Standard 模式
Hugging Face / ModelScope / 对象存储模型源
vLLM Runtime
监控、日志、扩缩容、限流、鉴权
NVIDIA GPU Operator 可以通过 Helm 安装,它会帮助部署 GPU 相关组件。
NVIDIA 官方文档给出的安装方式是添加 NVIDIA Helm repo,然后安装 nvidia/gpu-operator。
安装完成后,节点资源里应该能看到:
text
nvidia.com/gpu: 1
这时再部署 Qwen 类型的 InferenceService 才有意义。
一句话总结:
text
KServe 生产部署的核心,不是先把大模型跑起来,
而是先把模型服务在 Kubernetes 上的标准化部署、暴露、管理、排查流程跑通。
接下来,补齐这两个就行:
第四阶段:生产化能力理解
- requests / limits
- HPA
- Ingress / Gateway
- 日志
- 监控
- 模型存储
- 灰度发布
第五阶段:GPU 大模型升级
- 真实 GPU 节点
- NVIDIA device plugin
- vLLM
- Qwen / DeepSeek
- OpenAI-compatible API