Páginas

martes, 22 de marzo de 2022

Para qué sirve Kubernetes: un ejemplo

Para qué sirve Kubernetes.

El despliegue de aplicaciones está evolucionando para facilitar a los ingenieros del software la tarea. Parece una contradicción que los ingenieros no dispongan de los mejores productos software para suministrarles ayuda en su trabajo, pero haciendo honor al dicho “en casa de herrero, cuchillo de palo”.

En los orígenes, no hace demasiado tiempo, las aplicaciones eran monolíticas e incluían grandes áreas de funcionalidad. En estos momentos el despliegue era algo manual que no comportaba la misma problemática que actualmente, puesto que el despliegue de un sistema no interfería con otros. Cada sistema era estanco y auto-contenido y las dependencias entre sistemas eran mínimas.

Con el advenimiento del micro-servicio las cosas han cambiado. Ahora los sistemas no son obligatoriamente monolíticos, hay otras opciones. Un sistema se puede construir en numerosas pequeñas partes que tienen que colaborar para suministrar la funcionalidad completa. Esta forma de desarrollar sistemas contribuye a que los desarrolladores puedan ser más efectivos a la hora de incorporar nuevas funcionalidades a los programas y también para llevar a cabo su mantenimiento tanto de eliminación de errores como de incorporación de mejoras. No es aceptable hoy en día que un cambio en una aplicación sea largo y tedioso, las organizaciones necesitan que sus sistemas evolucionen al mismo ritmo que suceden los acontecimientos.

En este escenario, el despliegue de sistemas es el despliegue de sus pequeñas partes. Esas partes tienen que trabajar de forma orquestada como un equipo en el que cada parte hace lo que se espera de ella y de forma coordinada con el resto de las partes.

Entonces surge un problema que antes no existía, orquestar adecuadamente todas las partes o micro-servicios. Los micro-servicios tienen dependencias, en el mundo del desarrollo actual los programadores hacen uso de librerías para llevar a cabo funcionalidades ya resueltas y que han sido programadas por otros. Esto hace que normalmente un desarrollo dependa de las librerías en las cuales se apoya. Esto produce muchos quebraderos de cabeza a los ingenieros que tienen que desplegar software, porque si se despliegan dos sistemas que dependen de una misma librería esta librería tiene ser utilizada exactamente en la misma versión. En caso contrario surgen los problemas de incompatibilidades.

Para esto se ideó la tecnología de contenedores. En esta tecnología cada micro-servicio se empaqueta con sus librerías y hay automatismos (capas) que se encargan de controlar las versiones de las librerías comunes y otros elementos. En este ejemplo se va a utilizar Docker como tecnología de contenedores.

Con Docker no tenemos problemas dependencias, pero surgen problemas de gestión de los numerosos contenedores que tiene que manejar el equipo de operaciones. Cuantos contenedores están activos, que recursos consume cada uno, es necesario replicar alguno de ellos para que no se produzcan cuellos de botella, se ha caído alguno, están en la versión adecuada, es necesario dar marcha atrás en un despliegue, etc.

Para esta gestión viene al rescate Kubernetes.

Qué es Kubernetes.

Kubernetes también conocido como K8s es un sistema open-source para la automatización del despliegue, escalado y gestión de aplicaciones contenorizadas.

Un cluster Kubernetes está formado por componentes que sirven para gestionar un conjunto de máquinas llamadas nodos.

No se van a describir aquí todos los tipos de componentes que existen en Kubernetes. Solo se van a exponer aquellos componentes de los que hace uso el ejemplo que aquí se explica.

El componente de orden superior que se utiliza es el Deployment que representa un despliegue. En el ejemplo el Deployment tiene un Pod, un Service y varios ReplicaSet. Los Pod albergan contenedores, los ReplicaSet se encargan de mantener activas tantas copias de un pod como se hayan establecido. Los servicios exponen los pods, es decir los contenedores que incluyen como un servicio de red.

Para ilustrar los componentes que utiliza el ejemplo, se utiliza la siguiente figura:

Ejemplo de Uso de Kubernetes

Se crea un contenedor que incluye un servidor web nginx que muestra una página html. Para ello se realizan las siguientes acciones:

  1. Instalar Docker https://docs.docker.com/get-docker/
  2. Crear un contenedor Docker
    • Crear un contenedor Docker que incluye: un servidor web nginx, una página html, una hoja de estilos y dos imágenes. Para construir un contenedor hay que crear un fichero con nombre dockerfile que describe su contenido. En el caso del ejemplo:
      FROM nginx
      COPY pagina.html /usr/share/nginx/html
      COPY pagina.css /usr/share/nginx/html
      COPY LogoDocker.png /usr/share/nginx/html
      COPY LogoKubernetes.png /usr/share/nginx/html
    • En el directorio donde está el dockerfile se ejecuta el comando para crear el contenedorcon el comando:
      docker build -t containerprueba .
  3. Se publica en un registro de contenedores, para luego usarlo desde kubernetes. En este caso en: http://hub.docker.com con el nombre
    marisaafuera/containerprueba
  4. Instalar Minikube https://minikube.sigs.k8s.io/docs/start/ y arrancarlo. Minikube es una herramienta que administra maquinas virtuales en donde corre una instancia de Kubernetes en un solo nodo y es útil a efectos de aprendizaje y pruebas.
  5. Crear un deployment en kubernetes (se crean automáticamente el pod y el servicio) con el comando:
    kubectl create deployment containerprueba --image=marisaafuera/containerprueba
  6. Exponerlo en Kubernetes para que sea accesible con:
    kubectl expose deployment containerprueba --type=LoadBalancer --port=8090
  7. Ahora debería de funcionar http://localhost:8090/pagina.html, pero no funciona. Después de unas cuantas horas buscando por qué no funciona, al final con port forward funciona:
    kubectl port-forward pod/<nombre pod> 8091:80
  8. Para acceder a la aplicación contenorizada y kubernetizada:
  9. Minikube tiene un dashboard que da información sobre el entorno de ejecución y permite gestionarlo. Se arranca con minikube dashboard.

    Para terminar

    Este artículo explica en la práctica en qué consiste Kubernetes. La ventaja de utilizar una herramienta de este tipo es apoyar el despliegue de sistemas con software que ayude a los equipos de desarrollo y operaciones a dar mejor servicio a los usuarios. Automatizar el trabajo, si se hace correctamente ayuda a que las tareas repetitivas se hagan mejor y con menos errores.