尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

admin 2025年3月6日12:28:45评论12 views字数 6484阅读21分36秒阅读模式

之前的文章中,我分享了如何在阿里云 GPU 实例 ECS 上单机部署 DeepSeek-R1 7b 模型的经验。本文将继续探讨如何在 Kubernetes (k8s) 集群中使用阿里云 GPU 实例来部署同样的 DeepSeek-R1 7b 模型。为此,我选择了一台阿里云的共享型 GPU 实例 sgn7i,该实例配置为 8 核 CPU、31GB 内存和 4GB 显存。

尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

在阿里云 ECS 控制台成功创建实例后,需将该服务器接入现有的 Kubernetes(k8s)集群,并将其状态调整为 drain,以确保暂时不会有任何 pod 被调度到该节点上运行。

NAME                STATUS                    ROLES    AGE    VERSIONkube-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-7bdocker 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: regcredpodLabels: app: ollama-deepseekollama: 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-deepseekNAME                                READY     STATUS     RESTARTS     AGEollama-deepseek-755d5659b-ztt4x     1/1       Running    0            6m3s

在容器内可以确认 deepseek-r1:7b 模型已成功加载。

# kubectl exec -it deployment/ollama-deepseek -- ollama listNAME             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 模型对话。

尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

ollama ps 命令查看模型运行信息。

# kubectl exec -it deployment/ollama-deepseek -- ollama psNAME             ID             SIZE      PROCESSOR    UNTILdeepseek-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 -/usr/share/keyrings/nvidia-container-toolkit-keyring.gpgcurl --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.listsudo apt-get updatesudo apt-get install -y nvidia-container-toolkitsudo nvidia-ctk runtime configure --runtime=containerdsudo systemctl restart containerd

安装后问题仍未解决,经过搜索,发现需要在 Kubernetes 中安装 NVIDIA 设备插件,相关仓库地址为:https://github.com/NVIDIA/k8s-device-plugin。

可以通过以下命令完成插件的安装。

helm repo add nvdp https://nvidia.github.io/k8s-device-pluginhelm repo updatehelm 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 NVIDIA00:07.0 VGA compatible controller: NVIDIA Corporation Device 2236 (rev a1)

使用`nvidia-smi` 命令查询驱动版本。

nvidia-smi --query-gpu=driver_version --format=csv,noheadernvidia-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,noheader470.239.06

通过以下命令进一步检查驱动信息。

# cat /proc/driver/nvidia/versionNVRM version: NVIDIA UNIX x86_64 Kernel Module  470.239.06   Sat Feb   3 06:03:07 UTC 2024GCC 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 psNAME             ID             SIZE     PROCESSOR    UNTILdeepseek-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 containerdkubectl rollout restart deploy ollama-deepseek

pod 启动成功后就可以看到使用了 gpu

# kubectl exec -it deployment/ollama-deepseek -- ollama psNAME              ID              SIZE      PROCESSOR          UNTILdeepseek-r1:7b    0a8c26691023    6.0 GB    38%/62% CPU/GPU    2 minutes from now

通过命令行与 deepseek-r1:7b 对话测试一下

尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

参考资料:

https://www.jimangel.io/posts/nvidia-rtx-gpu-kubernetes-setup/

原文始发于微信公众号(智检安全):尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月6日12:28:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1https://cn-sec.com/archives/3804196.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息