在之前的文章中,我分享了如何在阿里云 GPU 实例 ECS 上单机部署 DeepSeek-R1 7b 模型的经验。本文将继续探讨如何在 Kubernetes (k8s) 集群中使用阿里云 GPU 实例来部署同样的 DeepSeek-R1 7b 模型。为此,我选择了一台阿里云的共享型 GPU 实例 sgn7i,该实例配置为 8 核 CPU、31GB 内存和 4GB 显存。
在阿里云 ECS 控制台成功创建实例后,需将该服务器接入现有的 Kubernetes(k8s)集群,并将其状态调整为 drain,以确保暂时不会有任何 pod 被调度到该节点上运行。
NAME STATUS ROLES AGE VERSION
kube-deekseek-r1 Ready,SchedulingDisabled <none> 45s v1.27.1
利用 Kubernetes 的 taint 机制,可以将这台服务器标记为专用节点,确保其仅用于部署 deepseek-r1 模型。
kubectl taint nodes kube-deekseek-r1 dedicated=deepseek:NoSchedule
同时,为节点添加相应的标签以标识其用途。
kubectl label node kube-deekseek-r1 dedicated=deepseek
随后,将节点从 drain 状态恢复,使其重新接受 Pod 调度。
kubectl uncordon kube-deekseek-r1
至此,用于部署 deepseek-r1 的节点已准备就绪。
接下来是准备容器镜像——包含 deepseek-r1:7b 模型的 ollama 镜像。
我们仍然选择使用 docker hub 上的 mazurkatarzyna/ollama-deepseek-r1-7b 镜像,并将其推送到内部镜像仓库,以便 k8s 节点能够快速拉取镜像。
docker tag mazurkatarzyna/ollama-deepseek-r1-7b x.x.x/cnblogs/ollama-deepseek-r1-7b
docker push x.x.x/cnblogs/ollama-deepseek-r1-7b
部署将使用 Kubernetes 上的 Ollama Helm chart,项目地址为:https://github.com/otwld/ollama-helm。
首先,添加 ollama-helm 的 Helm 仓库。
helm repo add ollama-helm https://otwld.github.io/ollama-helm/
helm repo update
接下来,创建并配置 Helm 清单文件,命名为 `ollama-deepseek-values.yaml`。
image:
repository:x.x.x/cnblogs/ollama-deepseek-r1-7b
tag:latest
imagePullSecrets:
- name: regcred
podLabels:
app: ollama-deepseek
ollama:
mountPath:"/root/.empty"
tolerations:
-key: "dedicated"
operator:"Equal"
value:"deepseek"
effect:"NoSchedule"
nodeSelector:
dedicated:deepseek
注:设置 `mountPath: "/root/.empty"` 的目的是为了避免挂载 `/root/.ollama`,因为镜像中已经内置了 deepseek-r1:7b 模型。
执行 helm 命令进行部署。
helm upgrade --install ollama-deepseek ollama-helm/ollama --values ollam-deepseek-values.yaml
部署顺利完成,Pod 已成功启动并运行正常。
# kubectl get pods -l app=ollama-deepseek
NAME READY STATUS RESTARTS AGE
ollama-deepseek-755d5659b-ztt4x 1/1 Running 0 6m3s
在容器内可以确认 deepseek-r1:7b 模型已成功加载。
# kubectl exec -it deployment/ollama-deepseek -- ollama list
NAME ID SIZE MODIFIED
deepseek-r1:7b 0a8c26691023 4.7 GB 2 weeks ago
通过进入其他 pod,使用 curl 命令调用 ollama 的 API 接口。
kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/tags | jq
从响应内容中,可以清晰地看到 deepseek-r1:7b 模型的相关信息。
{
"models":[
{
"name":"deepseek-r1:7b",
"model":"deepseek-r1:7b",
"modified_at":"2025-01-29T11:07:32Z",
"size":4683075271,
"digest":"0a8c266910232fd3291e71e5ba1e058cc5af9d411192cf88b6d30e92b6e73163",
"details":{
"parent_model":"",
"format":"gguf",
"family":"qwen2",
"families":[
"qwen2"
],
"parameter_size":"7.6B",
"quantization_level":"Q4_K_M"
}
}
]
}
此外,可以通过以下命令进一步查看模型的详细信息。
kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/show -d '{ "model": "deepseek-r1:7b" }' | jq
查看正在运行的模型。
kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/ps | jq
发现没有模型在运行。
{
"models":[]
}
用 ollama run 命令手动运行模型。
kubectl exec -it deployment/ollama-deepseek -- ollama run deepseek-r1:7b
在命令行就和 deepseek-r1:7b 模型对话。
ollama ps 命令查看模型运行信息。
# kubectl exec -it deployment/ollama-deepseek -- ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1:7b 0a8c26691023 5.5 GB 100% CPU 3 minutes from now
发现当前部署仍在使用 CPU 进行计算。
为此,优化 Helm 部署清单文件,启用 GPU 支持,并配置容器在启动时自动加载 deepseek-r1:7b 模型。
ollama:
mountPath:"/root/.empty"
gpu:
enabled:true
models:
run:
-deepseek-r1:7b
用新的清单部署后,pod 无法启动,错误日志如下:
FailedScheduling 1 Insufficient nvidia.com/gpu
需要安装 NVIDIA Container Toolkit,k8s 节点没有使用 docker,用的是 containerd,通过下面的命令完成安装。
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey
|sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list
|sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'
|sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd
安装后问题仍未解决,经过搜索,发现需要在 Kubernetes 中安装 NVIDIA 设备插件,相关仓库地址为:https://github.com/NVIDIA/k8s-device-plugin。
可以通过以下命令完成插件的安装。
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvdp nvdp/nvidia-device-plugin
--namespace nvidia-device-plugin
--create-namespace
--version 0.17.0
安装后问题依然存在。
在网上找到一篇参考文章:https://www.jimangel.io/posts/nvidia-rtx-gpu-kubernetes-setup/,文中并未提及安装 NVIDIA device plugin for Kubernetes,而是安装了 NVIDIA GPU Operator。因此,我打算尝试改用 GPU Operator 来解决当前问题。
现在,根据这篇文章的指引,先检查 NVIDIA GPU 驱动是否正常安装。
使用 `lspci` 命令查看 NVIDIA 设备的型号信息。
# sudo lspci | grep NVIDIA
00:07.0 VGA compatible controller: NVIDIA Corporation Device 2236 (rev a1)
使用`nvidia-smi` 命令查询驱动版本。
nvidia-smi --query-gpu=driver_version --format=csv,noheader
nvidia-smi: command not found
发现驱动没有安装,这台阿里云 ECS 云服务器用的是共享型 GPU 实例 ecs.sgn7i-vws,通过云助手安装 GRID 驱动,即下面的安装命令。
acs-plugin-manager --exec --plugin grid_driver_install
安装完成之后可以查询到驱动版本号。
# nvidia-smi --query-gpu=driver_version --format=csv,noheader
470.239.06
通过以下命令进一步检查驱动信息。
# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 470.239.06 Sat Feb 3 06:03:07 UTC 2024
GCC version: gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
# ls /dev/ | grep 'nvidia[0-9]+'
nvidia0
驱动确认安装好了。
再确认一下 `nvidia-container-toolkit` 是否安装成功,运行下面的命令启动容易进行检查。
nerdctl run -it --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu20.04 nvidia-smi
确认 NVIDIA 驱动已成功安装。
然而,Pod 仍然无法启动的问题依然存在。
看来只能尝试安装 NVIDIA GPU Operator 了。在此之前,先卸载通过 Helm 安装的 NVIDIA device plugin。
在准备安装 NVIDIA GPU Operator 时,突然想到一个更简单的解决方案。
只需在 ollama-helm 的清单文件中将 `ollama.gpu.enabled` 设置为 `true`,并启用相关配置,使其选择已声明 `nvidia.com/gpu` taint 的节点即可。
tolerations:
- effect: NoSchedule
key:nvidia.com/gpu
operator:Exists
这里部署的阿里云 GPU 实例本来就专用于部署 ollama+deepseek-r1,已经通过 taints/tolerations 完成了选择,不需要再选择了,修改清单,取消 `ollama.gpu.enabled`。
ollama:
gpu:
enabled:false
更新部署后 pod 启动成功了,但现在还是没有使用 gpu
# kubectl exec -it deployment/ollama-deepseek -- ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1:7b 0a8c26691023 5.5 GB 100% CPU 4 minutes from now
而使用 gpu,只需要运行容器默认使用 `nvidia runtime` 就行了。
nvidia-ctk runtime configure --runtime=containerd --set-as-default=true
运行这个命令会修改 `/etc/containerd/config.toml` 中 `default_runtime_name` 配置,将 runc 改为 nvidia
default_runtime_name = "nvidia"
原来仅靠一行命令还不足以解决问题,还需要在 GPU 节点上重启 containerd 服务,并在 master 节点上重新部署 Pod。
systemctl restart containerd
kubectl rollout restart deploy ollama-deepseek
pod 启动成功后就可以看到使用了 gpu
# kubectl exec -it deployment/ollama-deepseek -- ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1:7b 0a8c26691023 6.0 GB 38%/62% CPU/GPU 2 minutes from now
通过命令行与 deepseek-r1:7b 对话测试一下
参考资料:
https://www.jimangel.io/posts/nvidia-rtx-gpu-kubernetes-setup/
原文始发于微信公众号(智检安全):尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论