Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Configure and manage the ack-nvidia-device-plugin add-on

Última atualização: Sep 18, 2026

O NVIDIA Device Plugin é um plugin de dispositivo GPU para clusters Kubernetes que gerencia GPUs em cada nó, permitindo que o Kubernetes utilize recursos de GPU com maior eficiência. Este tópico descreve como atualizar e reiniciar o NVIDIA Device Plugin, isolar dispositivos GPU e verificar sua versão nos nós do Alibaba Cloud Container Service for Kubernetes (ACK) em cenários de agendamento exclusivo de GPU.

Notas de uso

Ao implantar o NVIDIA Device Plugin como um DaemonSet, observe o seguinte:

  • O add-on é instalado automaticamente quando você cria um cluster.

  • Se você desinstalar este add-on, os nós com aceleração GPU adicionados por dimensionamento não conseguirão reportar seus recursos de GPU corretamente.

  • A atualização de um cluster de uma versão anterior para a 1.32 também atualiza o NVIDIA Device Plugin de um static pod para um add-on ACK.

  • O DaemonSet usa um NodeSelector (ack.node.gpu.schedule=default). Quando um nó com aceleração GPU é adicionado ao cluster, o script ACK que adiciona o nó anexa automaticamente esse rótulo ao nó. O DaemonSet então implanta seu pod no nó com aceleração GPU.

Importante
  • Se um nó executa Ubuntu 22.04 ou Red Hat Enterprise Linux (RHEL) 9.3 64-bit, o NVIDIA Device Plugin pode não funcionar corretamente após a execução do comando systemctl daemon-reload ou systemctl daemon-reexec. Esse problema ocorre porque o componente ack-nvidia-device-plugin define a variável de ambiente NVIDIA_VISIBLE_DEVICES=all para os pods por padrão, o que pode tornar o dispositivo GPU inacessível. Para mais informações, consulte What do I do if the "Failed to initialize NVML: Unknown Error" error occurs when I run a GPU container?.

  • Se você atualizar um cluster de uma versão anterior à 1.32 para a versão 1.32 antes de 1º de maio de 2025, o cluster poderá conter NVIDIA Device Plugins implantados tanto como static pods quanto como DaemonSets. Execute o script a seguir para localizar os nós onde o NVIDIA Device Plugin está implantado como um static pod.

    #!/bin/bash
    # Loop through all pods with the component=nvidia-device-plugin label in the kube-system namespace.
    for i in $(kubectl get po -n kube-system -l component=nvidia-device-plugin | grep -v NAME | awk '{print $1}');do
        # Check if the pod's configuration source is 'file', which indicates a static pod.
        if kubectl get po $i -o yaml -n kube-system | grep 'kubernetes.io/config.source: file' &> /dev/null;then
        # Print the node name if it is a static pod.
        kubectl get pod $i -n kube-system -o jsonpath='{.spec.nodeName}{"\n"}'
        fi
    done

    Saída esperada:

    cn-beijing.10.12.XXX.XX
    cn-beijing.10.13.XXX.XX

    A saída indica que alguns nós ainda têm o NVIDIA Device Plugin implantado como um static pod. Use o comando a seguir para migrar o NVIDIA Device Plugin de um static pod para um DaemonSet.

    kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=default
  • Ao atualizar um node pool em um cluster de versão 1.31 ou anterior, o processo também atualiza o NVIDIA Device Plugin e redefine quaisquer configurações não padrão.

Diferenças entre versões

A implementação e as estratégias de gerenciamento do componente ack-nvidia-device-plugin variam conforme a versão do cluster, conforme descrito na tabela a seguir.

Recurso

Versão 1.32 e posteriores

Versões 1.20 a 1.31

Método de implantação

DaemonSet

static pod

Método de gerenciamento

Página Add-ons no console ACK

Manual

Requisito de rótulo do nó

ack.node.gpu.schedule=default

Nenhum

Estratégia de atualização do node pool

Atualização manual

Atualização automática

Se a versão do seu cluster for anterior à 1.20, recomendamos que você manually upgrade the cluster .

Pré-requisitos

Verificar a versão do NVIDIA device plugin

Version 1.32 and later

Para add-ons implantados como DaemonSet, acesse a página Add-ons no console ACK, localize o add-on ack-nvidia-device-plugin e visualize sua versão no card do add-on.

Versions 1.20 to 1.31

Para add-ons implantados como static pod, execute o comando a seguir para verificar a versão do add-on.

