ubuntu安装k8s+docker运行英伟达gpu cuda

 安装k8s+docker

sealos reset

sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 --single
英伟达Ubuntu驱动下载地址:https://us.download.nvidia.cn/XFree86/Linux-x86_64/550.78/NVIDIA-Linux-x86_64-550.78.run

./NVIDIA-Linux-x86_64-550.78.run

nvidia-smi

Fri Jul 12 23:18:31 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.78                 Driver Version: 550.78         CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1060 6GB    Off |   00000000:02:00.0  On |                  N/A |
| 38%   39C    P8              8W /  150W |     273MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A       969      G   /usr/lib/xorg/Xorg                            184MiB |
|    0   N/A  N/A      1597      G   /usr/bin/gnome-shell                           65MiB |
|    0   N/A  N/A      2143      G   ...in/bin/sunloginclient --cmd=autorun         11MiB |
|    0   N/A  N/A      2379      G   ...) Chrome/58.0.3029.81 Safari/537.36          1MiB |
|    0   N/A  N/A      2405      G   ...en=DA4D3A8EA9B98D974368ACD3390ED795          5MiB |


distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update --fix-missing
sudo apt-get install -y nvidia-container-toolkit nvidia-docker2
sudo apt-get --only-upgrade install nvidia-docker2

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://yxzrazem.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

sudo docker run --rm -it --gpus all nvidia/cuda:11.8.0-devel-ubuntu22.04 /bin/bash

kubernetes 使用运行时 docker,需要编辑通常存在的配置文件 /etc/docker/daemon.json, 以设置 nvidia-container-runtime 为默认的低级运行时:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}


然后重新启动 docker:

sudo systemctl restart docker

NVIDIA 设备插件

安装工作的 CUDA 驱动程序、设置 NVIDIA 容器工具包和将 containerd 配置为使用 NVIDIA 运行时环境,我们现在可以使用其 Helm chart 来应用 NVIDIA 设备插件。

代码语言:javascript

复制

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 \
  --include-crds \
  --create-namespace \
  --version 0.14.3
时间切片(可选)

NVIDIA 设备插件的默认行为是将整个 GPU 分配给单个 pod,这意味着如果有多个 pod 请求 GPU 时间,每次只会调度一个 pod。

为了克服这个问题,我们可以配置 GPU 的时间切片,即 GPU 在 pod 之间共享。

首先创建一个 ConfigMap,配置最大 10 个副本(第 14 行)来配置时间切片。

代码语言:javascript

复制

# cm-time-slicing.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-time-slicing
  namespace: nvidia-device-plugin
data:
  time-slicing: |-
    version: v1
    sharing:
      timeSlicing:
        resources:
          - name: nvidia.com/gpu
            replicas: 10

然后应用 ConfigMap,并通过名称(第 5 行)和提供的默认配置键(第 8 行)配置 nvidia-device-plugin 使用它。

代码语言:javascript

复制

kubectl apply -f cm-time-slicing.yaml

helm upgrade nvdp nvdp/nvidia-device-plugin \
  --reuse-values \
  --set config.name=cm-time-slicing \
  --set config.default=time-slicing

现在您应该通过运行下面的命令看到每个节点每个 GPU 有 10 个 nvidia.com/gpu 的容量:

代码语言:javascript

复制

kubectl get node -o 'jsonpath={.items[*].status.capacity}' | jq

代码语言:javascript

复制

{
  ...
  "nvidia.com/gpu": "10",
  ...
}

请注意,工作负载从同一 GPU 获取副本,每个工作负载都可以访问相同的 GPU 内存,并在同一故障域中运行,这意味着如果一个工作负载崩溃,它们都会崩溃。

有关配置设备插件的更多详细信息,请参阅 GitHub 上的自述文件

运行工作负载

假设配置都正常,我们现在可以尝试运行一个测试工作负载,通过启动一个请求 GPU 资源的 pod 来使用 GPU(第 11-13 行)。

代码语言:javascript

复制

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
  namespace: cuda-test
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vectoradd
    image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
    resources:
      limits:
        nvidia.com/gpu: "1"

代码语言:javascript

复制

