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
- Inicie una sesión en la consola de IBM Cloud.
- En la barra de menús, seleccione la cuenta que desea utilizar.
- En el menú
, haga clic en Contenedores > Clusters.
- En la página Clústeres, pulse el clúster al que desea acceder.
- 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.
-
Consigue tus credenciales de Kubernetes.
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}' -
Copia el valor id-token de la salida.
-
Inicie el proxy.
kubectl proxySalida de ejemplo
Starting to serve on 127.0.0.1:8001 -
Inicie sesión en el panel de control.
- 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
-
Pulse + Crear.
-
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.
-
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
-
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.
-
Aplique el archivo de configuración.
kubectl apply -f config.yaml -
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
- Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
- Opcional: establezca una etiqueta para la agrupación de nodos trabajadores en el que desea ejecutar la app.
Para desplegar aplicaciones en nodos de trabajador específicos,
-
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 -
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 -
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 ... -
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-ides el valor dekeyy<worker_pool_ID>es el valor devalue. -
Aplique el archivo de configuración de despliegue actualizado.
kubectl apply -f with-node-affinity.yaml -
Verifique que los pods de la app se han desplegado en los nodos trabajadores correctos.
- 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
-
Cree un archivo YAML. En este ejemplo, un YAML
Jobgestiona 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/gpuen 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: NeverComprender 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.imageProporcione 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.imagePullPolicyPara obtener mediante pull una nueva imagen solo si actualmente dicha imagen no está en el nodo trabajador, especifique IfNotPresent.resources.limitsPara 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áquinamg1c.16x128, solo tiene 2 GPU en dicha máquina y puede especificar un máximo de2.
- Debes especificar la clave como
-
Aplique el archivo YAML. Por ejemplo:
kubectl apply -f nvidia-devicequery.yaml -
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 -
Describa el pod para ver cómo el plugin de dispositivo de GPU planificó el pod.
- En los campos
LimitsyRequestspodrá 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 ... ``` - En los campos
-
Para verificar que el trabajo utilizó la GPU para los cálculos de su carga de trabajo, compruebe los registros.
kubectl logs nvidia-devicequery-ppkd4Salida 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 = PASSEn 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.