Despliegue de apps nativas de Kubernetes en clústeres

Despliegue de aplicaciones en contenedores en IBM Cloud® Kubernetes Service utilizando técnicas de Kubernetes. Realice actualizaciones progresivas y reversiones sin tiempo de inactividad para sus usuarios.

Obtenga más información sobre la creación de archivos de configuración en la guía Prácticas recomendadas de configuración.

Inicio del panel de control de Kubernetes

Acceda al panel de Kubernetes para ver la información del clúster y de los nodos trabajadores a través de la consola IBM Cloud o de la CLI.

Antes de empezar, compruebe que dispone de la función de acceso adecuada. Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

Inicio del panel de control de Kubernetes desde la consola de IBM Cloud

  1. Inicie una sesión en la consola de IBM Cloud.
  2. En la barra de menús, seleccione la cuenta que desea utilizar.
  3. En el menú Icono de menú, haga clic en Contenedores > Clusters.
  4. En la página Clústeres, pulse el clúster al que desea acceder.
  5. En la página de detalles del clúster, pulse el botón Panel de control de Kubernetes.

Inicio del panel de control de Kubernetes desde la CLI

El método CLI permite la automatización y la integración CI/CD. Instale la CLI antes de empezar.

  1. Consigue tus credenciales de Kubernetes.

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. Copia el valor id-token de la salida.

  3. Inicie el proxy.

    kubectl proxy
    

    Salida de ejemplo

    Starting to serve on 127.0.0.1:8001
    
  4. Inicie sesión en el panel de control.

    1. Accede a la siguiente dirección URL en tu navegador:
        http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
        ```
    2. Seleccione el método de autenticación **Token** en la página de inicio de sesión.
    
    3. Pega el valor **del id-token** en el campo **Token** y haz clic en **INICIAR SESIÓN**.
    
    

Utilice CTRL+C para salir del comando proxy. Vuelva a ejecutar kubectl proxy para reiniciar el cuadro de mandos.

Despliegue de apps con el panel de control de Kubernetes

Despliegue aplicaciones a través del panel de control introduciendo detalles de configuración o cargando un archivo YAML.

Antes de empezar, abra el panel de control y compruebe que dispone de una función de acceso al servicio. Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

Para desplegar su aplicación

  1. Pulse + Crear.

  2. Elija un método de despliegue:

    • Selecciona Especificar detalles de la aplicación e introduce los datos.
    • Selecciona Subir un archivo YAML o JSON para subir el archivo de configuración de tu aplicación.
  3. Haga clic en Despliegues para comprobar que su aplicación se ha desplegado correctamente.

Despliegue de apps con la CLI

El método CLI proporciona un control preciso y permite la automatización. Crearás archivos de configuración que definan los recursos de tu aplicación y que puedan ser controlados por versiones.

Antes de empezar, instale la CLI y compruebe que dispone de una función de acceso al servicio. Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.

Para desplegar su aplicación

  1. Cree un archivo de configuración que incluya los recursos de despliegue, servicio y entrada necesarios. Obtenga más información sobre cómo proteger su información personal cuando se trabaja recursos de Kubernetes.

  2. Aplique el archivo de configuración.

    kubectl apply -f config.yaml
    
  3. Comprueba que puedes acceder a tu aplicación.

Despliegue de apps en nodos trabajadores específicos mediante la utilización de etiquetas

Cuando despliega una app, los pods de la app se despliegan de forma indiscriminada en varios nodos trabajadores del clúster. A veces, es posible que desee restringir los nodos de trabajador en los que desplegar los pods de la aplicación. Por ejemplo, es posible que desee que los pods de la app solo se desplieguen en nodos trabajadores de una determinada agrupación de nodos trabajadores porque dichos nodos trabajadores están en máquinas vacías. Para designar los nodos trabajadores en los que deben desplegarse los pods de la app, añada una regla de afinidad al despliegue de la app.

Antes de empezar

Para desplegar aplicaciones en nodos de trabajador específicos,

  1. Obtenga el ID de la agrupación de nodos trabajadores en la que desea desplegar los pods de la app.

    ibmcloud ks worker-pool ls --cluster CLUSTER_NAME_OR_ID
    
  2. Obtenga una lista de los nodos trabajadores que están en la agrupación de nodos trabajadores y anote una de las direcciones IP privadas.

    ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
    
  3. Describa el nodo trabajador. En la salida de Labels, anote la etiqueta del ID de agrupación de nodos trabajadores, ibm-cloud.kubernetes.io/worker-pool-id.

    En los pasos de este tema se utiliza un ID de agrupación de nodos trabajadores para desplegar pods de apps solo en nodos trabajadores dentro de dicha agrupación de nodos trabajadores. Para desplegar los pods de app en nodos trabajadores específicos utilizando otra etiqueta, anote esta etiqueta en su lugar. Por ejemplo, para desplegar pods de app solo en nodos trabajadores en una VLAN privada específica, utilice la etiqueta privateVLAN=.

    kubectl describe node <worker_node_private_IP>
    

    Salida de ejemplo

    NAME:               10.xxx.xx.xxx
    Roles:              <none>
    Labels:             arch=amd64
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=b3c.4x16.encrypted
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-south
                        failure-domain.beta.kubernetes.io/zone=dal10
                        ibm-cloud.kubernetes.io/encrypted-docker-data=true
                        ibm-cloud.kubernetes.io/ha-worker=true
                        ibm-cloud.kubernetes.io/iaas-provider=softlayer
                        ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted
                        ibm-cloud.kubernetes.io/sgx-enabled=false
                        ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a
                        ibm-cloud.kubernetes.io/worker-version=1.36_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. Añade una regla de afinidad para la etiqueta de ID del grupo de trabajadores a la implementación de la aplicación.

    Ejemplo de YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/worker-pool-id
                    operator: In
                    values:
                    - <worker_pool_ID>
    ...
    

    En la sección affinity del YAML de ejemplo, ibm-cloud.kubernetes.io/worker-pool-id es el valor de key y <worker_pool_ID> es el valor de value.

  5. Aplique el archivo de configuración de despliegue actualizado.

    kubectl apply -f with-node-affinity.yaml
    
  6. Verifique que los pods de la app se han desplegado en los nodos trabajadores correctos.

    1. Obtenga una lista de pods en el clúster.
        kubectl get pods -o wide
        ```
        Salida de ejemplo
        ```sh {: screen}
        NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
        cf-py-d7b7d94db-vp8pq  1/1       Running             0          15d       172.30.xxx.xxx   10.176.48.78
        ```
    2. En la salida, identifique un pod para su app. Anote la dirección IP privada de **NODE** del nodo trabajador en el que está el pod.
    
        En la salida de ejemplo anterior, el pod de app `cf-py-d7b7d94db-vp8pq` está en un nodo trabajador con la dirección IP `10.xxx.xx.xxx`.
    
    3. Obtenga una lista de los nodos trabajadores de la agrupación de nodos trabajadores que ha designado en el despliegue de la app.
    
    ```sh {: pre}
        ibmcloud ks worker ls --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID
        ```
        Salida de ejemplo
    
        ```sh {: screen}
        ID                                                 Public IP       Private IP     Machine Type      State    Status  Zone    Version
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7   169.xx.xxx.xxx  10.176.48.78   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8   169.xx.xxx.xxx  10.176.48.83   b3c.4x16          normal   Ready   dal10   1.8.6_1504
        kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9   169.xx.xxx.xxx  10.176.48.69   b3c.4x16          normal   Ready   dal12   1.8.6_1504
        ```
        Si ha creado una regla de afinidad de app basada en otro factor, obtenga ese valor en su lugar. Por ejemplo, para verificar que el pod de aplicación se ha desplegado en un nodo de trabajador en una VLAN específica, compruebe si la VLAN en la que está el nodo de trabajador está activa ejecutando `ibmcloud ks worker get --cluster CLUSTER_NAME_OR_ID --worker WORKER_ID`.
        {: tip}
    
    4. En la salida, verifique que el nodo trabajadores con la dirección IP privada que ha identificado en el paso anterior se ha desplegado en esta agrupación de nodos trabajadores.
    
    

