Kubernetes目前主要在很小程度上支持CPU和內存的發現。Kubelet自己處理的設備很是少。
Kubernetes對於硬件都使用都依賴於硬件廠商的自主研發kubernetes插件,經過硬件廠商的插件從而讓kubernetes進行硬件支持。git
實現的邏輯以下:github
Kubernetes的NVIDIA設備插件是一個Daemonset,容許您自動:docker
公開羣集的每一個節點上的GPU數量
跟蹤GPU的運行情況
在Kubernetes集羣中運行啓用GPU的容器。
該存儲庫包含NVIDIA的Kubernetes設備插件的官方實現。json
運行Kubernetes NVIDIA設備插件的先決條件列表以下所述:ubuntu
運行nvidia-docker 2.0 先決條件列表以下所述:centos
在繼續以前,必須完全刪除nvidia-docker軟件包的1.0版。
您必須中止並刪除全部使用nvidia-docker 1.0啓動的容器。api
docker volume ls -q -f driver = nvidia-docker | xargs -r -I {} -n1 docker ps -q -a -f volume = {} | xargs -r docker rm -f sudo apt-get purge nvidia-docker
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f sudo yum remove nvidia-docker
確保已爲您的發行版安裝了NVIDIA驅動程序和受支持的Docker 版本(請參閱先決條件)。
若是有自定義/etc/docker/daemon.json,則nvidia-docker2程序包可能會覆蓋它,先作好相關備份。架構
安裝nvidia-docker2軟件包並從新加載Docker守護程序配置:學習
sudo apt-get install nvidia-docker2 sudo pkill -SIGHUP dockerd
安裝nvidia-docker2軟件包並從新加載Docker守護程序配置:測試
sudo yum install nvidia-docker2 sudo pkill -SIGHUP dockerd
若是必需要使用舊版本的docker進行安裝nvidia-docker 2.0
必須固定nvidia-docker2以及nvidia-container-runtime安裝時的版本,例如:
sudo apt-get install -y nvidia-docker2=2.0.1+docker1.12.6-1 nvidia-container-runtime=1.1.0+docker1.12.6-1
使用
apt-cache madison nvidia-docker2 nvidia-container-runtime
或
yum search --showduplicates nvidia-docker2 nvidia-container-runtime
列出可用版本。
基本用法
nvidia-docker向Docker守護程序註冊一個新的容器運行時。使用時必須選擇nvidia運行時docker run:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
nvidia-docker 2.0安裝和使用方法詳見《docker在Ubuntu下1小時快速學習》
須要啓用nvidia運行時做爲節點上的默認運行時。須要編輯docker守護進程配置文件,該文件一般出如今/etc/docker/daemon.json,配置內容以下:
{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } }
若是runtimes不存在,請從新安裝nvidia-docker,或參考nvidia-docker官方頁面
在您但願使用的全部 GPU節點上啓用此選項後,您能夠經過部署如下Daemonset在羣集中啓用GPU支持:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.11/nvidia-device-plugin.yml
可使用資源屬性nvidia.com/gpu配置,來經過容器級資源使用NVIDIA GPU要求:
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: containers: - name: cuda-container image: nvidia/cuda:9.0-devel resources: limits: nvidia.com/gpu: 2 #請求2個GPU - name: digits-container image: nvidia/digits:6.0 resources: limits: nvidia.com/gpu: 2 #請求2個GPU
警告: 若是在使用帶有NVIDIA映像的設備插件時,未配置GPU請求個數,則宿主機上全部GPU都將暴露在容器內。
一、獲取鏡像
方法1,從Docker Hub中提取預構建的映像:
docker pull nvidia/k8s-device-plugin:1.11
方法2,不使用鏡像,採用官方build方法:
docker build -t nvidia/k8s-device-plugin:1.11 https://github.com/NVIDIA/k8s-device-plugin.git#v1.11
方法3,採用自定義build文件方法:
git clone https://github.com/NVIDIA/k8s-device-plugin.git && cd k8s-device-plugin docker build -t nvidia/k8s-device-plugin:1.11 .
二、在本地運行
docker run --security-opt=no-new-privileges --cap-drop=ALL --network=none -it -v /var/lib/kubelet/device-plugins:/var/lib/kubelet/device-plugins nvidia/k8s-device-plugin:1.11
三、kubernetes部署爲守護進程集:
kubectl create -f nvidia-device-plugin.yml
一、構建
C_INCLUDE_PATH=/usr/local/cuda/include LIBRARY_PATH=/usr/local/cuda/lib64 go build
二、在本地運行
./k8s-device-plugin