Hola, me llamo Luis y aquí les traigo un nuevo post.
Índice
Comprensión del patrón de contenedor de inicio con un proyecto de ejemplo
Kubernetes es un motor de orquestación de contenedores de código abierto para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores. Un pod es el componente básico de la aplicación de Kubernetes. Kubernetes administra pods en lugar de contenedores y los pods encapsulan contenedores. Un pod puede contener uno o más contenedores, almacenamiento, direcciones IP y opciones que gobiernan cómo deben ejecutarse los contenedores dentro del pod.
Un pod que contiene un contenedor se refiere a un solo pod de contenedor y es el caso de uso de kubernetes más común. Un pod que contiene varios contenedores co-relacionados se refiere a un pod de varios contenedores. Hay pocos patrones para pods de contenedores múltiples, uno de ellos es el patrón de contenedor init. En esta publicación, veremos este patrón en detalle con un proyecto de ejemplo.
¿Qué son los contenedores de inicio?
Los contenedores de inicio son los contenedores que deben ejecutarse y completarse antes del inicio del contenedor principal en el pod. Proporciona un ciclo de vida independiente para la inicialización, de modo que permite la separación de preocupaciones en las aplicaciones. Por ejemplo, necesita instalar algún software específico antes de que desee ejecutar su aplicación, puede hacer esa parte de instalación en el contenedor de inicio del pod.
Si observa el diagrama anterior, puede definir n número de contenedores para los contenedores de inicio y su contenedor principal se inicia solo después de que todos los contenedores de inicio se terminen correctamente. Todos los contenedores de inicio se ejecutarán secuencialmente y si hay un error en el contenedor de inicio, el pod se reiniciará, lo que significa que todos los contenedores de inicio se ejecutarán nuevamente. Por lo tanto, es mejor diseñar su contenedor de inicio como simple, rápido e idolpodent.
Otros patrones
Hay otros patrones que son útiles para las cargas de trabajo diarias de Kubernetes.
- Patrón de contenedor Sidecar
- Patrón de contenedor de adaptador
- Patrón de contenedor de embajador
Proyecto de ejemplo
Aquí está el proyecto de ejemplo que puede clonar y ejecutar en su máquina. Debe instalar Minikube como requisito previo.
https://github.com/bbachi/k8s-init-container-pattern.git
Implementemos un proyecto simple para comprender este patrón. Aquí hay un pod simple que tiene contenedores main e init. El contenedor principal es nginx que sirve en el puerto 80 que toma index.html de la ubicación del directorio de trabajo de montaje de volumen . El contenedor de inicio con la imagen busybox creará el archivo en la misma ubicación. Dado que el contenedor Init se ejecuta primero y finaliza antes del inicio del contenedor principal, Nginx encontrará el archivo en la ubicación / usr / share / nginx / html.
pod.yml
Ejecutemos los siguientes comandos para crear el pod y probarlo.
// create the pod kubectl create -f pod.yml // list the pods kubectl get po // exec into pod kubectl exec -it init-container-demo -- /bin/sh # apt-get update && apt-get install -y curl # curl localhost
Puede instalar curl y consultar el localhost y verificar la respuesta.
Prueba con objeto de implementación
Creemos un objeto de implementación con la misma especificación de pod con 5 réplicas. He creado un servicio con el tipo de puerto NodePort para que podamos acceder al despliegue desde el navegador. Los pods son dinámicos aquí y el controlador de implementación siempre intenta mantener el estado deseado, por eso no puede tener una dirección IP estática para acceder a los pods, por lo que debe crear un servicio que exponga el puerto estático al mundo exterior. Mapas de servicio internos al puerto 80 según los selectores. Lo verá en acción en un momento.
Veamos el objeto de implementación a continuación donde definimos dos contenedores de inicio. Los contenedores de inicio se ejecutan secuencialmente, el primer contenedor de inicio escribe esta línea “<html> <h1> Hola, soy del contenedor de inicio </h1>” y el segundo contenedor agrega esta línea “<p> Hola, soy del segundo contenedor de inicio </ p > </html> ” al archivo index.html. puedes ver eso en acción en un rato.
manifest.yml
Sigamos estos comandos para probar la implementación.
// create a deployment kubectl create -f manifest.yml // list the deployment, pods, and service kubectl get deploy -o wide kubectl get po -o wide kubectl get svc -o wide
En el diagrama anterior, puede ver 5 pods ejecutándose en diferentes direcciones IP y el objeto de servicio asigna el puerto 32244 al puerto 80. De hecho, puede acceder a esta implementación desde el navegador desde la dirección IP maestra de kubernetes 192.168.64.2 y el puerto de servicio 32244 .
http://192.168.64.2:32244
Cómo configurar los límites de recursos
Configurar los límites de recursos es muy importante cuando se trata de contenedores de inicio. El punto principal que debemos entender aquí es que los contenedores de inicio se ejecutan primero antes del inicio del contenedor principal, por lo que cuando configura los límites de recursos para el pod, debe tenerlo en cuenta.
- Los límites más altos de recursos del contenedor de inicio (ya que los contenedores de inicio se ejecutan secuencialmente).
- La suma de todos los límites de recursos de los contenedores principales (ya que todos los contenedores de aplicaciones se ejecutan en paralelo).
¿Cuándo debemos usar este patrón?
Estos son algunos de los escenarios en los que puede utilizar este patrón
- Puede usar este patrón cuando su aplicación o contenedores principales necesiten algunos requisitos previos, como instalar algún software, configurar la base de datos, permisos en el sistema de archivos antes de comenzar.
- Puede utilizar este patrón cuando desee retrasar el inicio de los contenedores principales.
Resumen
- Un pod que contiene un contenedor se refiere a un solo pod de contenedor y es el caso de uso de kubernetes más común.
- Un pod que contiene varios contenedores co-relacionados se refiere a un pod de varios contenedores.
- El patrón del contenedor Init es uno de los patrones que usamos regularmente para las tareas de inicialización.
- Los contenedores de inicio se ejecutan secuencialmente, lo que significa uno por uno. Por lo tanto, debe considerar el uso del límite de recursos más alto al definir los límites de solicitudes / recursos para el pod.
- Los contenedores de aplicaciones se ejecutan en paralelo, lo que significa que todos los contenedores de aplicaciones se ejecutan al mismo tiempo. De modo que debe resumir todos los límites de solicitudes / recursos de los contenedores mientras define los límites de solicitudes / recursos para el pod.
- Todos los pods en el objeto de implementación no tienen direcciones IP estáticas, por lo que necesita un objeto de servicio para exponerlo al mundo exterior.
- El objeto de servicio se asigna internamente al puerto del contenedor del puerto según los selectores.
- Puede usar este patrón cuando su aplicación o contenedores principales necesiten algunos requisitos previos, como instalar algún software, configurar la base de datos, permisos en el sistema de archivos antes de comenzar.
Conclusión
Siempre es bueno conocer patrones de kubernetes ya probados. Utilice este patrón siempre que haya tareas de inicialización que deba realizar y desee tener una separación de preocupaciones. Recuerde siempre que los contenedores de inicio se ejecutan secuencialmente y deben terminar primero antes del inicio de los contenedores principales.
Añadir comentario