Skip to content

Rancher and RKE

Herramientas en Línea de Comandos para RKE2 (CLI Tools | RKE2)


Introducción

El uso de herramientas en línea de comandos (CLI) es fundamental para la gestión y operación eficiente de clústeres de Kubernetes en entornos empresariales. RKE2 (Rancher Kubernetes Engine v2), como una solución avanzada de orquestación de contenedores, se apoya en varias herramientas de CLI que permiten a los administradores y operadores interactuar de forma directa y eficaz con los clústeres. Estas herramientas, como kubectl, crictl, y ctr, ofrecen capacidades de administración, depuración, monitoreo y manejo de contenedores que son esenciales para mantener la infraestructura y las aplicaciones funcionando sin problemas. Comprender el uso de estas herramientas es clave para optimizar la gestión de RKE2 y garantizar operaciones seguras y escalables.


Objetivo

Objetivo General:

  • Capacitar a los administradores de sistemas y profesionales de TI en el uso de las herramientas de línea de comandos esenciales para RKE2, facilitando una administración eficiente y segura de los clústeres de Kubernetes. El objetivo es que los participantes comprendan las funcionalidades de estas herramientas y adquieran las habilidades prácticas necesarias para realizar tareas de gestión, monitoreo y depuración, contribuyendo así a la operación y mantenimiento óptimos de su infraestructura de RKE2.

Ubicación

RKE2 incluye varias herramientas CLI para facilitar el acceso y la depuración del clúster, las cuales podemos encontrarlas en la siguiente ubicación: /var/lib/rancher/rke2/bin.

Al iniciar el cluster, se genera un kubeconfig de administrador en /etc/rancher/rke2/rke2.yaml.

Kubectl

Es la herramienta de línea de comandos de Kubernetes, la cual puede ser utilizada para desplegar y gestionar aplicaciones en Kubernetes. Usando kubectl, puedes inspeccionar recursos del clúster; crear, eliminar, y actualizar componentes; explorar tu nuevo clúster y arrancar aplicaciones. Ejemplo de utilización:

export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
export PATH=$PATH:/var/lib/rancher/rke2/bin
kubectl get nodes

Ctr y Crictl

Tanto ctr como crictl son herramientas de línea de comandos utilizadas para interactuar con runtimes de contenedores, pero tienen diferentes propósitos y funcionalidades, ninguna de estas herramientas reemplaza a kubectl. A continuación una comparación de ambas:

ctr (Containerd CLI)

  • Propósito: Es la herramienta de línea de comandos nativa para interactuar directamente con containerd, el runtime de contenedores.
  • Nivel de acceso: Ofrece un control completo y de bajo nivel sobre containerd, lo que la hace ideal para tareas administrativas y depuración.
  • En el caso de RKE2 (y en general, cualquier implementación de Kubernetes que use containerd), Kubernetes utiliza el namespace k8s.io para gestionar todos los recursos relacionados con el clúster. Por lo tanto, al ejecutar comandos de ctr (la CLI de containerd) dentro de un clúster de RKE2, necesitas especificar explícitamente el namespace k8s.io para interactuar con los recursos gestionados por Kubernetes.

Características:

  • Permite gestionar imágenes de contenedores, crear y administrar contenedores, y realizar operaciones en snapshots.
  • Está más orientada a usuarios avanzados y administradores que necesitan interactuar con containerd de forma directa.
  • No está enfocada a la compatibilidad con la Container Runtime Interface (CRI), por lo que no es la herramienta estándar para integraciones con Kubernetes.

Uso común:

sudo ctr containers list
sudo ctr images pull <imagen>
sudo ctr run --rm -t <imagen> <nombre-contenedor>

📝 El argumento --namespace k8s.io en los comandos de containerd se utiliza para especificar el namespace (espacio de nombres) en el que se ejecutan las operaciones. Containerd organiza los recursos, como contenedores, imágenes y snapshots, en namespaces para aislar su uso y evitar conflictos entre diferentes contextos o aplicaciones

ctr --namespace k8s.io containers list
ctr --namespace k8s.io images pull <imagen>
ctr --namespace k8s.io run --rm -t <imagen> <nombre-contenedor>

crictl (CRI CLI)

  • Propósito: Es una herramienta diseñada para interactuar con cualquier runtime que implemente la Container Runtime Interface (CRI), como containerd y CRI-O.
  • Nivel de acceso: Proporciona una abstracción de alto nivel que es más adecuada para entornos Kubernetes, donde se usa el CRI.

