Migración a controladores de GPU autogestionados NVIDIA para Kubernetes 1.36

A partir de la versión Kubernetes 1.36, IBM Cloud Kubernetes Service ya no instala automáticamente los controladores de GPU NVIDIA en los nodos trabajadores de GPU. Debe instalar y gestionar los controladores de GPU usted mismo para ejecutar cargas de trabajo de GPU.

¿Qué cambia?

Versión 1.36 y posteriores
Los controladores de GPU no están preinstalados en los nodos trabajadores de GPU nuevos o sustituidos. Debe instalar y mantener los siguientes componentes:
  • NVIDIA controlador del núcleo
  • Componentes de tiempo de ejecución de contenedores (como nvidia-container-toolkit)
  • Kubernetes complemento de dispositivo
Versiones 1.35 y anteriores
IBM instala y gestiona automáticamente los controladores de GPU en todos los nodos de trabajo de GPU.

¿Cuál es el impacto?

Los pods que solicitan recursos de GPU permanecen en el estado Pending hasta que se instalan los controladores de GPU necesarios en el nodo trabajador. Una vez instalados los controladores, los pods pendientes pasan automáticamente al estado Running.

Comprender el proceso de migración

La migración a controladores de GPU autogestionados sigue una secuencia específica para garantizar que las cargas de trabajo de la GPU sigan funcionando durante la actualización:

  1. Fase de preinstalación: Instale NVIDIA GPU Operator en su clúster cuando aún ejecute la versión 1.35 o anterior. Durante la instalación, se etiquetan los nodos de GPU existentes para evitar que el operador despliegue recursos de controladores, que entrarían en conflicto con los controladores preinstalados.

  2. Actualización del plano de control: Actualizará el plano de control del clúster a la versión 1.36.

  3. Actualización del nodo de trabajo: Reemplazar cada nodo trabajador para actualizarlos versión 1.36. Al hacerlo, se eliminan automáticamente las etiquetas que impedían el despliegue del controlador. Esto permite al operador de GPU de NVIDIA desplegar su pila de controladores en los nuevos nodos.

  4. Recuperación automática de cargas de trabajo: Una vez que el operador instala los controladores en un nodo sustituido, cualquier carga de trabajo de GPU pendiente pasa automáticamente al estado Running.

Preparar la migración antes de que esté disponible la versión 1.36

Puede completar los pasos de preinstalación antes de que se publique la versión 1.36 para preparar su clúster para una migración más sencilla:

  1. Etiquete sus nodos de trabajo GPU existentes para evitar que el operador despliegue recursos que entrarían en conflicto con los controladores preinstalados.

    kubectl label node/<node_name> nvidia.com/gpu.deploy.operands=false
    kubectl label node/<node_name> nvidia.com/gpu.deploy.driver=false
    
  2. Instale el GPU Operator NVIDIA siguiendo la guía de instalación del GPU Operator NVIDIA.

  3. Verifique que el operador está instalado pero no desplegando recursos de controlador en sus nodos etiquetados.

    kubectl get pods -n gpu-operator -o wide
    

Si completa estos pasos de preparación con antelación, reducirá el trabajo necesario durante la actualización real a la versión 1.36. Cuando esté disponible la versión 1.36, sólo tendrá que actualizar el plano de control y sustituir los nodos trabajadores.

Antes de empezar

  • Consulte la documentación NVIDIA GPU Operator.
  • Asegúrese de que dispone de acceso de administrador de clúster.
  • Planifique su estrategia de actualización en función de la configuración de su clúster (un único nodo de GPU frente a varios nodos de GPU).

Ejemplos de migración

Los siguientes ejemplos muestran cómo migrar el clúster en función del número de nodos GPU.

Ejemplo 1: Un único nodo GPU en el clúster

Este ejemplo muestra la migración de un clúster con un único nodo GPU. Dado que el único nodo GPU no estará disponible durante la actualización, se añade un segundo trabajador GPU temporal para mantener la capacidad.

Paso 1: Obtener el estado inicial del cluster

  1. Compruebe la versión del plano de control del clúster.

    ibmcloud ks cluster get -c CLUSTER_NAME
    

    Ejemplo de salida que muestra la versión 1.35:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.35.4_1528
    
  2. Comprueba la versión del nodo trabajador.

    ibmcloud ks worker ls -c <cluster_name>
    

    Ejemplo de salida que muestra un único nodo GPU:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-000001e4   10.240.0.64   gx3.16x80.l4   normal   Ready    us-south-1   1.35.4_1528   UBUNTU_24_64
    

Paso 2: Instalar el Operador GPU NVIDIA

