KServe 部署教程(CPU版)

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: sklearngs://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
复制代码
相关推荐
qq_白羊座2 小时前
K8s 在完整 CI/CD 流程里的作用
云原生·容器·kubernetes
编码如写诗2 小时前
瑞芯微RK3588+麒麟V10国防版+昇腾310异构部署k8s集群+KubeSphere
人工智能·ai·云原生·kubernetes
想你依然心痛2 小时前
工业物联网云原生时代:时序数据库全链路选型与 Apache IoTDB 实践
物联网·云原生·时序数据库·iotdb
密瓜智能2 小时前
MIG、Time-slicing 还是HAMi?密瓜智能CEO张潇本周六亮相JuiceFS Meetup,聊聊GPU共享的生产取舍
人工智能·云原生·kubernetes·开源·gpu算力·ai算力
用户15583199681417 小时前
文件同步冲突技术根因与解决方案:Last-Write-Wins、OT、CRDT对比
云原生
AllData公司负责人21 小时前
亲测丝滑,体验跃迁|AllData通过集成开源项目DataVines,一站式解决数据质量难题
java·大数据·数据结构·数据库·人工智能·算法·云原生
Rust研习社1 天前
Tonic 加入 gRPC 官方项目,Rust 云原生生态进入了新阶段
开发语言·后端·云原生·rust
D4c-lovetrain1 天前
云原生实战:K8s 一键部署 Prometheus+Grafana+EFK 完整可观测平台
云原生·kubernetes·prometheus
leoZ2311 天前
k8s入门2-将程序发部到k8s
云原生·容器·kubernetes