Centos 7에서 설치를 진행하였습니다.
공식홈페이지에서 요구사항입니다.
Prerequisites
The list of prerequisites for running the NVIDIA device plugin is described below:
- NVIDIA drivers ~= 361.93
- nvidia-docker version > 2.0 (see how to install and it's prerequisites)
- docker configured with nvidia as the default runtime.
- Kubernetes version = 1.10
- The
DevicePlugins
feature gate enabled
참고사이트 :
먼저 nvidia-docker2 을 설치한다
이전에 버전1을 깔았다면 아래 명령어로 제거해준다.
$ yum install nvidia-docker2
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
$ yum remove nvidia-docker
버전 2설치
$ yum install nvidia-docker2
$ pkill -SIGHUP dockerd
도커 실행
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
도커에서 제대로 실행이 된다면 이젠 k8s에서 pod으로 띄워본다.
k8s에서 띄우기 위해선 몇가지 작업을 더 해줘야한다.
아래 과정들은 모든 노드에서 진행한다.
데몬 설정에 아래와 같이 해준다 path엔 실제 돌아가는 nvidia-container-runtime을 추가해준다.
$ vi /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime-hook",
"runtimeArgs": []
}
}
}
DevicePlugins에 아래와같이 하여 enable시켜준다
$ vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
Environment="KUBELET_EXTRA_ARGS=--feature-gates=DevicePlugins=true"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
데몬에 적용
$ systemctl daemon-reload
$ systemctl restart kubelet
쿠버네티스에 gpu support을 enable시켜준다. ( 버전 정보는 자신의 k8s 버전에 맞게 ^^ )
$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.10/nvidia-device-plugin.yml
pod이 제대로 떠있는지 확인 ( nvidia-device-plugin-daemonset 이 올라왔다면 완료 !)
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default test-p-5f44f8586f-g98pd 0/1 ImagePullBackOff 0 16m
kube-system etcd-jframe-master 1/1 Running 2 2d
kube-system kube-apiserver-jframe-master 1/1 Running 2 2d
kube-system kube-controller-manager-jframe-master 1/1 Running 2 2d
kube-system kube-dns-86f4d74b45-nxqfr 3/3 Running 6 2d
kube-system kube-flannel-ds-7dmtt 1/1 Running 3 2d
kube-system kube-flannel-ds-f9vbs 1/1 Running 0 2d
kube-system kube-proxy-9xgll 1/1 Running 0 2d
kube-system kube-proxy-w6hm8 1/1 Running 3 2d
kube-system kube-scheduler-jframe-master 1/1 Running 2 2d
kube-system nvidia-device-plugin-daemonset-7vdwp 1/1 Running 6 2d
gpu의 개수를 출력해보았다 ( 실제론 master에도 gpu가 2개 장착되어있지만, 실제 pod가 실행되는 곳이 slave라 마스터엔 nvidia-device-plugin이 설치안된듯 )
만약 여기서 실제 노드에 gpu가 장착되어있음에도 0으로 잡힌다면 각 노드에서 docker ps을 통해 nvidia-device-plugin이 제대로 떠 있는지 확인해본다.
$ kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
NAME GPU
master 0
slave 2
만들어둔 yaml을 통해 실행시켜봤다.
$ cat test.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: gpu-demo
spec:
replicas: 1
template:
metadata:
labels:
run: gpu-demo
annotations:
scheduler.alpha.kubernetes.io/nvidiaGPU: "{ \n \"AllocationPriority\": \"Dense\"\n}\n"
spec:
containers:
- name: gpu-demo
image: nvidia/cuda:7.5-runtime
command:
- "/bin/sh"
- "-c"
args:
- nvidia-smi && tail -f /dev/null
resources:
limits:
alpha.kubernetes.io/gpu: 2
만들어둔 yaml을 통해 실행시켜봤다.
$ kubectl apply -f test.yaml
실행한 pod의 로그를 확인 ( 제대로 설치 된것을 확인할 수 있다 )
$ kubectl logs gpu-demo-85bdc64dd7-5grcg
Mon May 28 17:25:27 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.59 Driver Version: 390.59 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:01:00.0 Off | N/A |
| 0% 48C P8 18W / 250W | 0MiB / 11176MiB | 1% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 108... Off | 00000000:04:00.0 Off | N/A |
| 0% 41C P8 9W / 250W | 0MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
'apps > docker' 카테고리의 다른 글
flannel을 통한 pod간 통신 (2) | 2018.07.03 |
---|---|
도커에서 nodejs+mongodb 테스트 (0) | 2018.07.01 |
centos7에서 nvidia driver설치하기 (0) | 2018.05.28 |
kubenetes설치 실패 시 초기화방법 (0) | 2018.05.28 |
Kubernetes + Docker 설치 ( CentOS ) (1) | 2018.05.28 |