Si ha seguido los pasos indicados en Preparación para la migración antes de que esté disponible la versión 1.36, es posible que ya haya realizado este paso.

  1. Etiquete el nodo trabajador GPU existente para evitar que el operador despliegue recursos que entrarían en conflicto con los controladores preinstalados.

    kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.operands=false
    kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.driver=false
    
  2. Añada el repositorio NVIDIA Helm e instale el operador GPU.

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
    helm repo update
    helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator
    
  3. Comprueba que los pods del operador de la GPU estén en ejecución. Tenga en cuenta que el instalador del controlador, el plugin del dispositivo, el kit de herramientas del contenedor y el exportador DCGM NO deben estar ejecutándose en el nodo etiquetado.

    kubectl get pods -n gpu-operator -o wide
    

    Salida de ejemplo:

    NAME                                                              READY   STATUS    RESTARTS   AGE     IP              NODE          NOMINATED NODE   READINESS GATES
    gpu-operator-1778819096-node-feature-discovery-gc-84d98bd6nqw2z   1/1     Running   0          2m21s   172.17.64.94    10.240.0.64   <none>           <none>
    gpu-operator-1778819096-node-feature-discovery-master-6b6cpnm9w   1/1     Running   0          2m21s   172.17.64.93    10.240.0.64   <none>           <none>
    gpu-operator-1778819096-node-feature-discovery-worker-hm7ft       1/1     Running   0          2m21s   172.17.64.91    10.240.0.64   <none>           <none>
    gpu-operator-76c686b9df-kn4dw                                     1/1     Running   0          2m21s   172.17.64.92    10.240.0.64   <none>           <none>
    

Paso 3: Actualizar el plano de control del clúster

  1. Actualice el plano de control del clúster a la versión 1.36.

    ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0
    
  2. Verifique la actualización del plano de control.

    ibmcloud ks cluster get -c <cluster_name>
    

    Salida de ejemplo:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.36.0_1506
    

Paso 4: Añadir un nodo trabajador GPU temporal

  1. Añade un segundo trabajador GPU temporal al cluster con Kubernetes versión 1.36.

    ibmcloud ks worker-pool create vpc-gen2 --name temp-gpu-pool --cluster <cluster_name> --flavor gx3.16x80.l4 --size-per-zone 1 --zone us-south-1
    
  2. Comprueba que el nodo temporal está listo.

    ibmcloud ks worker ls -c <cluster_name>
    

    Ejemplo de salida que muestra los nodos originales y temporales:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-000001e4   10.240.0.64   gx3.16x80.l4   normal   Ready    us-south-1   1.35.4_1528   UBUNTU_24_64
    test-d8397vk20kb65iocenn0-tempgpupool-default-00000371   10.240.0.72   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    
  3. Compruebe que los pods de operador de GPU se ejecutan en el nuevo nodo temporal.

    kubectl get pods -n gpu-operator -o wide
    

    Ejemplo de salida que muestra el controlador y el plugin de dispositivo ejecutándose en el nodo temporal:

    NAME                                                              READY   STATUS      RESTARTS   AGE     IP               NODE          NOMINATED NODE   READINESS GATES
    gpu-feature-discovery-mw5km                                       1/1     Running     0          4m36s   172.17.116.201   10.240.0.72   <none>           <none>
    nvidia-container-toolkit-daemonset-ns6p8                          1/1     Running     0          4m36s   172.17.116.199   10.240.0.72   <none>           <none>
    nvidia-cuda-validator-vgj45                                       0/1     Completed   0          96s     172.17.116.203   10.240.0.72   <none>           <none>
    nvidia-dcgm-exporter-52cwh                                        1/1     Running     0          4m36s   172.17.116.204   10.240.0.72   <none>           <none>
    nvidia-device-plugin-daemonset-2ql7x                              1/1     Running     0          4m36s   172.17.116.202   10.240.0.72   <none>           <none>
    nvidia-driver-daemonset-zql6m                                     1/1     Running     0          5m29s   172.17.116.197   10.240.0.72   <none>           <none>
    nvidia-operator-validator-44xtz                                   1/1     Running     0          4m36s   172.17.116.200   10.240.0.72   <none>           <none>
    
  4. Verifica la disponibilidad de la GPU en el nodo temporal.

    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, allocatable: .status.allocatable}'
    

