nvidia-docker2 在 Kubernetes 上實踐
女主宣言
nvida-docker2 可以幫助我們將舊的加速計算應用程式容器化,將特定的 GPU 資源分配給容器,並可以輕鬆地跨不同的環境共享應用程式、協同工作和測試應用程式。今天帶來的分享是有關 nvidia-docker2 在大規模 Kubernetes 叢集上的實踐記錄。本文首發於 OpsDev.cn,轉載已獲取作者授權。
The Dunes in Mars' Wirtz Crater
by NASA IOTD
現在公司線上所有的k8s叢集對GPU資源的使用都是nvidia-docker 1.0(歷史遺留問題)。但是現在的kubernetes1.9推薦使用device plugin的方式來對接外部廠商的資源。這樣所有的廠商資源就不要kubernetes去特定的支援,而是各服務廠商只要按照kubernetes提供的device plugin實現自己的一套就可以了。今天就針對nvidia-docker2.0 進行了下測試。在此做下記錄。
1
實驗環境
CentOS Linux release 7.2.1511 (Core)
kuberntes: 1.9
GPU: nvidia-tesla-k80
2
Installation (version 2.0)
直接參照官方的安裝教程: Installation (version 2.0))
(version-2.0)
在安裝nvidia-docker 2.0需要做一些準備的工作,要求如下:
GNU/Linux x86_64 with kernel version > 3.10
Docker >= 1.12
NVIDIA GPU with Architecture > Fermi (2.1)
NVIDIA drivers~= 361.93 (untested on older versions)
Your driver version might limit your CUDA capabilities
(see CUDA requirements)
簡單的描述下安裝的過程:
CentOS 7 (docker-ce), RHEL 7.4/7.5 (docker-ce), Amazon Linux 1/2
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
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
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo yum install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
nvidia-docker 2.0安裝完成之後,需要配置docker的runtime為nvidia-container-runtime。
具體的內容如下:
{
"default-runtime":"nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
}
重新啟動docker服務:
systemctl restart docker
注意:If you have a custom /etc/docker/daemon.json, the nvidia-docker2 package might override it.
3
GPU on kubernetes
簡述的描述下現在kubernetes對GPU的支援情況。kubernetes在1.6版本就開始對nvidia GPU的支援,並且仍然在不斷的最佳化改進中。kubernetes對AMD GPU的支援是在1.9版本才支援。但是現在kubernetes仍然還沒有支援多容器使用同一塊GPU卡的情況。這樣就會造成GPU資源的浪費。
kubernetes 官方文件描述:
Each container can request one or more GPUs. It is not possible to request a fraction of a GPU.
nvidia-docker2.0 已經安裝完成了,繼續,下來就是如何在kubernetes上使用了。kubernetes要排程GPU 有這麼幾點要求:
開啟kubernetes對GPU的支援。(在1.10之前需要指定--feature-gates="DevicePlugins=true"。1.10之後就不需要在指定了)。
在kubernetes計算節點安裝GPU drivers及device plugin。
對Device Plugins進行下簡單的描述:
從kuberntes 1.8版本開始提供一套device plugin framework來為服務廠商接入它們自己的資源(GPUs, High-performance NICs, FPGAs)。而不需要更改kubernetes的原始碼。
現在我們只關心Nvidia-GPU,讓我們來部署GPU device plugin, 具體的部署流程如下:
nvidia-docker-plugin.yml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nvidia-device-plugin-daemonset
namespace: kube-system
spec:
template:
metadata:
# Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
# reserves resources for critical add-on pods so that they can be rescheduled after
# a failure. This annotation works in tandem with the toleration below.
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: nvidia-device-plugin-ds
spec:
tolerations:
# Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
# This, along with the annotation above marks this pod as a critical add-on.
- key: CriticalAddonsOnly
operator: Exists
containers:
- image: nvidia/k8s-device-plugin:1.9
name: nvidia-device-plugin-ctr
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
建立GPU-device-plugin資源:
kubectl create -f nvidia-docker-plugin.yml
建立成功之後,在每臺GPU機器上會有nvidia-device-plugin-daemonset的資源。
現在所有的準備工作都完成了。讓我們來測試GPU能否正常的排程到GPU機器上吧。測試的gpu-pod資源mainfest內容如下:
nvidia-docker2-gpu-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: cuda-vector-add
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vector-add
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-k80 # or nvidia-tesla-k80 etc.
根據上面的檔案建立資源並進行校驗:
kubectl create -f nvidia-docker2-gpu-pod.yml
進入到容器中檢視相關的裝置及cuda庫是否掛載到了容器中,並且驗證我們給容器分配的只有一塊卡。
4
總結
在kubernetes中使用nvidia-docker 1.0的弊端在於,在使用資源物件進行資源建立的時候,需要在配置中將GPU Driver以volume的方式掛載到容器中,這步需要人為的進行干涉。
但是使用nvidia-docker 2.0的方式不要再在配置中指定GPU Driver的位置,完全有device plugin來做這件事,方便省事兒。並且kubernetes對外提供了device plugin的介面,也方便各個廠商來對自家的資源實現對k8s的無縫接入。
不僅僅是device plugin,kubernetes對容器執行時,也提供了同樣的interface的方式,來對外提供對各家執行時的支援,這也就是kubernetes擴充套件性的強大之處吧。
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2222262/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jenkins 在 Kubernetes 上的實踐Jenkins
- CoreOS實踐(2)—在coreos上安裝Kubernetes
- Kubernetes在宜信落地實踐
- kubernetes在騰訊遊戲的應用實踐遊戲
- kubernetes實踐之七十:Istio之流量管理(上)
- LoadBalancer在kubernetes架構下的實踐架構
- Native Flink on Kubernetes 在小紅書的實踐
- Kubernetes在華為全球 IT系統中的實踐
- 使用Devtron在Kubernetes上實現GitOpsdevGit
- 建木在 Rainbond 上使用實踐AI
- Kubernetes監控實踐
- Serverless Kubernetes 落地實踐Server
- Kubernetes Deployment 最佳實踐
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(工具部署)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)SpringGCCloud
- Kubernetes 微服務最佳實踐微服務
- Kubernetes 最佳安全實踐指南
- kubernetes實踐之十一:EFK
- 在滴滴雲上搭建 API-Gateway Kong 實踐APIGateway
- Groovy探索 DSL在Calendar類上的實踐 一
- kubernetes實踐之六十:Cabin-Manage Kubernetes
- 在 Ali Kubernetes 系統中,我們這樣實踐混沌工程
- 在Podman、Kubernetes和OpenShift上使用Odo實現Java開發Java
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 診斷(線上聯調)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(可灰度)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)SpringGCCloud
- Spring Cloud 應用在 Kubernetes 上的最佳實踐 — 高可用(混沌工程)SpringCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(容量評估)SpringGCCloud
- VPGAME的Kubernetes遷移實踐GAM
- VPGAME 的 Kubernetes 遷移實踐GAM
- 華為雲的Kubernetes實踐之路
- kubernetes1.13.X實踐-部署
- Kubernetes YAML最佳實踐和策略YAML
- kubernetes實踐之五十二:Helm
- kubernetes實踐之五十七:PodPreset
- kubernetes實踐之五十八:CronJob
- kubernetes實踐之十七:架構架構