¿Qué son los contenedores de inicio de Kubernetes y cuándo debería usarlos?

Gráfico que muestra el logotipo de Kubernetes

Los contenedores de inicio son un Mecanismo de Kubernetes para inicializando nuevos Pods. Los contenedores de inicio comienzan y salen antes que los contenedores de la aplicación principal de su Pod, lo que brinda la oportunidad de ejecutar scripts de arranque en orden secuencial.

En este artículo, mostraremos cómo agregar contenedores init a un Pod y consideraremos algunos casos de uso comunes. Aunque los contenedores init están configurados de manera similar a los contenedores regulares, tienen algunas diferencias debido a su propósito especializado.

El papel de los contenedores Init

Los contenedores Init resuelven los desafíos asociados con la primera inicialización de aplicaciones. Es común que los servicios dependan de la finalización exitosa de un script de configuración antes de que puedan iniciarse por completo.

En sistemas más pequeños, puede agregar el script a la imagen del contenedor de su aplicación existente. Sin embargo, esto no es ideal ya que agrega otra responsabilidad a la imagen. Incluso puede tener varias etapas distintas para completar, cada una con sus propias dependencias y relaciones. Agregar todas estas operaciones de un solo uso a la imagen de su contenedor principal puede crear rápidamente una complejidad inflada que es difícil de mantener.

Los contenedores de inicio solucionan esto al permitirle ejecutar contenedores especializados antes de que comiencen los contenedores de aplicaciones de un Pod. Cada Pod puede tener varios contenedores de inicio; se garantiza que se ejecutarán secuencialmente, solo después de que el anterior se haya completado al salir con éxito.

Kubernetes inicia los contenedores normales del Pod una vez que se han completado todos los contenedores de inicio. Si un contenedor de inicio falla, se reiniciará hasta que se complete. Cuando el Pod restartPolicy se establece en Neverel 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 el spec.initContainers campo del manifiesto de un Pod. Esto es muy similar a un regular spec.containers definición.

Este es un ejemplo de un Pod con dos contenedores de inicio adjuntos:

apiVersion: v1
kind: Pod
metadata:
  name: init-containers-pod
spec:
  containers:
    - name: app-container
      image: busybox:latest
      command: ["echo", "Started app"]
  initContainers:
    - name: first-init-container
      image: busybox:latest
      command: ["echo", "This is the first init container"]
    - name: second-init-container
      image: busybox:latest
      command: ["echo", "This is the second init container"]

Use Kubectl para agregar el Pod a su clúster:

$ kubectl apply -f pod.yaml
pod/init-containers-pod created

Ahora recupere los registros asociados con cada uno de los contenedores de inicio para confirmar que se han ejecutado:

$ kubectl logs init-containers-pod -c first-init-container
This is the first init container

$ 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 Kubernetes manifiestos de contenedores dentro de un initContainers 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 estos son manejado de manera diferente a contenedores normales. El valor más alto de los límites de recursos declarados por todos los contenedores de inicio se selecciona como el límite efectivo del Pod, a menos que sea inferior a la suma de los límites en los contenedores de aplicaciones del Pod. Este valor calculado se utilizará para fines de programación.

Una limitación de los contenedores init es su falta de soporte para sondas. no puedes asignar livenessProbe, readinessProbeo startupProbe campos a objetos contenedores en el initContainers campo. Los contenedores de inicio son un mecanismo separado que puede usar en lugar de o junto con las sondas conectadas a los contenedores de su aplicación principal.

Errores comunes

Hay algunas trampas comunes cuando se usan contenedores init. Aquí hay algunos detalles para recordar:

  • 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 sean resistentes a ejecutarse dos veces en el mismo pod. Si se reinicia el Pod, todos sus contenedores de inicio se ejecutarán nuevamente.
  • Cambios en un Pod initContainers no se admiten, con una excepción. Puedes modificar el image campo. Esto hará que el Pod se reinicie y ejecute sus nuevos contenedores de inicio.
  • Los nombres de los contenedores de inicio deben ser únicos en todos los contenedores del 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 infringe esta regla.
  • Las vainas tienen un Initialized: False condición cuando los contenedores init se están ejecutando. Esto es visible debajo de la Conditions rumbo cuando corres kubectl describe my-pod.

También puede verificar si los contenedores de inicio de un Pod se han completado usando el kubectl get dominio:

$ kubectl get init-containers-pod
NAME                   READY     STATUS    RESTARTS    AGE
init-containers-pod    0/1       Init:1/2  0           1m

En este caso, el STATUS La columna muestra que el Pod tiene dos contenedores de inicio, uno de los cuales se completó con éxito. Una vez que finalicen 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 Init son ideales cuando es necesario inicializar nuevas implementaciones de su aplicación de alguna manera. Atienden tareas previas a la ejecución dedicadas que dependen de herramientas fuera de la imagen de su contenedor principal.

Aquí hay algunas situaciones en las que podría usar contenedores init:

  • Generación de archivos de configuración a partir de variables de entorno.
  • Relleno previo de cachés utilizados por su aplicación.
  • Migrar y sembrar una instancia de base de datos.
  • Descarga e instalación de complementos de aplicaciones en un volumen.
  • Bloquear el inicio de la aplicación hasta que las dependencias estén disponibles (como bases de datos o API externas).

Otra forma de lograr algunas de estas tareas es con un sonda de preparación o inicio. Sin embargo, hay una diferencia en la intención: las sondas están diseñadas principalmente para comunicar el estado de un contenedor a Kubernetes, mientras que los contenedores init están designados como una forma de realizar comportamiento durante la inicialización del Pod.

Resumen

Los contenedores Init son una forma de realizar rutinas de inicialización de primera ejecución dentro de un pod de Kubernetes. Se pueden usar para bloquear o retrasar el inicio del contenedor de la aplicación mientras espera que las dependencias estén disponibles o que se completen los scripts de arranque.

La funcionalidad de los contenedores init a veces se superpone a las pruebas de inicio y preparación. Puede usar una sonda cuando la actividad que desea realizar se relaciona principalmente con el bloqueo del inicio 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 init es una mejor opción cuando desea realizar acciones especializadas sin sobrecargar su imagen principal con utilidades de un solo uso.

Deja un comentario

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