Cómo ejecutar comandos dentro de los contenedores de pods de Kubernetes

Gráfico que muestra el logotipo de Kubernetes

Las aplicaciones que se ejecutan en Kubernetes normalmente son servicios de larga duración con los que no necesita interactuar. Sin embargo, a veces es posible que desee ejecutar manualmente un comando dentro de un contenedor, tal vez para una operación de mantenimiento única o para ayudar en un procedimiento de depuración.

En este artículo, mostraremos cómo ejecutar comandos y obtener sesiones de shell interactivas dentro de los contenedores de Kubernetes. Esto le permitirá iniciar procesos en el contenedor usando su terminal local. Está completamente integrado con Kubernetes y su CLI de Kubectl, por lo que no tiene que contaminar las imágenes de su contenedor con un demonio SSH para habilitar el acceso remoto.

Uso de Kubectl Exec

kubectl exec ejecuta un comando dentro de un contenedor en ejecución. Tiene la siguiente sintaxis básica:

$ kubectl exec demo-pod -- demo-command

esto se ejecutará demo-command dentro del primer contenedor del demo-pod Vaina. El comando se ejecuta con privilegios de root.

Se necesitan banderas adicionales para configurar una sesión de terminal interactiva:

  • --stdin (-i) – Pase el flujo de entrada estándar de su terminal al contenedor.
  • --tty (-t) – Marque el flujo de entrada estándar como un TTY, haciéndolo interactivo.

Aquí hay un ejemplo de cómo llevar un caparazón al primer contenedor en un Pod:

$ kubectl exec -it demo-pod -- /bin/sh

Todo después de la -- se convierte en parte del comando que se ejecuta dentro del contenedor. kubectl exec ignora el punto de entrada predeterminado del contenedor y, en su lugar, inicia un nuevo proceso con el comando que especifique. No debe envolver el comando con comillas ("/bin/sh") a menos que los use normalmente al ejecutar el comando localmente.

Elegir un contenedor diferente

kubectl exec se conecta al contenedor predeterminado del Pod cuando no se proporcionan otros argumentos. El contenedor por defecto es el que tiene el kubectl.kubernetes.io/default-container anotación. Este será el primer contenedor en el Pod si no ha agregado manualmente la anotación a ningún otro.

Aquí hay un Pod que ejecuta dos contenedores:

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: app-container
      image: nginx:latest
    - name: sidecar-container
      image: busybox:latest

Puede ejecutar un comando dentro del sidecar-container agregando el -c bandera a kubectl exec:

$ kubectl exec --it demo-pod -c sidecar-container -- /bin/sh

Esperando a que se ejecuten los pods

Kubectl esperará un minuto para que el Pod sea Running si sus contenedores aún no se han iniciado cuando ejecuta el exec dominio. Este valor de tiempo de espera se puede cambiar con el --pod-running-timeout bandera. Es útil cuando desea ejecutar un comando inmediatamente después de crear un nuevo Pod, cuando es posible que no se haya programado para un Nodo.

$ kubectl exec --pod-running-timeout=5m demo-pod -- demo-command

¿Cuándo debo usarlo?

kubectl exec se reserva mejor para situaciones especializadas en las que necesita interactuar directamente con el sistema de archivos de un contenedor. Puede usarlo para acceder a registros o cachés después de un problema o para ejecutar un script de limpieza que se usa con poca frecuencia y que se proporciona en una imagen de contenedor.

A pesar de que kubectl exec le permite ejecutar cualquier comando, debe evitar modificar drásticamente el entorno del contenedor. Esto podría hacer que el contenedor se desvíe del estado esperado. Los contenedores normalmente no deberían requerir intervención, por lo que el uso de kubectl exec dentro de los entornos de producción por lo general indica que algo salió mal.

No use este comando para instalar paquetes o aplicar actualizaciones dentro del contenedor. Este tipo de operación debe gestionarse mediante la creación de una nueva imagen de contenedor que incluya los cambios y, a continuación, la sustitución de los pods de Kubernetes por otros que ejecuten la compilación revisada. Seguir este principio garantiza que sus cambios no se perderán cuando el Pod se reinicie y vuelva al sistema de archivos de la imagen de su contenedor. Mantener sus contenedores inmutables también garantiza que se puedan reproducir de manera confiable a partir de sus imágenes, lo que mejora la confiabilidad y la facilidad de depuración.

Resumen

Ejecutar un comando único dentro de un contenedor de Kubernetes le permite depurar problemas, realizar tareas de mantenimiento e inspeccionar el sistema de archivos del contenedor. En cada una de estas situaciones, puede utilizar kubectl exec para obtener una conexión a un contenedor.

Agregando el -it La combinación de banderas reenviará el flujo de entrada estándar de su terminal como un TTY, proporcionando una sesión de shell interactiva. Esto no siempre será necesario según el comando que desee usar: si solo produce una salida, sin requerir ninguna entrada, puede omitir las banderas de manera segura.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad