Los contenedores efímeros en Kubernetes 1.23 proporcionan una forma de adjuntar contenedores temporales al espacio de nombres de proceso de un pod en ejecución y ejecutar utilidades de depuración. La opción de depuración del comando kubectl se puede usar para iniciar dicho contenedor con una imagen elegida por el usuario.
Esta característica intenta resolver el problema de la solución de problemas nativa de Kubernetes. Esto a menudo implica abrir una terminal en el contenedor en ejecución. Sin el conjunto estándar de utilidades de solución de problemas a las que estamos acostumbrados en cualquier distribución de Linux, iniciar sesión en el contenedor no sirve de nada. Muchas imágenes de contenedores se basan en distribuciones mínimas como Alpine o se basan en distroless que carecen de estas utilidades. Estas restricciones existen para reducir la superficie de ataque de las vulnerabilidades, pero también dificultan la depuración.
En Kubernetes, un contenedor es parte de una unidad más grande: el Pod. Un pod puede tener varios contenedores, algunos de los cuales podrían ser contenedores de inicio. Los contenedores efímeros son contenedores temporales que se pueden agregar a un pod en ejecución con el comando de depuración kubectl.
kubectl -n myns debug my-pod -it my-ephemeral-container –image=ubuntu –target=target-container
donde target-container es el contenedor (parte de my-pod) que se va a depurar. Este comando inicia un terminal interactivo en el espacio de nombres del proceso del contenedor de destino. El parámetro –image te permite elegir la imagen del contenedor efímero. Esto significa que puede elegir la imagen del depurador e incluir en ella las herramientas que necesite.
Kubernetes no reserva ningún recurso para estos contenedores y no se reinician al salir. Algunos de los atributos de contenedor habituales, como puertos, livenessProbe y solicitudes de recursos, no son compatibles con contenedores efímeros.
Lee Verberne , ingeniero de confiabilidad del sitio en Google, que ha estado involucrado en la implementación desde el principio, describe cómo el orquestador de contenedores interno de Google, Borg, resuelve el problema de depuración:
Borg proporciona una zona de usuario común para los procesos. En lugar de incluir utilidades de sistema y de depuración con el binario de la aplicación, Borg proporciona un conjunto básico de utilidades de usuario que las aplicaciones pueden esperar en su entorno de tiempo de ejecución.
Borg es un precursor de Kubernetes.
Una solución es copiar las herramientas de depuración en el contenedor, pero como señala Verberne: “Kubernetes implementa binarios usando contenedores, por lo que es natural usar contenedores también para solucionar problemas”.
El comando de depuración kubectl también admite otras opciones a partir de la versión 1.23. Estos incluyen adjuntar un contenedor efímero a una copia de un pod en ejecución. El pod copiado se puede ejecutar con el comando original con el que se ejecutó el contenedor del pod o con un comando diferente. La depuración de kubectl también le permite crear un nuevo pod que puede ejecutarse en los espacios de nombres IPC, Red y PID del host del nodo y puede acceder al sistema de archivos del nodo. Esto es útil si necesita acceder al sistema de archivos o procesos del host. GKE proporciona un contenedor de caja de herramientas personalizado similar con utilidades en sus clústeres que pueden acceder al sistema de archivos del host, pero no tiene las otras características de la depuración de kubectl.
Es importante tener en cuenta que el uso compartido de espacios de nombres de procesos debe habilitarse tanto en el nivel del clúster como en el pod depurado para que funcionen los contenedores efímeros. Se ha habilitado de forma predeterminada en el nivel de clúster desde Kubernetes 1.17. Si no está habilitado para el pod depurado, una opción sería lanzar una copia del pod con la opción habilitada y luego adjuntar el contenedor efímero. Sin embargo, esto no funcionará en situaciones en las que el problema no se repita en el pod copiado.
Los contenedores efímeros forman parte de un plan de varios lanzamientos para admitir el comando de depuración kubectl. Presentado por primera vez en la versión 1.16 de Kubernetes , pasó a la versión beta en la versión 1.23. Los contenedores efímeros están activados de forma predeterminada en Kubernetes 1.23 en adelante.