Docker & K8s

Describiremos la relación de estos gestores y algunos de los conceptos más importantes de ambos.

Maria Garcia-Ch
Nowports Tech and Product
7 min readApr 26, 2021

--

Para facilitar a un desarrollador o administrador de sistemas la implementación de sus aplicaciones en ambientes aislados, surgen los conceptos de Docker, Docker-compose, Kubernetes. Todos ellos están relacionados y trabajan en conjunto.

Docker y Kubernetes son dos herramientas para el desarrollo de software, conocidas por ser de los gestores más populares para contenedores de software. Recordemos que un contenedor es aquel que incluye todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema, código, tiempo de ejecución, entre otros.

Entendemos que no todo el mundo está familiarizado con estos términos, pero en el ámbito de desarrollo de software es más importante aprender sobre ello, ya que ha generado gran impacto en la entrega y escala de aplicaciones.

La finalidad de este artículo es describir la relación de estos gestores, así como algunos de los conceptos más importantes de ambos. Este no es un artículo avanzado sobre instalar estas herramientas o cómo desarrollar, más bien proporcionamos un panorama general de la gestión de contenedores.

Gestor de contenedores

Docker y Kubernetes son tecnologías distintas que trabajan de manera conjunta para compilar, entregar y escalar aplicaciones en contenedores.

Docker es una herramienta que permite la automatización en el desarrollo de aplicaciones, utilizando contenedores portátiles autosuficientes que pueden ejecutarse en la nube o en entornos locales. Para entornos locales, es bastante común utilizar Docker Compose, que resulta ser un auxiliar o herramienta que simplifica el uso de Docker.

De hecho, Docker Compose provee de cierta facilidad de código, utilizando archivos con extensión .yaml para dejar de utilizar utilizar sentencias directamente en consola. Esto resuelve dos cosas: evita memorizar estas líneas y genera un histórico de las sentencias ejecutadas.

Hasta este punto, los contenedores creados mediante Docker viven en un solo host. Mientras nuestras aplicaciones crecen, aumenta el número de contenedores implementados, con un gran volumen de información. El mantenimiento de estos se torna complejo y es aquí donde entra en juego Kubernetes.

Kubernetes o k8s es un software de orquestación de código abierto que permite coordinar y programar varios contenedores, comunicarlos, escalar el acceso a los mismos, entre otras tareas importantes. Kubernetes cuenta con una API para controlar el cómo se ejecutarán los contenedores. Trabajando en conjunto con Docker, se puede simplificar el funcionamiento al escalar contenedores implementados en varios servidores.

Arquitectura de los gestores de contenedores

Para explicar la arquitectura de los kubernetes, vamos a bajar al nivel más simple de abstracción. En la tabla 1.0 se muestran las unidades de medida de longitud. De estas, el milímetro corresponde a la unidad más pequeña, después le sigue el centímetro, decímetro, metro, etc. Como programación, el cm es un wrapper del mm, el dm es un wrapper del cm y así sucesivamente.

Tabla 1.0 Unidades de medida de longitud - Figura 1.0. - Representación gráfica de unidades de medida de longitud, considerando las mismas como un wrapper

La arquitectura de Kubernetes consta de una clara jerarquía, compuesta por algunos elementos como imágenes, contenedores, pods, deployments, entre otros. En la tabla 2.0 se muestra un listado con estas unidades y de lado derecho una representación de las mismas. Como en el ejemplo anterior, vemos el wrapper de los elementos. Estos son algunos de los más importantes, no los únicos existentes.

Tabla 2.0.- Unidades de medida de Kubernetes Figura 2.0.- Representación gráfica de unidades de medida de Kubernetes, considerando las mismas como un wrapper.

Cómo se observa en la tabla 2.0, algunas de estas medidas se utilizan un poco más en temas de Docker (imágenes y contenedores) y los otros con Kubernetes. Sabemos que estos trabajan en conjunto, pero pueden ser agrupados de esta manera.

El principio de Docker y K8s: las imágenes.

Una imagen es una especie de máquina virtual. Recordemos que una máquina virtual es aquella donde se simula un sistema operativo que puede ejecutar programas como si fuese una computadora real. En el caso de las imágenes, resulta ser mucho más ligera y con mucho más potencial.

Por ejemplo, una imagen podría contener una aplicación de Node corriendo en un sistema operativo Debian y ejecutándose en el puerto 8080, con solo un archivo y unas cuantas líneas de código.

En la figura 3.0 se muestra un ejemplo de esta aplicación utilizando un Dockerfile. A diferencia de utilizar máquina virtual donde tendríamos que instalar el sistema operativo y muchas otras dependencias, para este caso el Dockerfile resulta ser bastante sencillo. Basta con correr los siguientes comandos:

docker build — tag image_name y docker run -d -p 8080:3001 image_name

Figura 3.0 Dockerfile de una imagen personalizada para una aplicación Node

Como se mencionó anteriormente y a manera de resaltar, recordemos que las imágenes son la unidad mínima de información en temas de K8s y Docker.

Contenedores

Una vez que se crea una imagen, la idea es que esta sea fija pero se pueda replicar su contenido de manera sencilla. Para esto nos sirven los contenedores.

Los contenedores incluyen todo lo necesario para que el software se ejecute, incluidas bibliotecas, herramientas de sistema, código y tiempo de ejecución, con la certeza de saber que su código se ejecutará.

Continuando con el ejemplo donde tenemos una imagen con una aplicación corriendo en el puerto 8080, podemos acceder desde distintos contenedores y puertos. No se está creando una imagen por cada contenedor, sino que el contenedor permite reutilizar la información de las imágenes, logrando el acceso desde diferentes puertos. Para este caso, como se muestra en la figura 4.0, existe una imagen definida para el puerto 3001, que se replica hacia los puertos 3000, 3001 y 3003.

Description here
Figura 4.0 La imagen expone el puerto 3001, donde se ejecuta la aplicación y mediante contenedor c1, c2 y c3 es posible replicar su contenido en los puertos 3002, 3003 y 8080.

Kubernetes

Si el número de aplicaciones crece en nuestro sistema, se dificulta la administración de nuestros contenedores. Docker no es suficiente, ya que necesitamos una coordinación para hacer el despliegue, la supervisión de servicios, el reemplazo, el escalado automático y, en definitiva, la administración de los distintos servicios que componen nuestra arquitectura.

En este punto, Kubernetes es la herramienta que nos ayuda con esta administración, haciendo uso de los elementos anteriormente mencionados: el Pod, ReplicaSet, Deploy, entre otros. En las siguientes secciones, explicamos cada uno de los elementos y cómo se van relacionando entre sí.

Pod

La unidad fundamental de despliegue en Kubernetes es el Pod. En este sentido, todos los contenedores dentro de un pod están instalados en un mismo equipo y se pueden comunicar entre ellos. A pesar de ser la unidad mínima de k8s, en realidad el Pod es un wrapper de un contenedor.

ReplicaSet

A partir de un Pod, un Replicaset se encarga de mantener un determinado número de réplicas del pod en el clúster. De esta manera el ReplicaSet asegura que un determinado número de copias del pod se encuentran en disponibles en el clúster en todo momento. Por tanto, si alguno de los pods es eliminado, el ReplicaSet se encarga de crear un nuevo pod.

Deployment

El Deployment añade la capacidad de poder actualizar la aplicación definida en un ReplicaSet sin pérdida de servicio, mediante actualización continua.

El Deployment se encarga de realizar la transición de la versión 1.0 a la 2.0 de forma que no haya interrupción del servicio. La estrategia de actualización puede definirse manualmente; pero sin entrar en detalles, Kubernetes se encarga de eliminar progresivamente las réplicas de la aplicación v1.0 y sustituirlas por las de la v2.0.

El proceso se hace de forma controlada, por lo que si surgen problemas con la nueva versión de la aplicación, la actualización se detiene y es posible realizar marcha atrás hacia la versión estable.

Aunque existen otros elementos en temas de k8s, de manera general esta es la forma en que se trabaja para administrar los contenedores. Cada capa de un deployment tiene actividades o responsabilidades específicas que permiten que una aplicación se ejecute sin interrupciones y siempre con una versión estable, o bien, la más actualizada.

Conclusión

En esta publicación hablamos de los conceptos más relevantes de Docker y Kubernetes y de cómo trabajan en conjunto. Kubernetes puede trabajar con otros runtimes de contenedores, pero aquí se mencionó Docker por ser uno de los más utilizados.

El desarrollo de software utilizando estas herramientas simplifica el proceso de programación, sobre todo en el momento que cada desarrollador tiene su propia máquina con características distintas. Cada uno podría tener una versión distinta en su local a la que se ejecuta en producción, lo que provoca un mantenimiento tedioso, entre otras dificultades. Haciendo uso de Docker, es posible tener al equipo trabajando sobre el mismo ambiente, bajo las mismas condiciones.

Trabajar con Docker y Kubernetes permite ejecutar tu aplicación en cualquier computadora, utilizando la infraestructura ideal, disponible en todo momento. Todas estas características hacen posible que Docker y k8s sean tan aceptadas por la comunidad al manejar infraestructura basada en contenedores.

Es posible que no muchos usuarios estén familiarizados con el uso de las herramientas; pero sabemos que la actualización en el entorno de tecnologías es fundamental para generar un factor de impacto entre las empresas. ¡Dale una oportunidad a k8s!

--

--