kubectl get pods -n kube-system -l component=nvidia-device-plugin \
  -o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\t"}{.spec.nodeName}{"\n"}{end}' \
  | awk -F'[:/]' '{split($NF, a, "-"); print a[1] "\t" $0}' \
  | sort -k1,1V \
  | cut -f2- \
  | awk -F'\t' '{split($1, img, ":"); print img[NF] "\t" $2}'

Atualizar o NVIDIA device plugin

  1. Atualize o add-on ack-nvidia-device-plugin.

    Version 1.32 and later

    1. Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.

    2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons.

    3. Na página Add-ons, localize o card ack-nvidia-device-plugin e clique em Upgrade.

    4. Na caixa de diálogo exibida, clique em OK.

    Versions 1.20 to 1.31

    1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Nodes > Nodes.

    2. Selecione os nós com aceleração GPU que deseja gerenciar, clique em Batch Operations na parte inferior da lista de nós, selecione Run Shell Scripts na caixa de diálogo Batch Operations e clique em OK.

      Importante

      Recomendamos que você primeiro atualize o GPU device plugin em um número reduzido de nós com aceleração GPU. Após verificar que o plugin funciona conforme o esperado, realize a atualização nos nós restantes.

    3. Você será redirecionado para o console do CloudOps Orchestration Service (OOS). Defina Execution Mode como Paused Upon Failure e clique em Next: Parameter Settings.

    4. Na página de configurações de parâmetros, selecione Run Shell Script e cole o script de exemplo a seguir.

      Nota
      • Defina o parâmetro RUN_PKG_VERSION no script com o número de versão principal do cluster (por exemplo, 1.30). Não insira o número de versão secundário (por exemplo, 1.30.1), pois o script retornará um erro.

      • No script, altere o parâmetro REGION_ID para o ID de região do cluster atual, por exemplo, cn-beijing.

      #!/bin/bash
      set -xe
      
      # Set the Kubernetes major version.
      RUN_PKG_VERSION=1.30
      # Set the region ID.
      REGION_ID=cn-beijing
      
      function update_device_plugin() {
      	base_dir=/tmp/update_device_plugin
      	rm -rf $base_dir
      	mkdir -p $base_dir
      	cd $base_dir
      	region_id=$REGION_ID
      	PKG_URL=https://aliacs-k8s-${region_id}.oss-${region_id}-internal.aliyuncs.com/public/pkg/run/run-${RUN_PKG_VERSION}.tar.gz
      	curl -sSL --retry 3 --retry-delay 2 -o run.tar.gz $PKG_URL
      	tar -xf run.tar.gz
      
      	local dir=pkg/run/$RUN_PKG_VERSION/module
      	# Replace the image registry address.
      	sed -i "s@registry.cn-hangzhou.aliyuncs.com/acs@registry-${region_id}-vpc.ack.aliyuncs.com/acs@g" $dir/nvidia-device-plugin.yml
      	mkdir -p /etc/kubernetes/device-plugin-backup
      	mkdir -p /etc/kubernetes/manifests
      	# Back up the old configuration file.
      	mv  /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes/device-plugin-backup/nvidia-device-plugin.yml.$(date +%s)
      	sleep 5
      	# Copy the new configuration file.
      	cp -a $dir/nvidia-device-plugin.yml /etc/kubernetes/manifests
      	echo "succeeded to update device plugin"
      }
      
      # Check if the nvidia-device-plugin.yml file exists.
      if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then
      	update_device_plugin
      else
      	echo "skip to update device plugin"
      fi
    5. Clique em Next: Confirm. Após confirmar as informações, clique em Create.

      Após a criação da tarefa, você será redirecionado automaticamente para a página Task Execution Management, onde poderá visualizar o status de execução da tarefa. A atualização foi bem-sucedida se o campo Output exibir succeeded to update device plugin.

  2. Verifique se o add-on funciona conforme o esperado.

    Execute os comandos a seguir para verificar se o GPU device plugin está funcionando corretamente no nó com aceleração GPU.

    1. Use kubectl to connect to the cluster in Workbench or CloudShell.

    2. Execute o comando a seguir para verificar se o NVIDIA Device Plugin foi reiniciado:

      kubectl get po -n kube-system -l component=nvidia-device-plugin 

      A coluna AGE na saída de exemplo indica se o pod foi reiniciado.

      NAME                             READY   STATUS    RESTARTS      AGE
      nvidia-device-plugin-xxxx        1/1     Running   1             1m
    3. Após todos os pods reiniciarem, execute o script a seguir para verificar se os nós estão reportando recursos de GPU:

      #!/bin/bash
      
      # Get all NVIDIA Device Plugin pods and their corresponding nodes.
      PODS=$(kubectl get po -n kube-system -l component=nvidia-device-plugin -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}')
      
      # Iterate through each pod's node.
      echo "$PODS" | while IFS=$'\t' read -r pod_name node_name; do
          # Get the allocatable nvidia.com/gpu resource value for the node.
          gpu_allocatable=$(kubectl get node "$node_name" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null)
      
          # Check if the resource value is 0.
          if [ "$gpu_allocatable" == "0" ]; then
              echo "Error: node=$node_name, pod=$pod_name, resource(nvidia.com/gpu) is 0"
          fi
      done

      Se um nó reportar zero recursos, consulte Restart the NVIDIA Device Plugin.

