MicroK8s es la distribución de Kubernetes de Canonical que se instala como un paquete snap e incluye todos los componentes del clúster en un único servicio. Las funciones adicionales, como almacenamiento, Ingress o métricas, se activan como addons con un solo comando. En este tutorial instalarás MicroK8s en Ubuntu 24.04, activarás los addons más útiles, desplegarás una aplicación de prueba y unirás un segundo nodo al clúster.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath. Para la parte de clúster necesitarás un segundo servidor (y un tercero si quieres alta disponibilidad).
- Un usuario no root con privilegios
sudo. - Al menos 4 GB de RAM y 20 GB de disco libres. MicroK8s funciona con 2 GB, pero con los addons activados deja muy poco margen para tus aplicaciones.
snapd, que viene instalado por defecto en Ubuntu 24.04.
Paso 1: Instalar MicroK8s
Consulta primero los canales disponibles. Cada canal corresponde a una versión menor de Kubernetes (por ejemplo 1.xx/stable) y el snap se actualiza automáticamente solo con los parches de ese canal:
snap info microk8s | sed -n '/channels:/,$p' | head -15
Instala MicroK8s. Sin --channel se instala el canal stable más reciente; si quieres fijar una versión concreta, añade --channel=1.xx/stable con la versión que hayas elegido de la lista anterior:
sudo snap install microk8s --classic
La opción --classic es necesaria porque MicroK8s necesita acceso completo al sistema para gestionar contenedores y red. Espera a que todos los componentes estén listos:
sudo microk8s status --wait-ready
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
dns # (core) CoreDNS
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
disabled:
...
Paso 2: Usar MicroK8s sin sudo
MicroK8s crea el grupo microk8s. Añade tu usuario a ese grupo y prepara el directorio de configuración de kubectl:
sudo usermod -a -G microk8s "$USER"
mkdir -p ~/.kube
chmod 0700 ~/.kube
Cierra la sesión SSH y vuelve a entrar para que el cambio de grupo surta efecto (o ejecuta newgrp microk8s en la sesión actual). Después comprueba que puedes consultar el clúster sin sudo:
microk8s kubectl get nodes
NAME STATUS ROLES AGE VERSION
microk8s1 Ready <none> 3m v1.3x.x
MicroK8s incluye su propio kubectl, que se invoca como microk8s kubectl. Para escribir solo kubectl, crea un alias de snap:
sudo snap alias microk8s.kubectl kubectl
Si prefieres usar un kubectl instalado aparte, o administrar el clúster desde tu equipo, exporta el kubeconfig:
microk8s config > ~/.kube/config
chmod 600 ~/.kube/config
El archivo contiene credenciales de administrador del clúster: trátalo como una contraseña.
Paso 3: Activar los addons básicos
El addon dns (CoreDNS) ya viene activado. Activa además el almacenamiento local y metrics-server, que permite usar kubectl top:
microk8s enable hostpath-storage
microk8s enable metrics-server
hostpath-storage crea la StorageClass microk8s-hostpath, marcada como predeterminada, que guarda los volúmenes en /var/snap/microk8s/common/default-storage del nodo. Compruébalo:
kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
microk8s-hostpath (default) microk8s.io/hostpath Delete WaitForFirstConsumer false 40s
Tras uno o dos minutos, metrics-server empezará a devolver datos:
kubectl top nodes
NAME CPU(cores) CPU(%) MEMORY(bytes) MEMORY(%)
microk8s1 210m 10% 1450Mi 37%
Para ver todos los addons disponibles y su estado, ejecuta microk8s status. Cualquiera se desactiva con microk8s disable nombre_del_addon.
Advertencia
hostpath-storageguarda los datos en el disco de un único nodo y no los replica. En un clúster multinodo, un pod con un volumen de este tipo no puede moverse a otro nodo con sus datos.
Paso 4: Desplegar una aplicación de prueba
Crea un Deployment de Nginx con dos réplicas y exponlo con un Service de tipo NodePort, que abre un puerto alto en cada nodo:
kubectl create deployment web --image=nginx:stable --replicas=2
kubectl expose deployment web --type=NodePort --port=80
Comprueba los pods y el puerto asignado:
kubectl get pods -l app=web
kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.152.183.140 <none> 80:31742/TCP 15s
Haz una petición al puerto que aparece después de 80: (en el ejemplo, 31742):
curl -s http://localhost:31742 | grep -i title
<title>Welcome to nginx!</title>
Paso 5: Publicar la aplicación con Ingress
Para servir la aplicación por los puertos 80 y 443 con un nombre de dominio, activa el addon ingress, que despliega un NGINX Ingress Controller escuchando en esos puertos de cada nodo:
microk8s enable ingress
Abre los puertos en el firewall:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Consulta el nombre de la IngressClass que ha creado el addon; lo necesitarás en el manifiesto:
kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 30s
public k8s.io/ingress-nginx <none> 30s
Crea el Ingress. Sustituye your_domain por tu dominio y, si tu salida es distinta, public por la clase que te haya aparecido:
nano web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
ingressClassName: public
rules:
- host: web.your_domain
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
Aplícalo y pruébalo enviando la cabecera Host, sin necesidad de que el DNS esté configurado todavía:
kubectl apply -f web-ingress.yaml
curl -s -H "Host: web.your_domain" http://your_server_ip | grep -i title
<title>Welcome to nginx!</title>
Paso 6: Añadir nodos al clúster
MicroK8s forma clústeres con el comando add-node, que genera un token de un solo uso. Instala MicroK8s en el segundo servidor siguiendo el paso 1 (usa el mismo canal que en el primero) y permite el tráfico entre los nodos. La forma más sencilla es autorizar toda la subred privada; sustituye 10.0.0.0/24 por la tuya y ejecútalo en ambos nodos:
sudo ufw allow from 10.0.0.0/24
Entre los puertos que usa MicroK8s están 16443/tcp (API), 25000/tcp (agente de clúster), 19001/tcp (dqlite), 10250/tcp (kubelet) y 4789/udp (VXLAN de Calico).
En el primer nodo, genera el comando de unión:
microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 10.0.0.10:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05
Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 10.0.0.10:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 --worker
...
Ejecuta en el segundo nodo el comando que te haya mostrado. Con --worker el nodo solo ejecuta cargas de trabajo; sin él, también forma parte del plano de control:
sudo microk8s join 10.0.0.10:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 --worker
Verifica el clúster desde el primer nodo:
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP
microk8s1 Ready <none> 40m v1.3x.x 10.0.0.10
microk8s2 Ready <none> 60s v1.3x.x 10.0.0.11
MicroK8s activa la alta disponibilidad automáticamente cuando hay tres o más nodos del plano de control (unidos sin --worker). Con uno o dos, microk8s status sigue mostrando high-availability: no.
Para retirar un nodo, ejecuta primero sudo microk8s leave en el nodo que sale y después, en uno de los que se quedan, microk8s remove-node nombre_del_nodo.
Solución de problemas
microk8s status indica que no está en ejecución. Genera un informe de diagnóstico, que revisa servicios, red y configuración y guarda un tarball con los registros:
sudo microk8s inspect
Los avisos del informe (por ejemplo, reenvío IP desactivado) suelen indicar directamente la corrección.
El nodo no se une o aparece como NotReady. Comprueba que el puerto 25000 es accesible desde el nodo nuevo, que el token no se ha usado ya (genera uno nuevo con microk8s add-node) y que los nodos pueden resolver sus nombres de host entre sí. Si no hay DNS interno, añade cada nodo a /etc/hosts en todos los demás.
Los pods se quedan en Pending con un PVC. Asegúrate de que hostpath-storage está activado y revisa los eventos del PVC con kubectl describe pvc nombre_del_pvc.
Conclusión
Tienes MicroK8s funcionando en Ubuntu 24.04 con DNS, almacenamiento, métricas e Ingress, una aplicación publicada y un clúster de más de un nodo. Como siguientes pasos puedes añadir un tercer nodo del plano de control para tener alta disponibilidad, activar el addon cert-manager para emitir certificados TLS de Let's Encrypt, o activar registry para disponer de un registro de imágenes local en localhost:32000.
