leanmind logo leanmind text logo

Blog

BDD

Behaviour-driven Development es una técnica para tomar mejores requisitos de producto.

Introduccion a K8s

Por Airan Sánchez Brito

Introducción

Recientemente nos hemos visto en la necesidad de aprender desde cero Kubernetes (k8s en adelante) para el trabajo en el colaborador. Por esa misma razón, se nos ocurrió resumir de la manera más simple y breve lo que es k8s y cómo se puede utilizar.

¿Y que mejor manera que con ejemplos? Vamos a ir paso a paso levantando un clúster de k8s, creando un deployment y exponiéndolo para acceder desde el navegador. Pero primero…

¿Qué es k8s?

Kubernetes es una herramienta para la orquestación y gestión de contenedores, que simplifica la implementación, escalabilidad y administración de aplicaciones en entornos de contenedores. Además, también permite la automatización de despliegues, la gestión de recursos, la escalabilidad automática, la recuperación ante fallos, el balanceo de carga, y facilita la administración y monitoreo de aplicaciones en entornos de contenedores, lo que lo convierte en una plataforma versátil para la gestión de aplicaciones en la nube.

💭 Kubernetes recibe comúnmente el alias k8s porque entre la K y la S de la palabra kubernetes hay 8 letras 🤯

¿Cómo está estructurado k8s?

Pues siendo escuetos, podemos fijarnos en el siguiente esquema, que resume un poco cada una de las diferentes partes que nos podemos encontrar a grandes rasgos:

CleanShot 2023-09-20 at 13.24.40@2x

Un clúster es un conjunto de nodos que trabajan juntos para gestionar aplicaciones y contenedores. Éstos facilitan la orquestación, escalabilidad y alta disponibilidad para las aplicaciones.

Un nodo es una máquina física o virtual dentro de un clúster. En ellos se permite el alojamiento de pods y contenedores de docker.

Un contenedor es una instancia de una aplicación con sus dependencias. Cualquier app que esté dockerizada estará en un contenedor de k8s.

Por último, pero no menos importante, un pod es la unidad más pequeña desplegable en k8s. Puede representar un grupo de uno o más contenedores, que comparten el mismo espacio de red y almacenamiento. Puede albergar varios contenedores, pero normalmente nos solemos encontrar 1 pod en 1 contenedor.

Instalando K8s

Teniendo Docker Desktop instalado, nos iremos a los ajustes > Kubernetes > Enable Kubernetes

CleanShot 2023-09-20 at 14.00.38

Si nos aseguramos que el checkbox está activado, tendremos k8s listo para ser utilizado. Sin embargo, no tenemos forma de interactuar con k8s ahora mismo. Dependemos de un CLI de k8s que nos permita interactuar con los contenedores, pods y demás partes → kubectl

Si tenemos brew como instalador, ejecutaremos lo siguiente:

brew install kubectl

Si no, podemos seguir el tutorial de la página oficial de Kubernetes para instalarlo en nuestro sistema preferido.

Con esto, ya podemos hacer comandos como kubectl get pods o kubectl describe services, los cuales respectivamente, nos permiten obtener una lista de los pods y obtener más información de nuestros servicios. Sin embargo, nada nos va a funcionar, ya que no tenemos ningun clúster en local donde poder levantar nuestras aplicaciones…

Minikube al rescate 🦸

Minikube es una herramienta que permite ejecutar un clúster de Kubernetes localmente en una máquina de desarrollo, lo que facilita la creación, prueba y desarrollo de aplicaciones Kubernetes en un entorno de una sola máquina.

Con brew lo podemos instalar ejecutando lo siguiente:

brew install minikube

Lo mismo de antes, si quieres otra plataforma te recomiendo la guía oficial 👍
Una vez instalado, la forma más básica para levantarlo es con:

minikube start

También le podemos especificar el tipo de engine que queremos utilizar:

minikube start --driver=docker (vmware, hyperkit, parallels virtualbox...)

Y automáticamente nos debería ir cargando poco a poco lo siguiente:

CleanShot 2023-09-20 at 14.19.12

¡Ya tenemos en local un clúster de k8s listo! Ahora podemos indagar un poco en lo que instalamos previamente con kubectl. Por ejemplo:

kubectl get services

