¿Qué son los contenedores de aprovisionamiento de Kubernetes y cuándo debería usarlos?
Los contenedores de aprovisionamiento son el mecanismo de Kubernetes para aprovisionar nuevos pods. Los contenedores de inicio se inician y cierran antes que los contenedores de la aplicación principal de su pod, lo que permite que los scripts de arranque se ejecuten en orden secuencial.
En este artículo, le mostraremos cómo agregar contenedores de inicialización a un pod y veremos algunos casos de uso comunes. Aunque los contenedores init están configurados de manera similar a los contenedores normales, tienen algunas diferencias debido a su propósito especial.
El papel de los contenedores Init
Los contenedores de aprovisionamiento resuelven los problemas asociados con la inicialización de aplicaciones en la primera ejecución. Por lo general, los servicios dependen de la finalización exitosa de un script de instalación antes de que puedan iniciarse por completo.
En sistemas más pequeños, puede agregar el script a una imagen de contenedor de aplicación existente. Sin embargo, esto no es ideal ya que agrega otra responsabilidad a la imagen. Incluso puede tener varias etapas separadas, cada una con sus propias dependencias y relaciones. Agregar todas estas operaciones únicas a la imagen de su contenedor principal puede crear rápidamente una complejidad inflada que es difícil de mantener.
Los contenedores de inicio resuelven este problema al permitirle ejecutar contenedores personalizados antes de que se inicien los contenedores de la aplicación del pod. Cada módulo puede tener varios contenedores de inicialización; se garantiza que se ejecutarán secuencialmente, solo después de que el anterior se haya completado con éxito.
Kubernetes inicia pods normales después de que se hayan completado todos los contenedores de inicialización. Si un contenedor de inicio falla, se reiniciará antes de completarse. Si el Pod restartPolicy
está configurado en Never
, el Pod se marca como fallido en su lugar.
Adición de contenedores de inicio a un pod
Los contenedores de inicialización se definen en spec.initContainers
un campo de manifiesto de pod. spec.containers
Esto es muy similar a la definición habitual .
Este es un ejemplo de un pod con dos contenedores de inicio conectados:
Use Kubectl para agregar un pod a su clúster:
$ kubectl apply -f pod.yaml
pod/init-containers-pod created
Ahora, extraiga los registros asociados con cada uno de los contenedores de inicio para asegurarse de que se iniciaron:
$ kubectl logs init-containers-pod -c first-init-container
Este es el primer contenedor de inicio
$ kubectl logs init-containers-pod -c second-init-container
This is the second init container
Puede usar la mayoría de las propiedades disponibles para los manifiestos de contenedor de Kubernetes en initContainers
el campo. Estos incluyen volúmenes, puertos, variables de entorno y contextos de seguridad.
Los contenedores de inicio también admiten límites de recursos, pero se manejan de manera diferente a los contenedores normales. El mayor valor de los límites de recursos declarados por todos los contenedores de aprovisionamiento se elige como límite efectivo del módulo, a menos que sea menor que la suma de los límites de los contenedores de aplicaciones del módulo. Este valor calculado se utilizará con fines de planificación.
Una de las limitaciones de los contenedores de aprovisionamiento es la falta de compatibilidad con las sondas. No puede asignar campos a livenessProbe
, readinessProbe
o startupProbe
objetos contenedores en initContainers
un campo. Los contenedores de inicio son un mecanismo separado que puede usar en lugar de, o junto con, las sondas adjuntas a los contenedores de su aplicación principal.
Errores comunes
Hay algunos errores comunes al usar contenedores init. Aquí hay algunos detalles a tener en cuenta:
- Los contenedores de inicio se ejecutan cada vez que se reinicia su pod. Esto significa que las operaciones de su contenedor de inicio deben ser idempotentes para que puedan ejecutarse dos veces en el mismo pod. Si se reinicia un pod, todos sus contenedores de inicialización se ejecutarán nuevamente.
- No se admiten cambios en
initContainers
el campo Pod, con una excepción. Puede cambiarimage
el campo. Esto reiniciará el módulo y comenzará nuevos contenedores de inicio. - Los nombres de los contenedores de inicio deben ser únicos en todos los contenedores de un pod. Esto incluye otros contenedores de inicio y los contenedores de su aplicación. Verá un error de validación de YAML en su consola si intenta aplicar un manifiesto que viola esta regla.
- Los pods tienen una
Initialized: False
condición cuando se ejecutan los contenedores init. Esto es visible bajoConditions
el encabezado al iniciokubectl describe my-pod
.
También puede verificar si los contenedores de inicio del pod se han completado usando kubectl get
el comando:
$ kubectl get init-containers-pod
NOMBRE LISTO ESTADO REINICIA EDAD
init-containers-pod 0/1 Init:1/2 0 1m
En este caso, STATUS
la columna indica que el módulo tiene dos contenedores de inicialización, uno de los cuales se completó correctamente. Una vez que se hayan completado todos los contenedores de inicio, Kubernetes iniciará los contenedores de la aplicación y el estado del pod cambiará a Running
.
Cuándo usar contenedores Init
Los contenedores de aprovisionamiento son ideales cuando necesita inicializar nuevas implementaciones de su aplicación de alguna manera. Atienden tareas de requisitos previos especiales que dependen de herramientas fuera de la imagen de su contenedor principal.
Aquí hay algunas situaciones en las que es posible que desee utilizar contenedores init:
- Creación de archivos de configuración a partir de variables de entorno.
- Relleno previo de cachés utilizados por su aplicación.
- Migración y llenado de una instancia de base de datos.
- Descargue e instale complementos de aplicaciones en el volumen.
- Bloquear el inicio de la aplicación hasta que las dependencias (como bases de datos o API externas) estén disponibles.
Otra forma de realizar algunas de estas tareas es utilizar una versión de prueba de Listo o Ejecutar . Sin embargo, existe una diferencia en la intención: las sondas están diseñadas principalmente para comunicar el estado del contenedor a Kubernetes, mientras que los contenedores de aprovisionamiento están diseñados para realizar acciones durante la inicialización del Pod.
Resumen
Los contenedores de inicialización son una forma de realizar rutinas de inicialización de primera ejecución en un pod de Kubernetes. Se pueden usar para bloquear o retrasar el lanzamiento de un contenedor de aplicaciones mientras espera que las dependencias estén disponibles o que se completen los scripts de arranque.
La funcionalidad de los contenedores de inicio a veces se superpone con las comprobaciones de inicio y preparación. Puede usar una sonda cuando la acción que desea realizar es básicamente bloquear la ejecución de la aplicación hasta que se cumpla una condición. Se basan en su secuencia de comandos que ya existe en la imagen del contenedor de su aplicación. Un contenedor de inicialización es la mejor opción si desea realizar acciones especiales sin sobrecargar la imagen principal con utilidades únicas.
Deja una respuesta