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…
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 🤯
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:
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.
Teniendo Docker Desktop instalado, nos iremos a los ajustes > Kubernetes > Enable Kubernetes
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 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:
¡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:
Ahora viene lo chulo
.
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
Y para ver nuestro super mega pod:
kubectl get pods
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
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
¿Qué es lo bueno de crear un deployment? Que siempre vamos a mantener 5 pods. Vamos a hacer la prueba de borrar 1 pod:
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
Y si accedemos a esa URL tendremos nuestro premio 🏆:
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.
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:
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 🙌.
¿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?
Pero espera 🖐 que tenemos un conflicto interno. A nosotros las newsletter nos parecen 💩👎👹 Por eso hemos creado la LEAN LISTA, la primera lista zen, disfrutona y que suena a rock y reggaeton del sector de la programación. Todos hemos recibido newsletters por encima de nuestras posibilidades 😅 por eso este es el compromiso de la Lean Lista