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                                                 |
+-----------------------------------------------------------------------------+


+ Recent posts