Implementación de una aplicación en una máquina con GPU de NVIDIA

Si tiene un tipo de máquina GPU, puede acelerar el tiempo de proceso necesario para cargas de trabajo de gran intensidad de cálculo como, por ejemplo, IA, aprendizaje automático, inferencia, etc.

Cambios importantes en los controladores a partir de la versión Kubernetes 1.36: IBM Cloud Kubernetes Service ya no instala los controladores de GPU de NVIDIA en los nodos trabajadores con GPU a partir de la versión Kubernetes 1.36. Si tiene previsto ejecutar cargas de trabajo de GPU en clústeres de la versión 1.36 o posteriores, deberá gestionar la instalación y el ciclo de vida del controlador de GPU en sus propios nodos trabajadores. Para los clusters que ejecutan la versión 1.35 o anteriores, siguen estando disponibles los controladores de GPU proporcionados por IBM. Para obtener orientación sobre la migración, consulte Migración a controladores GPU autogestionados NVIDIA.

En los pasos siguientes, aprenderá a desplegar cargas de trabajo que requieren la GPU. No obstante, también puedes implementar aplicaciones que no necesiten procesar sus cargas de trabajo tanto en la GPU como en la CPU.

También puede probar cargas de trabajo matemáticamente intensivas, como el marco de aprendizaje TensorFlow automático con esta Kubernetes demostración.