Características:

  • Compatible con Kubernetes y se utiliza comúnmente para ver, depurar y gestionar contenedores en clústeres de Kubernetes.
  • Proporciona comandos simples para listar, detener y describir contenedores y pods.
  • Es más fácil de usar para tareas específicas de Kubernetes y se alinea con la gestión de contenedores en un contexto de CRI.

Uso común:

crictl ps             # Listar contenedores
crictl images         # Listar imágenes
crictl logs <id>      # Ver registros de un contenedor
crictl exec -it <id> sh  # Ejecutar comandos en un contenedor

Principales Diferencias (ctr y clictl):

  • Enfoque: ctr es específico de containerd, mientras que crictl es genérico para cualquier runtime CRI y es más usado en el contexto de Kubernetes.
  • Facilidad de uso: crictl es más amigable para usuarios que trabajan en entornos Kubernetes, mientras que ctr requiere un conocimiento más profundo de containerd.
  • Compatibilidad: crictl es la herramienta preferida en clústeres de Kubernetes porque respeta la Container Runtime Interface y permite la gestión de pods y contenedores de una manera que Kubernetes entiende.
  • Nivel de abstracción: crictl ofrece una capa de abstracción que lo hace más fácil de usar en clústeres que utilizan CRI, mientras que ctr permite un control más detallado pero requiere más conocimientos técnicos.

Conclusión:

Usa ctr cuando necesites un control avanzado y estés trabajando directamente con containerd. Usa crictl para tareas relacionadas con la gestión de contenedores en entornos de Kubernetes y cuando necesites interactuar con cualquier runtime que implemente CRI, facilitando la depuración y administración en estos entornos.


Laboratorio: Utilizando crictl en Kubernetes

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio
  • Haber realizado la validación de conexión y funcionamiento
  • Finalizar las prácticas de laboratorio de las instalaciones de RKE2.

Inicio de laboratorio

Asegurarse de estar en el servidor bastion con el usuario student

student@lab-0-bastion:~>

  1. Establecer una sesión como el usuario student al servidor: lab-#-aio
    student@lab-0-bastion:~> export LAB=X
    
    student@lab-0-bastion:~> ssh student@lab-${LAB}-aio 
    
  2. Cambiar al usuario root
    student@lab-0-aio:~> sudo -i
    
  3. Obtenga el contenido de la configuración de crictl.yaml.

    cat /var/lib/rancher/rke2/agent/etc/crictl.yaml
    
    Salida ejemplo:
    runtime-endpoint: unix:///run/k3s/containerd/containerd.sock
    

    Parámetro Descripción
    runtime-endpoint Especifica el punto de conexión que Kubernetes utiliza para comunicarse con el runtime de contenedores.
    unix:// Esquema de conexión, indica que se usa un socket UNIX para la comunicación.
    /run/k3s/containerd/containerd.sock Ruta del archivo de socket UNIX en el sistema de archivos que conecta Kubernetes con containerd.
  4. Preparar el entonrno para poder utilizar crictl

    export PATH=$PATH:/var/lib/rancher/rke2/bin
    
    export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml
    

  5. Listar los pods eejecutándose en el Nodo con el siguiente comando:
    crictl pods ps
    
  6. Listar los pods con una etiqueta específica
    crictl pods --label app=rancher
    
  7. Listar todas las imágenes de contenedores
    crictl images
    
    Incluir digests:
    crictl images --digests list
    
  8. Listar los contenedores:
    crictl ps -a
    
    crictl ps
    
  9. Identificar un pod en base a un filtro.

    crictl pods --label app=rancher --namespace cattle-system -n 1 -q
    POD_ID=$(crictl pods --label app=rancher --namespace cattle-system -n 1 -q)
    echo ${POD_ID}
    

    Opción Descripción
    -n 1 Limita el número de resultados devueltos a 1.
    -q Muestra únicamente los IDs de los pods en la salida (modo compacto).
  10. Identiicar contenedores en base a un pod.

    crictl ps --pod $POD_ID -q
    CONTAINER_ID=$(crictl ps --pod $POD_ID -q)
    echo ${CONTAINER_ID}
    

  11. Ejecutar un comando en un contenedor en ejecución, elije un contenedor de Rancher Manager , para esto utlizaremos el id del contenedor obtenido en el paso anterior.
    crictl exec -i -t ${CONTAINER_ID} ls /
    
    Puede ejecutar comandos más avanzados invocando el shell.
    crictl exec -i -t ${CONTAINER_ID} sh -c 'id && uptime && env|grep CATTLE_SERVER_VERSION'    
    
  12. Para revisar los logs de un contenedor ejecute el siguiente comando, elije un contenedor de Rancher Manager y ejecuta el siguiente comando, asegurarse de reemplazar el id del contenedor por el correcto:
    crictl logs ${CONTAINER_ID}
    
    crictl logs --tail=10 ${CONTAINER_ID}
    
  13. Obtener más información de un contenedor.
    crictl inspect ${CONTAINER_ID}    
    