Y nos debería salir algo como esto:
CleanShot 2023-09-24 at 19.11.13

Arrancando los motores de Nginx

Ahora viene lo chulo :sunglasses:. La potencia de kubernetes es la facilidad con la que en base a imágenes de Docker, (como cualquiera que te puedas encontrar en DockerHub) se pueden crear pods con dichas imágenes y gestionarlo como desees.

Nos vamos a crear un pod con la imagen base de Nginx con el siguiente comando:

kubectl run nginx-test --image=nginx

CleanShot 2023-09-24 at 19.17.18

Y para ver nuestro super mega pod:

kubectl get pods

CleanShot 2023-09-24 at 19.18.08

La propiedad que dice Ready indica los contenedores en ejecución de todos los disponibles. Como solo tenemos 1 disponible debemos crear deployments para aumentar ese número. ¿Cómo?

Un deployment indica a k8s como crear o modificar instancias de los pods que contienen aplicaciones dockerizadas. Los podemos crear con el siguiente comandito:

kubectl create deployment nginx-deployment-test --replicas=5

CleanShot 2023-09-24 at 19.25.05

Acabamos de crear un deployment con 5 instancias, es decir, 5 pods con la misma aplicación en ejecución. De este modo si se nos cae alguna, hay otras 4 en funcionamiento que cubren la que se ha caído.

kubectl get deployments

CleanShot 2023-09-24 at 19.26.32

¿Qué es lo bueno de crear un deployment? Que siempre vamos a mantener 5 pods. Vamos a hacer la prueba de borrar 1 pod:

CleanShot 2023-09-24 at 19.31.37

Vale, todo genial, pero ¿qué estoy haciendo con Nginx? Calma pueblo, ya lo tenemos funcionando, pero para acceder a la clásica página de “Welcome to Nginx!” debemos exponer ese deployment.

Ahora mismo tenemos todo de manera interna, ejecutándose en una máquina virtual. Recordemos que k8s permite crear máquinas virtuales con todo lo que ello implica. Las direcciones IP que exponen esos pods son internas, no accesibles desde tu pc directamente. Para eso hay que exponer un deployment. Normalmente ejecutaríamos el siguiente comando:

kubectl expose deployment nginx-deployment-test --port=8080 --target-port=80 --type=NodePort

Pero como estamos usando minikube, usaremos un comando para aprovechar esta herramienta y ejecutaremos lo siguiente:

minikube service nginx-deployment-test --url

CleanShot 2023-09-24 at 19.47.20

Y si accedemos a esa URL tendremos nuestro premio 🏆:

CleanShot 2023-09-24 at 19.48.01

k8s no se reduce a usar esos comandos, hay un mundo por detrás mucho más grande de lo que creemos. Es personalizable al 100% y se pueden hacer muchas más cosas como definir pods que son de otro tipo como LoadBalancer, ClusterIP…etc.

He oído algo de k9s ¿Qué es?

No es kubernetes 2, lo siento. Es un CLI que proporciona de manera cómoda y visual la gestión de los clústeres de k8s. Es bastante útil a la hora de interactuar con los pods, containers, services, pvc (volúmenes), etc.

A título personal, me parece muy sencillo su uso, ya que es más rápido que aprenderse los comandos de kubectl, pero tampoco me parece mal que para introducirnos en el mundo de k8s nos aprendamos lo básico de kubectl.

Lo podemos instalar con:

brew install k9s

O como siempre, con la alternativa oficial 😉

Y al abrirlo escribiendo en la terminal k9s veremos lo siguiente:

CleanShot 2023-09-24 at 20.04.45

Podemos acceder escribiendo :deployments o :services, a la vez que en la parte superior se nos muestran opciones para poder ver los logs de los pods, exponer servicios desde una interfaz gráfica o ver en tiempo real el estado de cada pod. Muy recomendable si has llegado hasta aquí que lo uses 👌

Muchas gracias por llegar hasta aquí, espero que la guía te haya servido para, al menos, entender un poco más lo que es kubernetes y cómo funcionan sus entrañas. En la siguiente reunión que tengas con los del equipo de DevOps seguro que estarán muy contentos contigo 🙌.

Publicado el 27/12/2023 por

¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.

Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?

Impulsamos el crecimiento profesional de tu equipo de developers