Requisitos previos

Antes de empezar

  • Cree un clúster o una agrupación de nodos trabajadores que utilice un tipo de GPU. Tenga en cuenta que la configuración de una máquina nativa puede tardar más de un día laborable en completarse. Para obtener una lista de los tipos disponibles, consulte los enlaces siguientes.

  • Asegúrese de que tiene asignado un rol de acceso al servicio que otorgue el rol de RBAC de Kubernetes adecuado para que pueda trabajar con los recursos de Kubernetes en el clúster.

Para Kubernetes versión 1.36 y posteriores: Debe instalar y gestionar la pila de controladores de GPU NVIDIA por su cuenta. IBM Cloud Kubernetes Service ya no proporciona controladores de GPU preinstalados en los nodos trabajadores. Siga la guía de instalación de NVIDIA GPU Operator para instalar los componentes necesarios:

  • NVIDIA controlador del núcleo
  • Componentes de ejecución de contenedores (por ejemplo, nvidia-container-toolkit)
  • Kubernetes complemento de dispositivo

Hasta que se instale el controlador, los pods que soliciten GPU permanecerán en el estado Pending. Pasarán a Running automáticamente una vez que esté disponible un controlador compatible en el nodo.

Para Kubernetes versión 1.35 y anteriores: IBM-siempre que los controladores de GPU se instalen automáticamente en los nodos trabajadores de GPU. No es necesario instalar ningún controlador adicional.

