Kubernetes -abreviado como K8s debido a que hay 8 letras entre la k y la s- se define a sí mismo como una plataforma de código abierto para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores.
Esta es una de las tecnologías más amadas y que despiertan mayor interés en los desarrolladores, según la última encuesta de desarrolladores de Stack Overflow. Pero también, puede ser algo difícil de aprender al inicio.
Por eso, en este blog aprenderemos a montar nuestro primer clúster de K8s en nuestro computador, usando una implementación sencilla, llamada minikube, que es mantenida por Google (los creadores de Kubernetes).
Docker es una gran tecnología que funciona perfecto por sí misma. Pero cuando nuestras aplicaciones crecen y empezamos a atender a más usuarios; se llega a una escala mucho más exigente. Esto pasa cuando:
Por eso, Kubernetes surge ante la necesidad de manejar de forma efectiva todo lo anterior. K8s orquesta la infraestructura de cómputo, redes y almacenamiento de una arquitectura de contenedores para que tú como desarrollador no tengas que hacerlo.
Es el nombre que recibe el conjunto de “nodos” que Kubernetes administrará. Los nodos pueden ser máquinas reales o virtuales en las cuales corren distintos pods.
En estos pods, se pueden encontrar uno o más contenedores donde corren distintas aplicaciones. Existen dos tipos de nodos:
En esta imagen lo puedes entender mejor:
Imagen adaptada de https://blog.coderise.io/wp-content/uploads/2018/01/kubernetes-pods.png
Como leímos en la descripción que se da a sí mismo Kubernetes, esta es una plataforma de código abierto, lo que significa que es una base a partir de la cual otras personas y proyectos pueden tomar y modificar según sus necesidades.
En sí mismo, instalar Kubernetes tal cual desde su código base es algo complicado y requiere de altos conocimientos; debido a esto, han surgido opciones que hacen todo el trabajo difícil por nosotros y nos permiten, por medio de ciertos comandos, levantar un clúster.
Lo más común es utilizar un proveedor de servicios cloud como AWS, Google Cloud Platform o Azure, los cuales se encargan de realizar la configuración de los nodos y del plano de control para que los usuarios solo tengan que crear los archivos de configuración donde declaren el estado deseado de su clúster y las aplicaciones que planean desplegar.
Pero esto usualmente viene asociado con un costo para el usuario que no valdría la pena si apenas está aprendiendo.
Otra opción es usar algunas “aplicaciones” o implementaciones de Kubernetes de forma local como son Kubeadm, K3s, Kind, MicroK8s, Minikube, entre otros.
En este caso, emplearemos Minikube debido a que es la manera más rápida y fácil de producir un clúster de K8s; de igual forma es mantenida por Google y la Cloud Native Foundation, quienes también mantienen el estándar Kubernetes.
Es importante anotar que Minikube no está optimizada para uso en un ambiente de producción donde se requiere una alta disponibilidad y rendimiento; es más que todo para realizar pruebas y aprender todo lo necesario de K8s.
Puedes ver la sección que corresponda a tu sistema operativo
Puedes descargar el instalador del siguiente link, te recomiendo descargarlo directamente sobre el disco duro C (C:\
), luego debes abrir este archivo y seguir los pasos del instalador.
Una vez instalado, es necesario agregar el binario de minikube.exe
al PATH
. Para esto corre PowerShell como administrador en tu computador y escribe el siguiente comando:
$oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
if ($oldPath.Split(';') -inotcontains 'C:\minikube'){ [Environment]::SetEnvironmentVariable('Path', $('{0};C:\\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine)
}
Nota: Si descargaste el instalador en otro lugar, recuerda cambiar la ubicación de este en el comando anterior.
Otra alternativa es mediante el administrador de paquetes de Windows (winget) que viene instalado de forma predeterminada en Windows 11 y las últimas versiones de Windows 10. Si ya lo tienes, solo debes escribir el siguiente comando en la terminal de PowerShell o CMD winget install minikube
Puedes descargar e instalar el binario de minikube directamente desde tu terminal con los siguientes comandos:
Si tienes un procesador Intel
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
Si tienes un procesador M1
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube
Si tienes instalado brew, puedes usar el siguiente comando brew install minikube
Puedes descargar e instalar el binario de minikube directamente desde tu terminal con los siguientes comandos:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
Si usas una distribución basada en Debian (Debian, Ubuntu, Kali, etc.), puedes usar los siguientes comandos:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb
Para esto, en nuestra terminal debemos escribir minikube start
. La primera vez puede tardar un poco, mientras descarga todo lo necesario para funcionar. En este punto se verá así:
Internamente, esto crea un contenedor o máquina virtual para simular nuestro clúster, por esto era necesario tener instalado Docker o algún manejador de máquinas virtuales. En mi caso, tenía instalado Docker, así que usó este de forma predeterminada.
💡 (Sí, estamos usando Docker para correr los nodos del clúster que internamente tienen otros contenedores que son los que manejaremos con Kubernetes)
Ya tenemos listo nuestro primer clúster de Kubernetes, en este caso es un clúster de un solo nodo que podemos ver si corremos docker ps
para ver los contenedores corriendo:
De igual forma podemos verificar el estado de nuestro clúster con la CLI de minikube
. Es la que utilizamos cuando escribimos minikube start
.
Con esta podemos emplear comandos como
minikube profile list
que nos listará los clústeres que tengamos configurados -profile es el nombre que se le damos a cada clúster al generarlo (siendo el predeterminado minikube)- ominikube status
que muestra el estado de los nodos del clúster predeterminado.
También podemos utilizar kubectl
, que es la CLI con la cual se administra Kubernetes, (esta es parte del estándar de K8s y se emplea independiente de la implementación usada).
Un ejemplo de un comando que podemos usar es kubectl get nodes
con el cual vemos los nodos del clúster predeterminado.
Con esto podemos ver que el clúster solo tiene un nodo y que este es un nodo del plano de control.
Si queremos agregar un nodo tipo trabajador nuevo, para agregarle contenedores y correr nuestras aplicaciones, podemos usar el comando minikube node add
.
Como vemos ya, nuestro clúster ha crecido y está listo para que despleguemos nuestra primera aplicación. Pero antes veremos otra funcionalidad que nos permite minikube, un dashboard web para monitorizar nuestro clúster desde una interfaz más amigable.
Este se lanza con el comando
minikube dashboard
Nota: Si la terminal se te queda congelada en “🤔 Verifying proxy health …“ puede ser un error causado por agregar un nodo después de iniciado el clúster. Para el proceso presionando
CTRL/CMD + C
(dependiendo de si usas Windows/Linux o Mac); luego, usaminikube stop
y luegominikube start
para reiniciar el clúster y vuelve a intentar conminikube dashboard
.
Si damos clic en la URL, se abrirá esta página en nuestro navegador y desde ahí podremos ver información sobre nuestro clúster:
Ahora sí, podemos usar los siguientes comandos para desplegar la primera aplicación en nuestro clúster
kubectl create deployment hello-minikube --image=[k8s.gcr.io/echoserver:1.4](http://k8s.gcr.io/echoserver:1.4)
kubectl expose deployment hello-minikube --type=NodePort --port=8080
Luego de esto, podemos correr kubectl get services hello-minikube
para comprobar que se ha creado correctamente el servicio:
Ahora solo falta exponer este servicio para que podamos accederlo desde nuestro navegador, lo podemos hacer con kubectl port-forward service/hello-minikube 8080:8080.
Si abrimos nuestro navegador y vamos a http://localhost:8080/ veremos que nuestra aplicación está corriendo:
Esta es una aplicación básica que solo muestra los detalles de las peticiones que se hacen a ella, si hacemos un cURL veremos lo siguiente:
Y con esto ya hemos desplegado nuestra primera aplicación en un clúster de Kubernetes y expuesto la misma al mundo 🥳🎉
Parar y continuar el clúster sin impactar las aplicaciones desplegadas:
minikube pause # Pausar el clúster sin impactar las aplicaciones.
minikube unpause # Reanudar el clúster.
minikube stop # Parar el clúster, acabando de paso las aplicaciones.
minikube addons list # Listar plugins que podemos añadir al clúster.
minikube start -p <nombre> # Iniciar un nuevo clúster con un nombre dado por nosotros.
minikube start --nodes <n> # Iniciar un nuevo clúster con un número dado de nodos.
minikube start --=kubernetes-version=v1.21.1 # Iniciar un clúster con una versión de K8s determinada.
minikube profile list # Listar todos los clústeres creados.
minikube profile <nombre> # Cambiar el clúster predeterminado por otro dado su nombre.
minikube delete --all # Eliminar todos los clústeres creados.
Con esto ya creamos nuestro primer clúster de Kubernetes con el que podemos probar y hacer en este lo que queramos.
Este puede ser el primer paso para que te conviertas en un maestro de Kubernetes y logres a desplegar aplicaciones redundantes masivas con alta disponibilidad.
Si te interesa seguir aprendiendo más conceptos como estos, te invito a que conozcas nuestro curso de Kubernetes. Allí aprenderás que los clústeres de K8s se configuran mediante archivos declarativos, aprenderás qué son deployments, volúmenes, RBAC, balanceo de carga, replica sets, namespaces, entre muchas otras cosas.
De igual forma, puedes revisar la documentación oficial de K8s. Aunque lo más importante es que sigas practicando e investigando hasta donde te lleve tu deseo de nunca parar de aprender.
Muchas gracias Juan, justo estoy trabajando en un proyecto con Kubernetes sin duda es una herramienta super poderosa y compleja a mi parecer.
Quiero agregar este material como referencia para comprender mas a fondo este tema de Kubernetes: Kubernetes Patterns
TLDR.
Les comparto dos vídeos que hice para levantar clusters de alta disponibilidad.
K0s
RKE
Hola Juan José, muchas gracias por compartir tu conocimiento en kubernetes.
Consulta, como detengo el servicio y elimino todo lo creado?
Para detenerlo basta con un simple ctrl/cmd (dependiendo de si usas Windows/Linux o Mac) + C. Para eliminar lo creado, primero detienes el clúster con
minikube stop
y luego se elimina conminikube delete
Magistral. Duda, desconozco Dockers pero sé algo de ambientar VM en nube y localmente. También sé de desplegado de aplicaciones, ¿es necesario conocer Dockers?
No es obligatorio entenderlo 100%, pero es bueno tener unas bases para entender mejor lo que estamos manejando con Kubernetes que al final son contenedores.