kubectl create ns cuda-test
kubectl apply -f cuda-vectoradd.yaml

如果一切顺利,工作负载的日志应该显示:

代码语言:javascript

复制

kubectl logs -n cuda-test cuda-vectoradd
[Vector addition of 50000 elements]
... Test PASSED

如果一切正常,只需在每个您想要访问 GPU 资源的工作负载上添加 nvidia.com/gpu 的资源限制即可。

代码语言:javascript

复制

resources:
  limits:
    nvidia.com/gpu: "1"

查看请求 GPU 资源的 pod 内部,我们也会发现两个与 NVIDIA 相关的环境变量:

代码语言:javascript

复制

kubectl exec -it <pod> -- env | grep NVIDIA
NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
NVIDIA_VISIBLE_DEVICES=GPU-<UUID>

这表明我们在 pod 中有可用的 GPU 加速计算和视频编码/解码

故障排除

如果您遇到类似的 pod 启动错误:

代码语言:javascript

复制

0/1 nodes are available: 1 Insufficient nvidia.com/gpu. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod..

可能是您没有足够的 GPU 资源,请尝试从“时间切片”部分增加时间切片副本数量,或者购买另一个 GPU,无论对您更划算。

我也遇到过这样的错误,即在重新启动节点后,多个长时间运行的工作负载试图启动时发生错误。重新启动 nvidia-device-plugin pod 和请求 GPU 资源的工作负载似乎可以解决该问题。

使用 Argo CD,我添加了一个负的 sync-wave 注解,以确保在工作负载之前启动 nvidia-device-plugin 以避免此问题。

代码语言:javascript

复制

annotations:
  argocd.argoproj.io/sync-wave: "-1"

附录

我首先尝试使用 NVIDIA GPU Operator,我认为这是一个全能的解决方案,它可以安装设备插件以及驱动程序和容器工具包。但是,我无法让它工作,所以我选择了不幸更多的手动方法,将设备插件、驱动程序和容器工具包作为单独的组件进行安装。

可能是我的设置问题,或者我在文档中理解错了什么。如果您有解决方案,我很乐意倾听!

总结

我正在使用 Argo CD 与 Kustomize + Helm 尝试遵循 GitOps 最佳实践。 在撰写本文时,我的完整家庭实验室配置可在 GitHub 上作为参考

代码语言:javascript

复制

# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
commonAnnotations:
  argocd.argoproj.io/sync-wave: "-1"

resources:
  - namespace.yaml
  - cm-time-slicing.yaml

helmCharts:
  - name: nvidia-device-plugin
    repo: https://nvidia.github.io/k8s-device-plugin
    version: 0.14.2
    releaseName: "nvidia-device-plugin"
    namespace: nvidia-device-plugin
    includeCRDs: true
    valuesFile: values.yaml

代码语言:javascript

复制

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nvidia-device-plugin

代码语言:javascript

复制

# values.yaml
config:
  name: cm-time-slicing
  default: time-slicing

代码语言:javascript

复制

# cm-time-slicing.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-time-slicing
  namespace: nvidia-device-plugin