Reiniciar o NVIDIA device plugin

Nos cenários de agendamento exclusivo de GPU no ACK, o device plugin que reporta os dispositivos GPU em um nó é implantado como um pod por padrão. Portanto, reinicie o plugin diretamente no nó de destino.

Version 1.32 and later

  1. Execute o comando a seguir para localizar o pod do device plugin no nó correspondente.

    kubectl get pod -n kube-system -l component=nvidia-device-plugin -o wide | grep <NODE>
  2. Execute o comando a seguir para reiniciar o pod do device plugin correspondente.

    kubectl delete po <DEVICE_PLUGIN_POD> -n kube-system 

Versions 1.20 to 1.31

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Nodes > Node Pools.

  2. Na página Node Pools, clique no nome do node pool para acessar a página de gerenciamento de nós e, em seguida, faça login no nó com aceleração GPU de destino.

    Se o sistema operacional for ContainerOS, o login direto de usuário é desabilitado por padrão para reduzir riscos de segurança, e o login via SSH não é fornecido. Caso ainda precise acessar uma instância para operações de O&M, consulte O&M for ContainerOS nodes .
  3. Selecione os nós com aceleração GPU que deseja gerenciar, clique em Batch Operations na parte inferior da lista de nós, selecione Execute Shell Command na caixa de diálogo Batch Operations e clique em OK.

    Importante

    Recomendamos que você primeiro reinicie o device plugin em um número reduzido de nós com aceleração GPU. Após verificar que o plugin funciona conforme o esperado, realize o reinício nos nós restantes.

  4. Você será redirecionado para o console OOS. Defina Execution Mode como Paused Upon Failure e clique em Next: Parameter Settings.

  5. Na página de configurações de parâmetros, selecione Run Shell Script e cole o script de exemplo a seguir.

    #!/bin/bash
    set -e
    
    # Check if the nvidia-device-plugin.yml file exists.
    if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then
    	# Move the file to restart the static pod.
    	cp -a /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes
    	rm -rf /etc/kubernetes/manifests/nvidia-device-plugin.yml
    	sleep 5
    	mv /etc/kubernetes/nvidia-device-plugin.yml /etc/kubernetes/manifests
    	echo "the nvidia device is restarted"
    else
    	echo "no need to restart nvidia device plugin"
    fi
  6. Clique em Next: Confirm. Após confirmar as informações, clique em Create. Você será redirecionado para a página Task Execution Management, onde poderá visualizar o status da tarefa.

  7. Execute o comando a seguir para verificar se o GPU device plugin está funcionando corretamente no nó com aceleração GPU.

    kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'

    Saída esperada:

    cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1

    Um valor diferente de zero para o recurso estendido nvidia.com/gpu em um nó com aceleração GPU indica que o Device Plugin está funcionando corretamente.

Modificar a chave de checkpoint do device plugin

Ao alocar um dispositivo para um pod, o device plugin cria um arquivo de checkpoint no nó que registra quais dispositivos estão alocados para quais pods. Por padrão, o NVIDIA Device Plugin usa o UUID da GPU como chave exclusiva de cada dispositivo GPU no arquivo de checkpoint. Altere essa chave para o índice do dispositivo a fim de resolver problemas como perda de UUID após uma migração a frio de VM.