Paso 5: Migrar las cargas de trabajo y actualizar el nodo original

  1. Migre sus cargas de trabajo de GPU al nodo trabajador temporal 1.36. Puede utilizar selectores de nodos, taints o la eliminación manual de pods para mover las cargas de trabajo.

  2. Sustituye el nodo GPU original.

    ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update
    
  3. Verifique la actualización del nodo.

    ibmcloud ks worker ls -c <cluster_name>
    

    Ejemplo de salida que muestra ambos nodos ahora en la versión 1.36:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-00000485   10.240.0.68   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    test-d8397vk20kb65iocenn0-tempgpupool-default-00000371   10.240.0.72   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    
  4. Compruebe que los pods de operador de GPU se ejecutan en el nodo original actualizado.

    kubectl get pods -n gpu-operator -o wide
    
  5. Comprueba que todas las cargas de trabajo de la GPU se están ejecutando.

    kubectl get pods -o wide
    

    Salida de ejemplo:

    NAME             READY   STATUS    RESTARTS   AGE    IP               NODE          NOMINATED NODE   READINESS GATES
    gpu-burn-46pml   1/1     Running   0          6m8s   172.17.116.205   10.240.0.72   <none>           <none>
    gpu-burn-z6xnh   1/1     Running   0          44m    172.17.121.28    10.240.0.68   <none>           <none>
    

Paso 6: Eliminar el nodo temporal (opcional)

Una vez que el nodo original esté en buen estado y las cargas de trabajo sean estables, puede eliminar opcionalmente el nodo GPU temporal.

  1. Elimina el pool de trabajadores temporal.

    ibmcloud ks worker-pool rm --cluster <cluster_name> --worker-pool temp-gpu-pool
    
  2. Comprueba que sólo queda el nodo original.

    ibmcloud ks worker ls -c <cluster_name>
    

Ejemplo 2: Varios nodos GPU en el clúster

Este ejemplo demuestra la migración de un clúster con dos nodos GPU de Kubernetes versión 1.35 a 1.36. Con múltiples nodos, puede actualizar los nodos de uno en uno manteniendo la capacidad de la GPU.

Paso 1: Obtener el estado inicial del cluster

  1. Compruebe la versión del plano de control del clúster.

    ibmcloud ks cluster get -c <cluster_name>
    

    Ejemplo de salida que muestra la versión 1.35:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.35.4_1528
    
  2. Comprueba las versiones de los nodos trabajadores.

    ibmcloud ks worker ls -c <cluster_name>
    

    Ejemplo de salida mostrando dos nodos GPU:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-000001e4   10.240.0.64   gx3.16x80.l4   normal   Ready    us-south-1   1.35.4_1528   UBUNTU_24_64
    test-d8397vk20kb65iocenn0-btspstggput-default-0000024b   10.240.0.66   gx3.16x80.l4   normal   Ready    us-south-1   1.35.4_1528   UBUNTU_24_64
    

Paso 2: Instalar el Operador GPU NVIDIA

Si ha seguido los pasos indicados en Preparación para la migración antes de que esté disponible la versión 1.36, es posible que ya haya realizado este paso.

  1. Etiquetar los nodos de trabajo GPU existentes para evitar que el operador despliegue recursos que entrarían en conflicto con los controladores preinstalados.

    kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.operands=false
    kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.driver=false
    kubectl label node/10.240.0.66 nvidia.com/gpu.deploy.operands=false
    kubectl label node/10.240.0.66 nvidia.com/gpu.deploy.driver=false
    
  2. Añada el repositorio NVIDIA Helm e instale el operador GPU.

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
    helm repo update
    helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator
    
  3. Comprueba que los pods del operador de la GPU estén en ejecución. Tenga en cuenta que el instalador de controladores, el plugin de dispositivos, el kit de herramientas de contenedores y el exportador DCGM NO deben estar ejecutándose en los nodos etiquetados.

    kubectl get pods -n gpu-operator -o wide
    

    Salida de ejemplo:

    NAME                                                              READY   STATUS    RESTARTS   AGE     IP              NODE          NOMINATED NODE   READINESS GATES
    gpu-operator-1778819096-node-feature-discovery-gc-84d98bd6nqw2z   1/1     Running   0          2m21s   172.17.64.94    10.240.0.64   <none>           <none>
    gpu-operator-1778819096-node-feature-discovery-master-6b6cpnm9w   1/1     Running   0          2m21s   172.17.64.93    10.240.0.64   <none>           <none>
    gpu-operator-1778819096-node-feature-discovery-worker-hm7ft       1/1     Running   0          2m21s   172.17.64.91    10.240.0.64   <none>           <none>
    gpu-operator-1778819096-node-feature-discovery-worker-xh4qz       1/1     Running   0          2m21s   172.17.121.29   10.240.0.66   <none>           <none>
    gpu-operator-76c686b9df-kn4dw                                     1/1     Running   0          2m21s   172.17.64.92    10.240.0.64   <none>           <none>
    

Paso 3: Actualizar el plano de control del clúster

  1. Actualice el plano de control del clúster a la versión 1.36.

    ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0
    
  2. Verifique la actualización del plano de control.

    ibmcloud ks cluster get -c <cluster_name>
    

    Salida de ejemplo:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.36.0_1506
    

