在前一篇博文中尝试了使用阿里云 GPU 实例 ECS 单机部署了 DeekSeek-R1 7b 模型 。
这篇博文记录一下在 k8s 集群上用阿里云 GPU 实例部署 DeekSeek R1 大模型的尝试过程,部署的也是 deepseek-r1:7b 模型。
先准备一台阿里云 GPU 实例,选用了共享型 GPU 实例 sgn7i,8核31G,4G显存。
在阿里云 ECS 控制台创建实例后,将这台服务器加入已有的 k8s 集群并设置为 drain 状态,先不让部署任何 pod 进来。
NAME STATUS ROLES AGE VERSION
kube-deekseek-r1 Ready,SchedulingDisabled <none> 45s v1.27.1
通过 k8s 的 taint 功能将这台服务器设置为专用于部署 deepseek r1
kubectl taint nodes kube-deekseek-r1 dedicated=deepseek:NoSchedule
并且给节点打上标签
kubectl label node kube-deekseek-r1 dedicated=deepseek
然后解除 drain 状态
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 .../cnblogs/ollama-deepseek-r1-7b
docker push registry-vpc.cn-hangzhou.aliyuncs.com/cnblogs/ollama-deepseek-r1-7b
部署采用 Helm chart for Ollama on Kubernetes https://github.com/otwld/ollama-helm
添加 ollama-helm helm repository
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-7btag: latest imagePullSecrets: - name: regcredpodLabels:app: ollama-deepseekollama:mountPath: "/root/.empty"tolerations:- key: "dedicated"operator: "Equal"value: "deepseek"effect: "NoSchedule"nodeSelector:dedicated: deepseek
注:上面的 mountPath: "/root/.empty"
是为了避免 mount /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: truemodels: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
安装后问题依旧,网上搜了一下,找到 github 仓库 https://github.com/NVIDIA/k8s-device-plugin ,还需要安装 NVIDIA device plugin for Kubernetes
通过下面的命令完成安装
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
安装后还是问题依旧。
在网上找到一篇参考博文 A Practical Guide to Running NVIDIA GPUs on Kubernetes,文章中没有安装 NVIDIA device plugin for Kubernetes,安装的是 NVIIDA GPU Operator,准备换成安装 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
确认已安装成功。
驱动的问题解决了,但 pod 无法启动的问题还是依旧。
看来只能试试安装 NVIIDA GPU Operator 了,先卸载 helm 安装的 NVIDIA device plugin
在安装 NVIIDA GPU Operator 之前突然想到有更简单的解决方法。
在 ollama-helm 清单中将 ollama.gpu.enabled 设置为 true,仅仅是启用下面的配置,选择声明了 nvidia.com/gpu
taint 的节点
tolerations:
- effect: NoSchedulekey: nvidia.com/gpuoperator: 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 就行了。
通过参考博文中的下面这段话
There’s also an option to set the NVIDIA runtime as the default runtime using --nvidia-set-as-default.
知道了一行命令就能搞定
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 对话测试一下
对话成功,终于搞定!
参考资料:
- A Practical Guide to Running NVIDIA GPUs on Kubernetes