Kubernetes - conceptos básicos

¿Que es kuberentes?


Este artículo en Inglés.


Kubernetes es una herramienta muy buena para manejar aplicaciones en contenedores en minutos, siendo capaz de:

  • Desplegar nuestra aplicación rápidamente y de manera predecible.

  • Escalar nuestra aplicación al vuelo.

  • Liberar nuevas versiones de manera fluida

  • Optimizar los recursos de hardware al usar solo lo que necesitamos.

Para realizar todas estas actividades kubernetes se basa en el núcleo del sistema operativo y en una funcionalidad particular de los sistemas operativos soportados llamada virtualización. Esto es lo que hace posible modularizar y aislar una aplicación para que luego pueda ser ejecutada en varios hosts sin pérdida considerable de rendimiento.


Data esta arquitectura y siguiendo el patrón de separación de responsabilidades, cada contenedor deberá tener específicamente una responsabilidad, y de esta manera los fallos pueden ser identificados más fácilmente y también se pueden reemplazar contenedores por otros que realicen la misma funcionalidad prácticamente sin fricción.
Asimismo cada contenedor deberia tener su equipo responsable para de esta manera mantener enfocados a los equipos en únicamente sus responsabilidades.

Por otro lado va a ser Kubernetes quien se encarga de levantar, monitorear y mantener la salud de todo el proyecto y los nodos involucrados buscando siempre conservar el estado deseado. Esto significa que no solo puede identificar que algo anda mal, sino que también lo arregla o intenta fuertemente arreglarlo.

Hablando sobre un ejemplo, es posible definir un contenedor para una aplicación que hayamos construido y además definir un contenedor para cada dependencia

  • Contenedor con un servidor node.js

  • Contenedor con PostgreSQL

  • Contenedor con Redis

  • Contenedor de datos que va a utilizar node.js (nuestra aplicación)

Kubernetes utiliza un concepto llamado pods para agrupar estas dependencias en una unidad que va a representar a la aplicación y de hecho van a ser levantados en el mismo host compartiendo:

  • ip (localhost)

  • memory

  • volúmenes

Facilitando muchísimo la integración de las dependencias y la distribución de las mismas. A este pod lo podemos pensar como nuestra aplicación completa.

Una vez que tenemos nuestros pods configurados, el último paso mínimo es configurar el archivo de deployment que es donde vamos a especificar la cantidad de réplicas en el sistema además de algunos otros parámetros de metadata como nombre, versión y categoría del deploy.

Teniendo estos conceptos en mente ya estamos preparados para poder correr nuestro primer servidor con Kubernetes.

Para especificar el archivo de deployment se utiliza el formato YAML y trabajando en un ejemplo bien sencillo con un servidor nginx, el archivo myserver.yaml sería el siguiente:

apiVersion: extensions/v1beta1 kind: Deployment
metadata:
name: my-nginx spec:
replicas: 2 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80

Aqui como solo tenemos un pod se especifica directamente bajo el tag "template" y los pods van a heredar el nombre del deploy. Lo mismo sucede con el contenedor ya que en este ejemplo utilizamos la imagen oficial de nginx.

Para levantar nuestro ejemplo debemos ejecutar:

$ kubectl create -f ./myserver.yaml deployment "my-nginx" created

Con esto tenemos nuestro primer contenedor corriendo gracias a Kubernetes! y mucho más ya que Kubernetes también hace un monitoreo del mismo y en caso de fallos mantiene la instancia además de muchas otras características que vamos a ir viendo en el futuro como labes, el dashboard, etc.



Article by: Alfredo Levy at Bixlabs, Uruguay