Paso 4: Actualizar el primer nodo trabajador

  1. Sustituye el primer nodo de trabajo.

    ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update
    
  2. Verifique la actualización del nodo.

    ibmcloud ks worker ls -c <cluster_name>
    

    Salida de ejemplo:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-0000024b   10.240.0.66   gx3.16x80.l4   normal   Ready    us-south-1   1.35.4_1528   UBUNTU_24_64
    test-d8397vk20kb65iocenn0-btspstggput-default-00000371   10.240.0.72   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    
  3. Comprueba el estado de la carga de trabajo de la GPU. La carga de trabajo de la GPU programada en el nuevo nodo estará en estado Pending hasta que se instale el controlador.

    kubectl get pods -o wide
    

    Salida de ejemplo:

    NAME             READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
    gpu-burn-46pml   0/1     Pending   0          18s   <none>          <none>        <none>           <none>
    gpu-burn-z6xnh   1/1     Running   0          38m   172.17.121.28   10.240.0.66   <none>           <none>
    
  4. Compruebe que los pods de operador de GPU se ejecutan en el nuevo nodo.

    kubectl get pods -n gpu-operator -o wide
    

    Ejemplo de salida que muestra el controlador y el plugin de dispositivo ejecutándose en el nuevo nodo:

    NAME                                                              READY   STATUS      RESTARTS   AGE     IP               NODE          NOMINATED NODE   READINESS GATES
    gpu-feature-discovery-mw5km                                       1/1     Running     0          4m36s   172.17.116.201   10.240.0.72   <none>           <none>
    nvidia-container-toolkit-daemonset-ns6p8                          1/1     Running     0          4m36s   172.17.116.199   10.240.0.72   <none>           <none>
    nvidia-cuda-validator-vgj45                                       0/1     Completed   0          96s     172.17.116.203   10.240.0.72   <none>           <none>
    nvidia-dcgm-exporter-52cwh                                        1/1     Running     0          4m36s   172.17.116.204   10.240.0.72   <none>           <none>
    nvidia-device-plugin-daemonset-2ql7x                              1/1     Running     0          4m36s   172.17.116.202   10.240.0.72   <none>           <none>
    nvidia-driver-daemonset-zql6m                                     1/1     Running     0          5m29s   172.17.116.197   10.240.0.72   <none>           <none>
    nvidia-operator-validator-44xtz                                   1/1     Running     0          4m36s   172.17.116.200   10.240.0.72   <none>           <none>
    
  5. Verifique la carga de trabajo de la GPU programada en el nuevo nodo.

    kubectl get pods -o wide
    

    Salida de ejemplo:

    NAME             READY   STATUS    RESTARTS   AGE    IP               NODE          NOMINATED NODE   READINESS GATES
    gpu-burn-46pml   1/1     Running   0          6m8s   172.17.116.205   10.240.0.72   <none>           <none>
    gpu-burn-z6xnh   1/1     Running   0          44m    172.17.121.28    10.240.0.66   <none>           <none>
    

Paso 5: Actualizar los nodos restantes

  1. Repita el paso 4 para cada nodo GPU restante, actualizando un nodo cada vez.

  2. Una vez actualizados todos los nodos, compruebe que todos los nodos trabajadores ejecutan la versión 1.36.

    ibmcloud ks worker ls -c <cluster_name>
    

    Salida de ejemplo:

    ID                                                       Primary IP    Flavor         State    Status   Zone         Version       Operating System
    test-d8397vk20kb65iocenn0-btspstggput-default-00000371   10.240.0.72   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    test-d8397vk20kb65iocenn0-btspstggput-default-0000048c   10.240.0.73   gx3.16x80.l4   normal   Ready    us-south-1   1.36.0_1507   UBUNTU_24_64
    
  3. Compruebe que todos los pods de operador de GPU se están ejecutando.

    kubectl get pods -n gpu-operator -o wide
    
  4. Comprueba que todas las cargas de trabajo de la GPU se están ejecutando.

    kubectl get pods -o wide
    

    Salida de ejemplo:

    NAME             READY   STATUS    RESTARTS   AGE     IP               NODE          NOMINATED NODE   READINESS GATES
    gpu-burn-46pml   1/1     Running   0          18m     172.17.116.205   10.240.0.72   <none>           <none>
    gpu-burn-ttcbt   1/1     Running   0          6m46s   172.17.75.77     10.240.0.73   <none>           <none>
    

Próximos pasos

  • Supervisa las cargas de trabajo de tu GPU para asegurarte de que funcionan correctamente.
  • Consulte la documentación NVIDIA GPU Operator para conocer las opciones de configuración avanzadas.
  • Configure la supervisión de las métricas de la GPU utilizando el exportador DCGM de NVIDIA.