K8s-device-plugin#

K8s-device-plugin - компонент DropApp, который позволяет управлять устройствами в кластере, такими как GPU. K8s-device-plugin автоматически обнаруживает и регистрирует устройства в кластере, делая их доступными для использования в pods.

Плагин k8s-device-plugin осуществляет следующие функции:

  • отслеживание графических процессоров на каждом node кластера;

  • отслеживание состояния графических процессоров;

  • запуск контейнеров с поддержкой графического процессора в кластере.

Подготовка nodes графического процессора (опциональная возможность на усмотрение пользователя)#

Предварительные условия подготовки nodes:

  • драйверы NVIDIA и набор инструментов nvidia-container предварительно установлены (в состав DropApp не входят);

  • среда nvidia-container-runtime настроена.

  1. Включите поддержку графического процессора, развернув набор демонов:

    kubectl create -f https://<repoexample.ru>/NVIDIA/k8s-device-plugin/v0.14.5/deployments/static/nvidia-device-plugin.yml
    # Укажите актуальный путь до локального репозитория
    

    Содержание манифеста nvidia-device-plugin.yml будет следующим:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
                priorityClassName: "system-node-critical"
          containers:
          - image: nvcr.io/nvidia/k8s-device-plugin:v 0.12.5
            name: nvidia-device-plugin-ctr
            env:
              - name: FAIL_ON_INIT_ERROR
                value: "false"
            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
    
  2. Запустите pod для графического процессора:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
          resources:
            limits:
              nvidia.com/gpu: 1 # requesting 1 GPU
      tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
    EOF
    
  3. Проверьте корректность запуска:

    kubectl logs gpu-pod
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done