Laboratorio: Utilizando ctr en Kubernetes

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio
  • Haber realizado la validación de conexión y funcionamiento
  • Finalizar las prácticas de laboratorio de las instalaciones de RKE2.

Inicio de laboratorio

Asegurarse de estar en el servidor bastion con el usuario student

student@lab-0-bastion:~>

  1. Establecer una sesión como el usuario student al servidor: lab-#-aio
    student@lab-0-bastion:~> export LAB=X
    
    student@lab-0-bastion:~> ssh student@lab-${LAB}-aio 
    
  2. Cambiar al usuario root
    student@lab-0-aio:~> sudo -i
    
  3. Preparar el entonrno para poder utilizar crictl
    export PATH=$PATH:/var/lib/rancher/rke2/bin
    
    export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
    
    export CONTAINERD_NAMESPACE=k8s.io
    
  4. Usa ctr para listar los contenedores en ejecución en el clúster.
    ctr container list
    
  5. Identificar un pod en base a un filtro. Debido a las limitantes de ctr, se puede complementar con crictl.
    crictl pods --label app=rancher --namespace cattle-system -n 1 -q
    POD_ID=$(crictl pods --label app=rancher --namespace cattle-system -n 1 -q)
    echo ${POD_ID}
    
  6. Identiicar contenedores en base a un pod.
    crictl ps --pod $POD_ID -q
    CONTAINER_ID=$(crictl ps --pod $POD_ID -q)
    echo ${CONTAINER_ID}
    
  7. Para ver más detalles sobre un contenedor específico, elije un contenedor de Rancher Manager y ejecuta el siguiente comando, asegurarse de reemplazar el id del contenedor por el correcto:
    ctr container info  ${CONTAINER_ID}
    
  8. Verifica las imágenes de contenedor que están disponibles localmente:
    ctr image list
    
  9. Puedes usar ctr para descargar imágenes de contenedor desde un registro:
    ctr image pull docker.io/library/nginx:latest
    
  10. Para ejecutar un contenedor basado en una imagen descargada:
    ctr run -d -t docker.io/library/nginx:latest my-nginx-container
    
  11. Listar el contenedor ejecutado anteriormente:
    ctr c ls | grep my-nginx-container
    
  12. Verificar todas las tareas (task) en el container runtime:
    ctr tasks ls
    
  13. Puedes ejecutar comandos desde el contenedor creado anteriormente, --exec-id bash_1 especifica un identificador único para la sesión de ejecución que estás iniciando. Este ID permite diferenciar esta sesión de otras posibles ejecuciones que puedan estar ocurriendo en el mismo contenedor. nginx -T: Muestra la configuración completa de nginx, Es útil para demostrar cómo nginx está configurado dentro del contenedor.
    ctr task exec -t --exec-id bash_1 my-nginx-container nginx -T
    
  14. Esposible verificar ciertas métricas del contenedor con el siguiente comando:
    ctr task metrics my-nginx-container
    
  15. Antes de eliminar un contenedor, es necesario detener todas las tareas. Ejecute el siguiente comando para detener la tarea my-nginx-container.
    ctr task kill my-nginx-container
    
  16. Verificar la tarea my-nginx-container en el container runtime:
    ctr tasks ls | grep my-nginx-container
    
  17. Eliminar el contenedor my-nginx-container:
    ctr container rm my-nginx-container
    
  18. Verificar nuevamente la tarea my-nginx-container en el container runtime:
    ctr tasks ls | grep my-nginx-container
    
  19. Puede relizar una limpieza de imagenes no utilizadas, ejecutando:
    ctr images prune --all
    
  20. Salir del ambiente
    lab-0-aio:~ # exit
    logout
    student@lab-0-aio:~> exit
    logout
    Connection to lab-0-aio closed.
    student@lab-0-bastion:~>