InitContainers en Kubernetes

Un Pod puede tener varios contenedores que ejecuten aplicaciones en su interior, lo que técnicamente se denomina pod multicontenedor. Pero el pod también puede tener uno o más contenedores init. Estos contenedores se ejecutan antes de que se inicien los contenedores de aplicaciones. Los contenedores init siempre se ejecutan hasta completarse y cada contenedor init debe completarse con éxito antes de que se inicie el siguiente.

La diferencia entre los contenedores normales y los InitContainers es que los InitContainers no admiten lifecycle, livenessProbe, readinessProbe o startupProbe porque deben ejecutarse hasta completarse antes de que el Pod pueda estar listo. Si hay varios contenedores init en un Pod, Kubelet ejecuta cada contenedor init secuencialmente.

Los contenedores init se utilizan para configurar código personalizado que no está presente en una imagen de aplicación. Los contenedores de inicio pueden utilizarse para ofrecer un mecanismo que bloquee o retrase el inicio del contenedor de la app hasta que se cumplan una serie de condiciones previas. Al mantener las herramientas innecesarias separadas de los contenedores de aplicación principales, se pueden utilizar InitContainer que pueden limitar la superficie de ataque de la imagen del contenedor de aplicación.

Cada InitContainer debe completarse con éxito antes de que se inicie el siguiente. De este modo, los Init Containers proporcionan una forma de bloquear o retrasar el inicio de los contenedores de aplicaciones hasta que se cumplan una serie de condiciones previas.

Para saber más sobre InitContainer, haz clic aquí para visitar la documentación oficial de Kubernetes.

En este artículo, veremos la demostración de InitContainers que se inician antes que el contenedor principal.

Requisitos previos

  1. Clúster Kubernetes con al menos 1 nodo trabajador.
  2.  2 Nodos en Instancias EC2 Ubuntu de AWS.

¿Qué vamos a hacer?

  1. Crear un Pod con InitContainers

Crea un Pod con InitContainers

Crea un archivo objeto para InitContainers con el siguiente contenido.

vim pod-with-initcontainer.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-initcontainer
  labels:
    app: myapp
spec:
  containers:
  - name: main-container
    image: busybox
    command: ['sh', '-c', 'echo Inside the main-container! && sleep 36000']
  initContainers:
  - name: init-container-1
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-1 start; sleep 2;echo init-container-1 completed;']
  - name: init-container-2
    image: busybox
    command: ['sh', '-c', 'echo Inside init-container-2 start; sleep 2;echo init-container-2 completed;']

pod-definición-con-contenedores-init\

En este ejemplo, 2 InitContainers se ejecutarán durante 2 s cada uno y, cuando finalicen con éxito, se iniciará el contenedor principal, que estará vivo durante 36000 s.

Este ejemplo demuestra el uso de la funcionalidad InitContainer y puedes tener tu propio caso de uso

Obtén una lista de los puertos existentes en el clúster y crea un pod init-container con los siguientes comandos.

kubectl get pods #Get a list of existing pods
kubectl apply -f pod-with-initcontainer.yml #Create a pod with InitContainer
kubectl get pods #Check the pod which got created

crear-un-cápsula-con-contenedores-init

En la captura de pantalla anterior, puedes ver que se está creando el cuerpo.

Podemos comprobar los registros tanto del contenedor init como del contenedor principal para comprender la ejecución y el flujo en el que se crean y ejecutan los contenedores.

kubectl get pods
kubectl logs pod-with-initcontainer -c init-container-1 --timestamps=true #Check logs of the 1st InitContainer
kubectl logs pod-with-initcontainer -c init-container-2 --timestamps=true #Check logs of the 2nd InitContainer
kubectl logs pod-with-initcontainer --timestamps=true #Check logs of the main container

comprobar-registros-de-todos-los-contenedores-del-podo

De la captura de pantalla anterior, podemos entender que necesitas que los contenedores se ejecuten primero en la secuencia en que están definidos en el archivo de definición. Una vez que finaliza la ejecución de los contenedores init, se inicia el contenedor principal.

Los contenedores de inicio siempre se inician en la secuencia en que se definen en el archivo de definición.

Podemos obtener más detalles del pod utilizando el siguiente comando.

kubectl get pods #Get a list of Pods
kubectl describe pod pod-with-initcontainer #Get details of the Pod

detalles-del-pod

En la captura de pantalla anterior, podemos ver que el estado de ambos init-containers ha finalizado y el motivo está completado.

Esto significa que los contenedores init han realizado con éxito su operación y han finalizado.

detalles-del-pod

En la captura de pantalla anterior, puedes ver que el estado del contenedor principal es en ejecución.

Cuando ya no necesites este pod, puedes eliminarlo utilizando el siguiente comando.

kubectl get pods
kubectl delete pod pod-with-initcontainer #Delete the Pod

borrar-el-pod

Conclusión

En este artículo, hemos visto los pasos para crear un pod que contenga contenedores init y la aplicación principal. Hemos observado la secuencia de ejecución de los contenedores en el pod. También vimos cómo se terminan los contenedores init cuando terminan su operación.

También te podría gustar...