Version 1.32 and later

  1. Execute o comando a seguir para editar o DaemonSet do NVIDIA Device Plugin.

    kubectl edit ds -n kube-system ack-nvidia-device-plugin
  2. Adicione a variável de ambiente CHECKPOINT_DEVICE_ID_STRATEGY.

        env:
          - name: CHECKPOINT_DEVICE_ID_STRATEGY
            value: index
  3. Restart the NVIDIA Device Plugin para aplicar as alterações.

Versions 1.20 to 1.31

  1. Verifique a tag de imagem no arquivo /etc/kubernetes/manifests/nvidia-device-plugin.yml no nó de destino. A tag indica a versão do Device Plugin. Se a versão for 0.9.3 ou posterior, nenhuma ação é necessária. Caso contrário, atualize a versão para v0.9.3-0dd4d5f5-aliyun.

  2. Modifique as variáveis de ambiente do static pod no arquivo /etc/kubernetes/manifests/nvidia-device-plugin.yml. Consulte o código a seguir para adicionar a variável de ambiente CHECKPOINT_DEVICE_ID_STRATEGY.

        env:
          - name: CHECKPOINT_DEVICE_ID_STRATEGY
            value: index
  3. Restart the NVIDIA Device Plugin para aplicar as alterações.

Ativar o isolamento de dispositivos GPU

Importante

O isolamento de dispositivos GPU é suportado apenas no nvidia-device-plugin v0.9.1 ou posterior. Para mais informações, consulte Check the NVIDIA Device Plugin Version.

Nos cenários de agendamento exclusivo de GPU no ACK, pode ser necessário isolar um dispositivo GPU em um nó devido a uma falha ou outros motivos. O ACK fornece um mecanismo para isolar manualmente um dispositivo e impedir que o scheduler atribua novos pods de aplicações GPU a esse dispositivo. Siga estas etapas:

No nó de destino, gerencie o arquivo unhealthyDevices.json no diretório /etc/nvidia-device-plugin/. Se este arquivo não existir, crie-o. O arquivo unhealthyDevices.json deve estar no seguinte formato JSON. O array pode conter múltiplas chaves de checkpoint de dispositivo. Adicione as chaves conforme necessário.

{
  "index": ["x", "x"],
  "uuid": ["xxx", "xxx"]
}

Insira o index ou o uuid do dispositivo de destino para isolamento no arquivo JSON. É necessário inserir apenas um dos dois para cada dispositivo. As alterações entram em vigor automaticamente após salvar o arquivo.

Após concluir a configuração, verifique o número de recursos nvidia.com/gpu reportados pelo nó Kubernetes para confirmar o efeito do isolamento.

Montar dispositivos GDR e ativar aceleração de cópia de memória GPU

Requisitos

A partir da v0.5.0, o ack-nvidia-device-plugin suporta a montagem de dispositivos GDR em contêineres GPU. Este recurso exige o seguinte:

  • A versão do cluster é 1.32 ou posterior.

  • O nó é um nó Lingjun.

  • O software GDR está instalado no nó.

    Faça login no nó e execute o comando lsmod | grep gdrdrv para verificar se o módulo de kernel GDR está carregado. O exemplo de saída é o seguinte:
    gdrdrv                196608  0
    nvidia              14680064  88 nvidia_uvm,nvidia_peermem,gdrdrv,nvidia_modeset
  • O NVIDIA Container Toolkit 1.15.0 ou posterior está instalado no nó.

    Verifique a versão fazendo login no nó e executando nvidia-container-cli --version . Veja a seguir um exemplo de saída:
    cli-version: 1.17.8
    lib-version: 1.17.8

Ativar a aceleração GDR

  1. Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons .

  3. Na página Add-ons, localize o card ack-nvidia-device-plugin e clique em Configuration.

  4. Na caixa de diálogo exibida, selecione Enable GDRCopy for GPU memory copy acceleration (takes effect on Lingjun nodes with GDR software installed and nvidia-container-toolkit version >= 1.15.0).

Verificar o resultado

  1. Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Workloads > Deployments.

  2. Na página Deployments, clique em Create from YAML. Use o código de exemplo a seguir para criar uma aplicação.

    apiVersion: v1
    kind: Pod
    metadata:
      name: tensorflow-mnist
      namespace: default
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5
        name: tensorflow-mnist
        command:
        - python
        - tensorflow-sample-code/tfjob/docker/mnist/main.py
        - --max_steps=100000
        - --data_dir=tensorflow-sample-code/data
        resources:
          limits:
            nvidia.com/gpu: 1  # Request one GPU card for this container.
        workingDir: /root
      restartPolicy: Always
  3. Execute o comando a seguir para acessar o pod:

    kubectl exec -ti tensorflow-mnist -- ls /dev/gdrdrv

    Saída esperada:

    /dev/gdrdrv

    A saída indica que o dispositivo gdrdrv foi montado com sucesso.