Despliegue de una carga de trabajo

  1. Cree un archivo YAML. En este ejemplo, un YAML Job gestiona cargas de trabajo de tipo por lotes creando un pod de corta duración que se ejecuta hasta que el comando se completa y finaliza correctamente.

    Para las cargas de trabajo de GPU, debe especificar el campo resources: limits: nvidia.com/gpu en el archivo YAML del trabajo.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-devicequery
      labels:
        name: nvidia-devicequery
    spec:
      template:
        metadata:
          labels:
            name: nvidia-devicequery
        spec:
          containers:
          - name: nvidia-devicequery
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                nvidia.com/gpu: 2
          restartPolicy: Never
    
    Comprender sus componentes YAML
    Componente Descripción
    Metadatos y nombres de etiqueta Especifique un nombre y una etiqueta para el trabajo y use el mismo nombre en los metadatos del archivo y en los metadatos de la spec template. Por ejemplo, nvidia-devicequery.
    containers.image Proporcione la imagen de la que el contenedor es su instancia en ejecución. En este ejemplo, el valor se establece para utilizar la imagen de consulta de dispositivo DockerHub CUDA:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Para obtener mediante pull una nueva imagen solo si actualmente dicha imagen no está en el nodo trabajador, especifique IfNotPresent.
    resources.limits

    Para máquinas con GPU, debe especificar el límite del recurso. El complemento de dispositivoKubernetes configura la solicitud de recursos predeterminada para que coincida con el límite.

    • Debes especificar la clave como nvidia.com/gpu.
    • Introduce el número entero de GPU que solicitas, por ejemplo, 2. Tenga en cuenta que los pods de contenedor no comparten GPU, y que las GPU no se pueden sobreutilizar. Por ejemplo, si solo tiene una máquina mg1c.16x128, solo tiene 2 GPU en dicha máquina y puede especificar un máximo de 2.
  2. Aplique el archivo YAML. Por ejemplo:

    kubectl apply -f nvidia-devicequery.yaml
    
  3. Comprueba el pod de trabajo filtrando tus pods por la etiqueta nvidia-devicequery. Verifique que STATUS es Completed.

    kubectl get pod -A -l 'name in (nvidia-devicequery)'
    

    Salida de ejemplo

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Describa el pod para ver cómo el plugin de dispositivo de GPU planificó el pod.

    • En los campos Limits y Requests podrá ver el límite de recurso que especificó coincide con la solicitud que el plugin de dispositivo estableció de forma automática.
    • En los sucesos, verifique que el pod está asignado a su nodo trabajador con GPU.
        kubectl describe pod nvidia-devicequery-ppkd4
        ```
        Salida de ejemplo
        ```sh {: screen}
        NAME:           nvidia-devicequery-ppkd4
        Namespace:      default
        ...
        Limits:
            nvidia.com/gpu:  1
        Requests:
            nvidia.com/gpu:  1
        ...
        Events:
        Type    Reason                 Age   From                     Message
        ----    ------                 ----  ----                     -------
        Normal  Scheduled              1m    default-scheduler        Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx
        ...
        ```
    
  5. Para verificar que el trabajo utilizó la GPU para los cálculos de su carga de trabajo, compruebe los registros.

    kubectl logs nvidia-devicequery-ppkd4
    

    Salida de ejemplo

    /cuda-samples/sample Starting...
    CUDA Device Query (Runtime API) version (CUDART static linking)
    Detected 1 CUDA Capable device(s)
    Device 0: "Tesla P100-PCIE-16GB"
    CUDA Driver Version / Runtime Version          11.4 / 11.7
    CUDA Capability Major/Minor version number:    6.0
    Total amount of global memory:                 16281 MBytes (17071734784 bytes)
    (056) Multiprocessors, (064) CUDA Cores/MP:    3584 CUDA Cores
    GPU Max Clock rate:                            1329 MHz (1.33 GHz)
    Memory Clock rate:                             715 Mhz
    Memory Bus Width:                              4096-bit
    L2 Cache Size:                                 4194304 bytes
    Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
    Total amount of constant memory:               65536 bytes
    Total amount of shared memory per block:       49152 bytes
    Total shared memory per multiprocessor:        65536 bytes
    Total number of registers available per block: 65536
    Warp size:                                     32
    Maximum number of threads per multiprocessor:  2048
    Maximum number of threads per block:           1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch:                          2147483647 bytes
    Texture alignment:                             512 bytes
    Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
    Run time limit on kernels:                     No
    Integrated GPU sharing Host Memory:            No
    Support host page-locked memory mapping:       Yes
    Alignment requirement for Surfaces:            Yes
    Device has ECC support:                        Enabled
    Device supports Unified Addressing (UVA):      Yes
    Device supports Managed Memory:                Yes
    Device supports Compute Preemption:            Yes
    Supports Cooperative Kernel Launch:            Yes
    Supports MultiDevice Co-op Kernel Launch:      Yes
    Device PCI Domain ID / Bus ID / location ID:   0 / 175 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1
    Result = PASS
    

    En este ejemplo, verá que se ha utilizado una GPU para ejecutar el trabajo porque la GPU se ha planificado en el nodo trabajador. Si el límite se establece en 2, sólo se muestran 2 GPU.

Ahora que ha implementado una carga de trabajo de prueba con GPU, quizá le interese configurar su clúster para ejecutar una herramienta que utilice el procesamiento por GPU, como IBM Maximo Visual Inspection.

Migración a controladores de GPU autogestionados NVIDIA

Para obtener información detallada sobre la migración de controladores de GPU proporcionados por IBM a controladores autogestionados al actualizar a la versión Kubernetes 1.36, consulte Migración a controladores de GPU autogestionados NVIDIA para Kubernetes 1.36.