踢掉Docker 後,Kubernetes 還能歡快地跑 GPU?

2020-12-12 騰訊網

Kubernetes 集群中 Docker 如何使用 GPU 早就被說爛了,那麼以 Containerd 作為容器運行時的集群是如何使用 GPU的,有人知道嗎?

頭圖 | CSDN 下載自東方 IC

作者 |米開朗基楊 責編 | 張文

出品 | CSDN(ID:CSDNnews)

前兩天鬧得沸沸揚揚的事件不知道大家有沒有聽說,Google 竟然將 Docker 踢出了 Kubernetes 的群聊,不帶它玩了。

我這裡簡單描述下,Kubernetes 是通過 CRI 來對接容器運行時的,而 Docker 本身是沒有實現 CRI 的,所以 Kubernetes 內置了一個 「為 Docker 提供 CRI 支持」 的 dockershim 組件。現在 Kubernetes 宣布不再維護這個組件了。

大概的意思就是:Docker 雖然好用,但那是對人來說的,Kubernetes 又不是人,不需要那些花裡胡哨的東西!

Kubernetes 這是話裡有話,說白了就是:我以前為了兼容你,我集成在我自己這裡,現在我就想自己單純一點,要麼你自己寫 CRI 的接口,要麼就再見。

眾 YAML 工程師直呼 Containerd 真香!

下面進入今天的主題,Kubernetes 具有對機器的資源進行分配和使用的能力,比如可以指定容器最多使用多少內存以及使用多少 CPU 計算資源。

那麼問題來了,一般來說容器就是使用 CPU 和內存資源,那麼對於需要使用顯卡的 Pod,Kubernetes 也能夠支持嗎?答案當然是可以啦!目前 Kubernetes 不僅支持容器請求 GPU 資源,還支持請求幾塊顯卡的 GPU 資源,這使得 Kubernetes 在深度學習和區塊鏈等場景下也有了用武之地。

關於 Kubernetes 集群中 Docker 如何使用 GPU,Kubernetes 的官方文檔已經說的很清楚了,網上也有鋪天蓋地的博客手把手教你怎麼做。至於以 Containerd 作為容器運行時的集群如何使用 GPU,網上還找不到一篇像樣的文檔來告訴大家怎麼做,今天我就來做吃螃蟹的第一人。

要想在容器裡使用 GPU,本質上就是我們要在容器裡能看到並且使用宿主機上的顯卡,所有的步驟都是圍繞這個來做的。當然,本文不會涉及如何安裝 Containerd,也不會涉及如何安裝 Kubernetes,如果這些都搞不定,建議不要往下看。

Nvidia 驅動

某些命令以 Ubuntu 作為示例。首先宿主機上必先安裝Nvidia 驅動。這裡推薦從 Nvidia 官網下載腳本安裝,安裝和卸載都比較方便並且適用於任何 Linux 發行版,包括 CentOS,Ubuntu 等。NVIDIA Telsa GPU 的 Linux 驅動在安裝過程中需要編譯 kernel module,系統需提前安裝 gcc 和編譯 Linux Kernel Module 所依賴的包,例如 kernel-devel-$(uname -r) 等。

安裝 gcc 和 kernel-dev(如果沒有) sudo apt install gcc kernel-dev -y。

訪問官網下載。

選擇作業系統和安裝包,並單擊【SEARCH】搜尋驅動,選擇要下載的驅動版本

下載對應版本安裝腳本,在宿主機上執行:

安裝,執行腳本安裝:

驗證,使用如下命令驗證是否安裝成功 nvidia-smi ,如果輸出類似下圖則驅動安裝成功。

CUDA 驅動

CUDA(Compute Unified Device Architecture)是顯卡廠商 NVIDIA 推出的運算平臺。CUDA 是一種由 NVIDIA 推出的通用並行計算架構,該架構使 GPU 能夠解決複雜的計算問題。它包含了 CUDA 指令集架構(ISA)以及 GPU 內部的並行計算引擎。這裡安裝的方式和顯卡驅動安裝類似。

訪問官網下載

下載對應版本如下:

3. 配置環境變量

nvidia-container-runtime

nvidia-container-runtime 是在 runc 基礎上多實現了 nvidia-container-runime-hook(現在叫 nvidia-container-toolkit),該 hook 是在容器啟動後(Namespace 已創建完成),容器自定義命令(Entrypoint)啟動前執行。

當檢測到 NVIDIA_VISIBLE_DEVICES 環境變量時,會調用 libnvidia-container 掛載 GPU Device 和 CUDA Driver。如果沒有檢測到 NVIDIA_VISIBLE_DEVICES 就會執行默認的runc。

下面分兩步安裝:

先設置 repository 和 GPG key:

安裝:

配置 Containerd 使用 Nvidia container runtime

如果 /etc/containerd 目錄不存在,就先創建它:

生成默認配置:

Kubernetes 使用設備插件(Device Plugins)[3] 來允許 Pod 訪問類似 GPU 這類特殊的硬體功能特性,但前提是默認的 OCI runtime 必須改成 nvidia-container-runtime,需要修改的內容如下:

/etc/containerd/config.toml

重啟 containerd 服務:

部署 NVIDIA GPU 設備插件

一條命令解決戰鬥:

查看日誌:

可以看到設備插件部署成功了。在 Node 上面可以看到設備插件目錄下的socket:

測試 GPU

首先測試本地命令行工具 ctr,這個應該沒啥問題:且顯卡資源是獨佔,無法在多個容器之間分享。

最後進入終極測試:在 Pod 中測試 GPU 可用性。先創建部署清單:

gpu-pod.yaml