Perguntas frequentes

Desativar o recurso nativo de isolamento de GPU

Contexto

Quando uma GPU em um nó apresenta falha, o ACK isola automaticamente a GPU defeituosa usando o NVIDIA Device Plugin para impedir que o scheduler atribua tarefas a ela. No entanto, esse isolamento automático não realiza um reparo automático. Ainda é necessário reiniciar ou reparar o nó manualmente. Recomendamos que você configure alertas para exceções de GPU a fim de tratá-las prontamente. Para mais informações sobre o recurso nativo de isolamento de GPU do NVIDIA Device Plugin, consulte k8s-device-plugin.

  • Após o isolamento, se o nó tiver GPUs insuficientes para os requisitos de uma tarefa (por exemplo, uma tarefa precisa de oito cards, mas apenas sete estão disponíveis), o scheduler não consegue alocar a tarefa naquele nó, deixando recursos de GPU ociosos.

  • Quando o status da GPU volta ao normal, o sistema remove automaticamente o isolamento do dispositivo.

  • Caso seja necessário desativar o isolamento automático para que o nó continue reportando recursos de GPUs defeituosas, consulte a solução a seguir.

Solução

  1. Confirme se o recurso nativo de isolamento de GPU está ativado no add-on.

    Se não estiver ativado, as etapas subsequentes de desativação não são necessárias.

    Version 1.32 and later

    Acesse o ACK console e verifique a versão do ack-nvidia-device-plugin na página Add-ons do cluster de destino. Se a versão for v0.1.0, o recurso de isolamento de GPU está ativado.

    Versions 1.20 to 1.31

    1. Use kubectl to connect to the cluster in Workbench or CloudShell.

    2. Verifique se o NVIDIA Device Plugin tem o isolamento de GPU ativado.

      check_gpu_isolation_enabled() {
          echo "Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')..."
      
          # Get pod names with the expected label.
          pods=$(kubectl get pods -n kube-system -l component=nvidia-device-plugin --no-headers -o custom-columns=":metadata.name" 2>/dev/null)
      
          if [ -z "$pods" ]; then
              echo "No pods found with label 'component=nvidia-device-plugin'."
              return 0
          fi
      
          found=0
          while IFS= read -r pod; do
              [ -z "$pod" ] && continue
      
              # Check if it's a static pod: annotation kubernetes.io/config.source must be "file".
              config_source=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.metadata.annotations.kubernetes\.io/config\.source}' 2>/dev/null)
      
              if [ "$config_source" != "file" ]; then
                  # Not a static pod (e.g., managed by a DaemonSet), skip.
                  continue
              fi
      
              # Get node name.
              node=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.spec.nodeName}' 2>/dev/null)
              [ -z "$node" ] && continue
      
              # Check if DP_DISABLE_HEALTHCHECKS is set to "all".
              disabled_value=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{range .spec.containers[*]}{range .env[?(@.name=="DP_DISABLE_HEALTHCHECKS")]}{.value}{"\n"}{end}{end}' 2>/dev/null | head -n1)
      
              # If not set or not equal to "all", health checks are active, which means isolation is enabled.
              if [ -z "$disabled_value" ] || [ "$disabled_value" != "all" ]; then
                  echo "Node: $node, Static Pod: $pod"
                  found=1
              fi
          done <<< "$pods"
      
          if [ "$found" -eq 0 ]; then
              echo "No static pods found with GPU isolation enabled."
          else
              echo "Note: The above nodes will automatically isolate faulty GPUs via the NVIDIA Device Plugin."
          fi
      }
      
      check_gpu_isolation_enabled

      Saída esperada:

      Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')...
      Node: cn-beijing.192.168.XXX.XXX, Static Pod: nvidia-device-plugin-cn-beijing.192.168.XXX.XXX
      Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin.

      Se a saída contiver Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin., o recurso de isolamento de GPU está ativado.

  2. Desative o recurso de isolamento de GPU atualizando o add-on.

    O recurso nativo de isolamento de GPU é desativado por padrão na versão mais recente do add-on NVIDIA Device Plugin. Upgrade the NVIDIA Device Plugin para a versão mais recente e aplicar essa alteração.

Tópicos relacionados