19

Crea tu primer clúster y aprende Kubernetes con minikube

8688Puntos

hace 2 años

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).

¿Qué necesitas para seguir este tutorial?

¿Para qué usar K8s si mis contenedores corren bien solo con Docker?

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:

  • Tenemos muchos contenedores corriendo en máquinas distintas, y algunos de estos deben comunicarse entre sí.
  • Debemos actualizar versiones de las imágenes corriendo y es necesario escalar o reemplazar máquinas con contenedores, que por diversos motivos, puedan fallar.

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.

¿Qué es esto de “clúster” y qué tiene que ver con Kubernetes?

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:

  • Los nodos del plano de control, donde se administra el resto del clúster y se asegura que se cumpla el estado deseado que describamos.
  • Los nodos trabajadores, donde se corren las aplicaciones que el usuario quiera mantener, como páginas web, bases de datos o aplicaciones.

En esta imagen lo puedes entender mejor:

Untitled.png

Imagen adaptada de https://blog.coderise.io/wp-content/uploads/2018/01/kubernetes-pods.png

¿Por qué usar minikube?

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.

Pasos para instalar minikube

Puedes ver la sección que corresponda a tu sistema operativo

Windows

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

macOS

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

Linux

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

Creemos nuestro primer clúster

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í:
1.png

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)

https://i.giphy.com/media/7pHTiZYbAoq40/giphy.gif

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:

2.png

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)- o minikube 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.

3.png

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.

4.png

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

5.png

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, usa minikube stop y luego minikube start para reiniciar el clúster y vuelve a intentar con minikube 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:

6.png

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:

7.png

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:

8.png

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:

9.png

Y con esto ya hemos desplegado nuestra primera aplicación en un clúster de Kubernetes y expuesto la misma al mundo 🥳🎉

Otros comandos útiles

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.

¿Cómo sigo aprendiendo?

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.

Juan José
Juan José
Juanjo

8688Puntos

hace 2 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
4
21643Puntos

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

2
27330Puntos

TLDR.

Les comparto dos vídeos que hice para levantar clusters de alta disponibilidad.

K0s

RKE

2

Hola Juan José, muchas gracias por compartir tu conocimiento en kubernetes.
Consulta, como detengo el servicio y elimino todo lo creado?

1
8688Puntos
2 años

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 con minikube delete

1
16681Puntos

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?

1
8688Puntos
2 años

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.