MiniKube es quizás la principal opción para ejecutar Kubernetes en local, como parte de nuestro entorno de desarrollo, así como para pruebas e incluso para algunas tareas de CI/CD. Actualmente está disponible para Windows, Linux y macOS, así como para diferentes arquitecturas de procesador (ej: ARM), y es probablemente la forma más sencilla de arrancar un Cluster de Kubernetes, permitiendo opciones avanzadas como especificar la versión de Kubernets, integración con RBAC, convivencias de múltiples Clusters, soporte para varios Nodos, ejecución de Registry Docker, etc., además de ser extensible mediante Addons. Una herramienta fundamental hoy en día.
En este Post vamos a ver cómo instalar MiniKube en Windows 11, y cómo trastear un poco con él, ya que hoy en día es una pieza muy importante para desarrolladores (permitiendo trabajar con Kubernetes en local), pero también como entornos para pruebas de laboratorio. Importante el detalle de Kubernetes en local, ya que MiniKube está orientado a trabajar con el así, en local (no está pensado para que te conectes a una máquina remota que tenga MiniKube… que se puede hacer, pero es más complicado, y pierde la gracia).
Hay otras alternativas a MiniKube, como Kind, microK8s (de Canonical), ó k3s (una distribuición de Kubernetes muy ligera).
Instalar MiniKube sobre Windows 11
MiniKube tiene varias formas de ejecutarse, o dicho de otro modo, MiniKube permite utilizar diferentes Drivers. Hay varias opciones disponible, pero lo más habitual es utilizar Hyper-V, VirtualBox, o Docker, teniendo en cuenta que Windows 11 Home no soporta Hyper-V (pero si VirtualBox y Docker) mientras que Windows 11 Pro soporta todos (Hyper-V, VirtualBox, Docker, y el resto de opciones). Para más info: MiniKube – Drivers
Para nuestro laboratorio, partimos de una máquina con Windows 11 Home, con Docker Desktop y VirtualBox ya instalado, sobre la que vamos a instalar MiniKube para crear un Cluster con el Driver de Docker.
La instalación de MiniKube es bastante sencilla, básicamente consiste en descargarse el ejecutable y dejarlo en una ruta (ej: C:\minikube) que esté definida dentro de la variabla de entorno PATH (ej: añadir C:\minikube a la variable PATH del sistema, a nivel de Computer, no de Usuario, y reiniciar) para que esté siempre disponible, indiferentemente de en qué ruta estémos posicionados. Está bastante detallado en la doc de MiniKube: MiniKube – Get Started
Crear un Cluster de MiniKube con el Driver de Docker
Una vez que hemos instalado MiniKube y reiniciado nuestra máquina para que tome efecto el cambio en el PATH, podemos utilizar el comando minikube desde una ventana de Terminal, así que, vamos a crear nuestro primer Cluster de MiniKube. Para ello, utilizaremos el comando minikube start, especificando que queremos utilizar el Driver de Docker, y luego vamos a comprobar la conexión a nuestro Cluster. Esto lo haremos ejecutando los siguientes comandos. Si quisiéramos utilizar VirtualBox o Hyper-V, bastaría con tenerlos instalados y especificar el driver correspondiente en el comando minikube start, fácil y sencillo 🙂
minikube start --driver=docker
kubectl cluster-info
kubectl get all
Ya tenemos nuestro Cluster de Kubernetes en local, para trastear lo que queramos sin romper nada !!!
Si comprobamos los contenedores que estamos ejecutando ahora mismo con el comando docker ps, veremos que tenemos sólo uno, que se llama minikube. Ese contenedor simula ser un Nodo en el que se ejecuta un Cluster de Kubernetes de un único Nodo, y sobre el que corren los diferentes contenedores de Kubernetes (tanto los del sistema como las aplicaciones que instalemos nosotros). Es decir: Docker-on-Docker.
Podemos utilizar el comando minikube ssh para conectarnos por SSH a nuestro Cluster de Kubernetes (por lo tanto, nos estaremos conectando a dicho contenedor…. pero si estuviéramos utilizando el Driver de Hyper-V o el de VirtualBox, nos estaríamos conectando a la máquina virtual que instala por detrás). Una vez conectados por SSH, podemos comprobar con el comando docker ps, que ahí dentro se ejecutan varios contenedores, que son los que utiliza Kubernetes para funcionar (los contenedores del sistema, como el apiserver o coredns) más las aplicaciones que instalemos nosotros en nuestro Cluster de Kubernetes. Esto lo podemos comprobar con los siguientes comandos.
docker ps
minikube ssh
docker ps
exit
También podemos comprobar con el comando kubectl, los diferentes nodos del Cluster y sus principales propiedades, por ejemplo ejecutando los siguientes comandos.
kubectl get nodes
kubectl get nodes -o wide
Creando objetos en MiniKube
Para continuar probando nuestro Cluster de MiniKube, vamos crear un Deployment de NGINX, y un Service para poder acceder a el y comprobar que funciona OK. Sin embargo, como estamos trabajando con MiniKube, después de crear el Service, tendremos que utilizar el comando minikube service para crear un tunnel y poder acceder desde el navegador, ya que la IP del Service no será accesible desde el navegador de nuestro portátil (es accesible desde los Nodos del Cluster de MiniKube, pero no directamente desde nuestro portátil). Para ello, ejecutaremos los siguientes comandos.
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80
kubectl get all
minikube service nginx
Otra forma de hacer accesible una aplicación que corre en MiniKube al exterior, es configurando port forward, de forma similar a como se muestra en el siguiente ejemplo (sin usar el comando minikube service).
kubectl port-forward service/nginx 8080:80
Algo que necesitaremos seguro es un Registry, que se ejecute sobre nuestro equipo para completar nuestro entorno de Desarrollo, que nos permita construir y subir nuestras imágenes Docker y que sea accesible desde nuestro portátil y desde MiniKube, para utilizar en MiniKube las imágenes Docker que desarrollamos en nuestros Proyectos. MiniKube nos ofrece un Registry como un Addon, que podemos activar, para tener un Registry en local accesible tanto desde nuestro portátil como desde MiniKube, y así poder compartir y probar nuestras imágenes Docker. Para ello, podemos activar el Addon del Registry de MiniKube y exponerlo a nuestra máquina mediante port-forward, de forma similar a como se muestra a continuación.
minikube addons enable registry
kubectl get service --namespace kube-system
kubectl port-forward --namespace kube-system service/registry 5000:80
Seguidamente tendremos que instanciar un contenedor que redireccione el tráfico, para que pueda funcionar correctamente y que el Registry sea accesible desde nuestro portátil y desde los Nodos de MiniKube.
docker run --rm -it --network=host alpine ash -c "apk add socat && socat TCP-LISTEN:5000,reuseaddr,fork TCP:host.docker.internal:5000"
Ahroa que ya tenemos disponible nuestro Registry tanto desde nuestro portátil como desde los Nodos de MiniKube, podemos tagear y subir una imagen al Registry, para crear después un Deploymet en MiniKube, que referencie a la imagen que acabamos de subir. Para ello, podemos ejecutar los siguientes comandos.
docker pull redis:7.0
docker tag redis:7.0 localhost:5000/redis:7.0
docker push localhost:5000/redis:7.0
kubectl create deployment redis --image=localhost:5000/redis:7.0
kubectl get all -o wide
Para más info sobre el Addon del Registry: MiniKube – Registries
Operaciones básicas con MiniKube
Ya hemos visto como crear un Cluster de MiniKube, cómo conectarnos por SSH al mismo, y como crear objetos en él y acceder a las aplicaciones o servicios que desplegamos en MiniKube para probarlas (minikube service). Pero hay más cosas que podemos hacer. Por ejemplo, también podemos pararlo, comprobar su estado, volver a arrancarlo, pausarlo, y reanudarlo.
minikube stop
minikube status
minikube start
minikube pause
minikube unpause
Podemos destruir (eliminar completamente) nuestro Cluster de MiniKube. En este caso no hay marcha atrás, si nos arrepentimos, tendremos que volver a crear y conifigurar otro desde cero (minikube start).
minikube delete
Podemos abrir el Dashboard de Kubernetes, que nos permitirá poder ver de forma gráfica y sencilla, los objetos y configuraciones que tenemos en Kubernetes, desde el navegador: deployments, services, config maps, secrets, namespaces, roles, etc.
minikube dashboard
MiniKube es extensible mediante Addons. Un ejemplo es el Dashboar de Kubernetes que acabamos de ver, pero hay muchos más, como el Registry que también vimos antes. Podemos mostrar los diferentes Addons disponibles, al igual que tenemos varios comandos para gestionar los Addons (enable, disable, configure, etc).
minikube addons list
minikube addons
Podemos mostrar la versión de MiniKube, así como mostrar los Logs de MiniKube, en caso de que necesitemos depurar algún problema que estemos teniendo.
minikube version
minikube logs
Ejecutando minikube (a secas, sin nada más), podemos ver los diferentes comandos que ofrece minikube, de tal modo, que si tenemos interés en conocer las opciones que ofrece alguno de ellos, podemos utilizar la opción -h.
minikube
minikube status -h
Hay muchas más cosas, pero con esto ya nos hacemos una idea.
Crear Clusters avanzados con MiniKube
Tenemos muchas opciones a valorar para crear un nuevo Cluster de MiniKube, como la posibilidad de tener varios Clusters, tener Clusters con múltiples Nodos, elegir qué versión de Kubernetes utilizar al crear el Cluster, activar la opción de RBAC, y más.
MiniKube nos permite crear varios Clusters que podemos ejecutar en paralelo (o quizás tener varios Clusters creados, aunque sólo tengamos arrancado uno en cada momento, el que necesitemos en cada instante), utilizando el mecanismo de perfiles (profiles) de MiniKube, lo que puede ser muy útil para arrancar varios Clusters con configuraciones distintas (ej: que usen una versión diferente de Kubernetes). En el siguiente ejemplo vemos cómo crear un segundo Cluster de MiniKube con una versión antigua de Kubernetes, para pruebas.
minikube profile
minikube start -p minikube-1-16-1 --kubernetes-version=v1.16.1
Ahora que tenemos varios Clusters de Kubernetes con MiniKube, podemos listar todos los perfiles existentes, ver cuál es el activo, y activar el perfil deseado en los comandos minikube, para asegurar que ejecutamos el comando en el Cluster correcto. Esto no permitiría apagar los Clusters que no queramos usar ahora, y arrancarlos de nuevo cuando los necesitemos, por ejemplo.
minikube profile list
minikube -p minikube status
minikube -p minikube-1-16-1 status
Cuando tenemos varios Clusters de Kubernetes, podemos cambiar la conexión actual (contexto) de kubectl al Cluster que deseemos en cada momento, así como ver las diferentes conexiones (contextos) que tenemos definidos. En nuestro caso, al tener dos Clusters con MiniKube en local, veremos que usan URLs diferentes en las que básicamente cambia el puerto que utilizan. Para ver y cambiar la conexión (contexto) de kubectl podemos utilizar comandos como los siguientes.
kubectl config get-contexts
kubectl config use-context minikube
kubectl config get-contexts
kubectl cluster-info
kubectl config use-context minikube-1-16-1
kubectl config get-contexts
kubectl cluster-info
Otro caso de uso habitual, es crear un Cluster de MiniKube con unos recursos de CPU y Memoria determinados, especialmente cuando utilizamos un Driver de máquina virtual como Hyper-V o VirtualBox, en cuyo caso será el tamaño de la máquina que lo respalda. Por ejemplo, en el siguiente comando creamos un Cluster de MiniKube de una versión de Kubernetes concreta, con unos recursos de memoria y CPU determinados.
minikube start -p minikube-1-18-1 --kubernetes-version=v1.18.1 --cpus=4 --memory=3000
minikube profile list
También podemos crear un Cluster de MiniKube con varios Nodos (MiniKube no está limitado a un único Nodo). A continuación se muestra como eliminamos todos los Clusters de MiniKube que hemos creado antes, para crear un nuevo Cluster de dos Nodos con el Driver de Docker, y comprobar cómo podemos ver tanto los dos contenedores Docker, como los dos Nodos y sus Pods con kubectl.
minikube delete --all
docker ps
minikube start --driver=docker --nodes 2
docker ps
kubectl get nodes -o wide
kubectl get pods --all-namespaces -o wide
Otro caso de uso que podríamos tener sería crear un Cluster de MiniKube con RBAC. A continuación mostramos un ejemplo de cómo se podría realizar.
minikube delete --all
docker ps
minikube start --extra-config=apiserver.authorization-mode=RBAC
Despedida y Cierre
Hay muchas cosas que podemos hacer con MiniKube, es una solución muy versátil, que permite no sólo ejecutarse sobre diferentes sistemas operativos, sino que ademas soporta diferentes arquitecturas de procesador, y diferentes formas de ejecutarse (Drivers), además de otras muchas opciones como las que hemos visto durante este Post. Es una herramienta fundamental, tanto para complementar nuestro entorno de Desarrollo, como para usarlo como entorno de pruebas que podamos arrancar y parar a nuestro antojo con las configuraciones que deseemos en cada ocasión.
Poco más por hoy. Como siempre, confío que la lectura resulte de interés.