執行 kubectl apply -f ./gpu-pod.yaml 創建 Pod。使用 kubectl get pod 可以看到該 Pod 已經啟動成功:

查看 Pod 日誌:

可以看到成功運行。這也說明 Kubernetes 完成了對 GPU 資源的調用。需要注意的是,目前 Kubernetes 只支持卡級別的調度,並且顯卡資源是獨佔,無法在多個容器之間分享。

參考資料

[1]官網: https://www.nvidia.com/Download/Find.aspx

[2] 官網: https://developer.nvidia.com/cuda-toolkit-archive

[3] 設備插件(Device Plugins): https://v1-18.docs.kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/

[4] 容器中使用 GPU 的基礎環境搭建: https://lxkaka.wang/docker-nvidia/

相關焦點

  • 將 Docker 踢出群聊後,Kubernetes 還能否歡快地蹦躂嗎?
    /etc/profile.d/cuda.sh  $ source /etc/profile3. nvidia-container-runtimenvidia-container-runtime 是在 runc 基礎上多實現了 nvidia-container-runime-hook(現在叫 nvidia-container-toolkit),該 hook 是在容器啟動後
  • 通過Docker安裝谷歌足球遊戲環境
    開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平臺。簡單來說,谷歌提供了包含安裝足球環境所需的必要環境在一個Docker配置文件中,安裝好Docker後,一條命令就可以創建包含足球環境的整套配置的Docker容器。通過容器可以直接進入安裝好足球環境的「虛擬」系統中。
  • 2020版Kubernetes快速上手指南,讓你所見即所得
    註:從 Google 搜尋引擎的趨勢數據來看,Kubernetes和Spring Boot的關注度同趨勢地從2016年後迅猛增長,而相應OpenStack和Hadoop在2016後遇冷下降明顯,折射著雲計算2.0時代的到來。
  • 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群
    Created network 'k3d-devcluster'               INFO[0000] Created volume 'k3d-devcluster-images'         INFO[0001] Creating node 'k3d-devcluster-server-0'        INFO[0016] Pulling image 'docker.io
  • Docker 入門教程
    總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。五、Docker 的用途Docker 的主要用途,目前有三大類。
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    -42164f156d72f36753e2cdfb7de0c558           1/1     Running   0          5d  docker-registry-4216c813a129bb53c21f21e63990fd6b           1/1     Running   0          5d  docker-registry-4216d818db629c2b035276f82acfdba3
  • docker下高並發和高可用之docker swarm使用
    至少2臺Linux的主機,這裡選擇CentOS72.Xshell工具在Windows作業系統下通過VMware Workstation創建兩臺CentOS的虛擬機虛擬機啟動後,通過xShell分別連接上兩臺虛擬機分別為兩臺虛擬機安裝docker
  • 雲計算核心技術Docker教程:Docker多階段構建
    /bin/shecho Building alexellis2/href-counter:builddocker build --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy \-t alexellis2/href-counter:build .
  • 使用Docker和Docker Compose改善Node.js的開發
    遵循"Coding到老,學習到老,折騰到老"的宗旨,本文我們將介紹將如何結合Node.js與Docker開改善開發人員體驗,包括使用docker build和利用Docker Compose來實現無縫的本地前端開發環境。
  • 雲計算核心技術Docker教程:Docker Compose的restart和rm命令詳解
    Docker-Compose restart命令可以重新啟動所有已停止並正在運行的服務,Docker-Compose rm命令可以刪除已經停止的容器,如果服務在運行,需要先docker-compose stop 停止容器。
  • Docker+jenkins小知識,講解通俗易懂,有必要收藏
    持續集成是軟體開發中一個非常重要的環節,我們都知道持續集成的這種方式,不僅僅是影響軟體開發的效率,實際上還會對我們軟體開發的流程會產生一定的影響,例如:我們所選擇的構建的方式,那麼你的應用程式的部署的方式,軟體開發與測試需要不斷地對應用進行持續構建,這些都會受我們持續集成的構建的方案所影響。
  • 用Jenkins、Docker部署 Serverless
    ,啟動 jenkins 命令如下:docker run -d -p 8080:8080 --name jenkins -e TZ="Asia/Shanghai" -v jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):$(which docker
  • SpringBoot+GitLab+Docker+Jenkins實現持續集成上
    每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘快地發現集成錯誤。許多團隊發現這個過程可以大大減少集成的問題,讓團隊能夠更快的開發內聚的軟體。持續集成的好處:自動化集成部署,提高了集成效率。更快地修復問題。
  • 雲計算核心技術Docker教程:Docker 守護進程dockerd的LCOW選項
    例C:\> dockerd --storage-opt lcow.kirdpath=c:\path\to\fileslcow.kernel指定位於lcow.kirdpath路徑中的內核文件的文件名。默認為bootx64.efi。
  • 擁抱Kubernetes,再見了Spring Cloud
    相信很多Java從業者在熟悉了微服務開發後,自以為用 Spring Cloud 已經成功打造了微服務架構帝國,Java 已經壟斷微服務領域,殊不知當引入 k8s 後,Spring Cloud 卻和 Cloud Native 的生態發展脫軌了。
  • 才雲新晉大神:GPU在Docker/K8S/TensorFlow的應用及實操經驗
    曾在HP和HPE工作五年多,先前負責過Linux Kernel及driver開發,後負責Container在HPE Server上的性能及團隊管理工作,之後負責Kubernetes/Mesos在HPE伺服器上的硬體enablement及開源工作。 為什麼離開惠普,加入才雲? 2016年下旬,前惠普Kubernetes技術領域的GPU專家趙慧智加盟才雲。