PODs de Kubernetes

jubernetes podsEn esta artículo hablaremos sobre los PODs de Kubernetes. Asumo que Kubernetes ya esta configurado y funcionando tal como se indicó en el artículo . También asumimos que la aplicación que quiere desplegarse está desarrollada, creada su imagen y disponible en un repositorio de Docker. La configuración realizada de Kubernetes puede ser una de un solo nodo o una configuración de múltiples nodos. Pero todos los servicios deben estar en estado de ejecución. Nuestro objetivo final es implementar nuestra aplicación en forma de contenedores. En un conjunto de máquinas que están configuradas como nodos de trabajo en un clúster. Para entender más sobre Kubernetes o su instalación se pueden leer los artículos Visión general de KubernetesInicialización de Kubernetes

Los contenedores para Kubernetes no se implementan directamente en los nodos de trabajo, se encapsulan en un objeto de Kubernetes conocido como POD. Un POD es una instancia única de una aplicación y es el objeto más pequeño que se puede crear en Kubernetes. El caso más simple de POD es el de una sola instancia. Instancia de una aplicación encapsulada en un contenedor y ejecutándose en un clúster de Kubernetes de un solo nodo. Si el número de usuarios que acceden a la aplicación aumenta, se deben agregar instancias adicionales de la aplicación para compartir la carga.

Instancias de los PODs

La primera pregunta que surge es ¿dónde añadir instancias adicionales? Debemos crear un POD completamente nuevo con una nueva instancia de la misma aplicación. Así que ahora tendremos dos instancias de la misma aplicación ejecutándose en dos PODs separados en el mismo sistema o nodo de Kubernetes. Si la carga de usuarios aumenta y el nodo actual no tiene capacidad suficiente, entonces podemos implementar PODs adicionales en otro nodo en el clúster. Así, se tendrá un nuevo nodo agregado al clúster, expandiendo la capacidad física. Los PODs generalmente tienen una relación uno a uno con los contenedores que ejecutan una aplicación. Para incrementar la capacidad se crean nuevos PODs y para reducirla, se eliminan PODs existentes. No es necesario agregar contenedores adicionales a ningún POD para escalar la aplicación.

Pero no estamos restringidos a tener un solo contenedor en un solo POD. Un POD puede tener múltiples contenedores, pero lo normal es que no tengan múltiples contenedores del mismo tipo. Si la intención es escalar una aplicación, necesitamos crear PODs adicionales. Pero a veces se puede tener un escenario en el que es necesario un contenedor auxiliar. Éste contenedor podría estar haciendo algún tipo de tarea de soporte para la aplicación. Procesar los datos ingresados por el usuario, procesar un archivo cargado por el usuario, etc… Se desea que estos contenedores auxiliares vivan junto a su contenedor de aplicaciones.

En ese caso, puede tener ambos contenedores. De este modo, cuando se crea un nuevo contenedor de aplicaciones, también se crean sus asistente. Y cuando muere, los auxiliares también mueren ya que son parte de la misma cápsula. Los contenedores del mismo POD pueden comunicarse entre sí directamente ya que están como un host local. Además comparten el mismo espacio de red y también pueden compartir el mismo espacio de almacenamiento.

Encapsulación

Supongamos que estamos desarrollando un proceso o un script para implementar una aplicación en un host Docker. Simplemente desplegaríamos la aplicación utilizando un comando “docker run”. La aplicación funciona bien y los usuarios pueden acceder a ella. Cuando aumenta la carga, implementamos más instancias de nuestra aplicación las veces que necesitemos. Pero en algún momento en el futuro, la aplicación se desarrolla más, crece y se vuelve compleja. Aparece un nuevo contenedor auxiliar que ayuda a la aplicación para procesar o buscar datos de otros lugares. con una relación uno a uno con nuestro contenedor de aplicaciones. Por lo tanto, necesitan comunicarse directamente con los contenedores de aplicaciones y acceder a los datos de esos contenedores.

Con esto necesitaríamos establecer la conectividad de red entre esos contenedores nosotros mismos. Para ello utilizamos enlaces y redes personalizadas y tendríamos que crear volúmenes compartidos entre los contenedores. Y lo más importante, necesitaríamos monitorizar el estado del contenedor de la aplicación y cuando muera eliminar manualmente manualmente el contenedor y/o los auxiliares. Cuando se despliega un nuevo contenedor, tendremos que implementar el nuevo contenedor auxiliar.

Con los PODs, Kubernetes hace todo esto automáticamente. Solo tenemos que definir en qué consisten los contenedores POD. Así los contenedores dentro de un POD de forma predeterminada tendrán acceso al mismo almacenamiento, el mismo espacio de nombres de red y el mismo destino, ya que se crearán y destruirán juntos. Incluso si la aplicación no fuera tan compleja y pudiéramos vivir con un solo contenedor, Kubernetes necesita que se creen los PODs, pero esto es bueno a largo plazo. De esta manera la aplicación estará equipada para cambios arquitectónicos y podrá escalarse en el futuro. Sin embargo, también hay que tener en cuenta que los PODs con múltiples contenedores son un caso de uso poco frecuente.

Despliegue de PODs en Kubernetes

El comando “kubectl run nombrePOD” despliega un contenedor creando un POD. Pero para crear el POD automáticamente necesita desplegar una instancia de una imagen Docker. Para eso se necesita especificar el nombre de la imagen usando el parámetro –image que se descargará desde el repositorio Docker Hub: “kubectl run nombre –image python”. Se puede configurar Kubernetes para extraer la imagen de Docker Hub público o un repositorio privado. Ahora que tenemos un POD creado, podemos ver la lista de pods disponibles en el cluster con el comando “kubectl get pod”. Si se usa con la opción “-o wide” mostrará el listado de PODs con la IP asignada a cada uno de ellos y el nodo donde esta. También se puede utilizar el comando “kubectl describe pods” para mostrar más información sobre los PODs que hay en el cluster.

Documentación oficial sobre PODs: PODs Documentation