data:
  time-slicing: |-
    version: v1
    sharing:
      timeSlicing:
        resources:
          - name: nvidia.com/gpu
            replicas: 10
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: k8sDocker是两个非常流行且广泛使用的容器技术。下面是关于k8sDocker指南下载的回答。 首先,在下载Kubernetes(k8s)指南之前,我们需要明确一点,k8s是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。在使用k8s之前,我们通常需要具备一定的容器化应用程序开发和部署经验。因此,如果你已经掌握了k8s的基础知识并准备部署和管理容器化应用程序,那么下面是一些关于k8s指南的下载资源。 - Kubernetes官方网站:Kubernetes官方网站是获取最新版k8s指南的主要来源。你可以在官方文档部分找到完整的k8s指南,包含了从安装到使用的详细教程和例子。你可以访问https://kubernetes.io/获取官方文档的最新版本。 - Kubernetes Github仓库:Kubernetes的源代码托管在Github上,你可以在该仓库中找到完整的k8s文档和指南。你可以访问https://github.com/kubernetes/kubernetes浏览并下载最新的k8s指南。 - Kubernetes相关博客和社区论坛:除了官方文档,一些热心的开发者和社区会在自己的博客或者社区论坛上分享关于k8s的指南和教程。你可以通过搜索引擎或者参与相关的技术讨论来寻找和下载这些指南。 相对于k8sDocker的指南下载更为简单。Docker是一个开源的容器化平台,让开发者和系统管理员可以更方便地构建、部署和运行应用程序。以下是一些下载Docker指南的资源。 - Docker官方网站:Docker官方网站上有关于Docker的完整指南和教程。你可以在https://www.docker.com/上找到并下载最新的Docker指南。 - Docker Github仓库:Docker源代码也托管在Github上,你可以访问https://github.com/docker/docker该仓库获取Docker指南的最新版本。 - Docker相关社区和博客:和k8s一样,一些Docker开发者和社区也会在他们的博客或者社区论坛上分享关于Docker的指南和教程。你可以通过搜索引擎或者参与相关的技术讨论来寻找和下载这些指南。 总之,k8sDocker指南的下载可以通过官方网站、Github仓库以及相关社区和博客来实现。这些指南将帮助你更好地了解和使用k8sDocker这两个强大的容器化技术。 ### 回答2: 要下载Kubernetes(K8s)和Docker相关的指南,可以遵循以下步骤: 1. 打开你的浏览器,访问Kubernetes官方网站,网址为"kubernetes.io"。 2. 在网站顶部的搜索框中输入"Kubernetes Docker指南"并按下回车键。 3. 在搜索结果中,选择适合你的需求的指南,通常会有多个版本和不同的指南可供选择。可以根据自己的操作系统和技术水平选择适合的版本。 4. 点击选中的指南链接,进入指南页面。 5. 在指南页面,你可以找到有关下载和安装Kubernetes和Docker的详细说明。这些说明通常包括相关软件的下载链接、安装步骤、配置文件示例和一些常见问题解答等等。 6. 按照指南中给出的步骤,下载并安装Kubernetes和Docker所需的软件。 7. 阅读指南中的配置部分,认真配置Kubernetes和Docker以满足你的需求。 8. 如果下载过程中遇到任何问题,可以在指南页面的评论区留言,或者在Kubernetes社区的论坛上提问,寻求帮助和解答。 下载Kubernetes和Docker的指南是很重要的,它们将指导你正确安装和配置这些工具,使你能够更加高效地使用和管理容器化应用程序。记得定期查看官方网站,以获取最新版本、更新和指南。 ### 回答3: k8s是一种开源的容器编排平台,而Docker是一种开源的容器化平台。首先,我们需要下载和安装Docker,然后再下载和安装k8s。下面是具体步骤: 1. 首先,打开Docker官方网站(https://www.docker.com/),在上方的菜单中找到并点击“Get Docker”(获取Docker)。 2. 在弹出的页面上,根据你的操作系统选择合适的版本,比如Windows、macOS或Linux,并点击相关的链接。 3. 在新的页面上,按照指导下载Docker安装包。一旦下载完成,双击安装包并按照指示完成安装过程。 4. 安装完成后,打开终端或命令提示符窗口,输入命令“docker --version”来验证安装是否成功。如果成功安装,将显示Docker的版本号。 5. 下载k8s的方式有多种,推荐使用官方提供的kubeadm工具来安装和管理k8s集群。 6. 打开k8s官方文档(https://kubernetes.io/),找到并点击“Getting Started”(入门指南)。 7. 在新页面上,选择合适的教程,根据自己的操作系统和需求进行下载和安装。比如,如果你使用的是Linux系统,可以选择“Creating a single control-plane cluster with kubeadm”(使用kubeadm创建单个控制平面集群)的教程。 8. 按照指导进行下载和安装kubeadm,并按照教程中的步骤一步一步地配置和设置k8s集群。 9. 完成安装后,使用命令“kubectl version”来验证k8s是否成功安装。如果成功安装,将显示k8s的版本信息。 通过按照以上步骤,你可以成功下载和安装k8sDocker,然后开始使用它们来完成容器编排和管理。记得查阅官方文档和其他相关资源,以获得更多关于k8sDocker的知识和使用技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值