--- title: "Cómo instalar y configurar MicroK8s en Ubuntu 24.04" description: "Instala MicroK8s con snap en Ubuntu 24.04, activa los addons de DNS, almacenamiento, métricas e Ingress, une más nodos al clúster y despliega una aplicación." category: "Kubernetes Avanzado" language: es source: https://cubepath.com/es/docs/kubernetes-avanzado/instalacion-y-configuracion-de-microk8s updated: 2026-09-25 --- # Cómo instalar y configurar MicroK8s en Ubuntu 24.04 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: ```bash 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: ```bash 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: ```bash sudo microk8s status --wait-ready ``` ```output 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: ```bash 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`: ```bash microk8s kubectl get nodes ``` ```output NAME STATUS ROLES AGE VERSION microk8s1 Ready 3m v1.3x.x ``` MicroK8s incluye su propio `kubectl`, que se invoca como `microk8s kubectl`. Para escribir solo `kubectl`, crea un alias de snap: ```bash sudo snap alias microk8s.kubectl kubectl ``` Si prefieres usar un `kubectl` instalado aparte, o administrar el clúster desde tu equipo, exporta el kubeconfig: ```bash 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`: ```bash 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: ```bash kubectl get storageclass ``` ```output 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: ```bash kubectl top nodes ``` ```output 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-storage` guarda 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: ```bash kubectl create deployment web --image=nginx:stable --replicas=2 kubectl expose deployment web --type=NodePort --port=80 ``` Comprueba los pods y el puerto asignado: ```bash kubectl get pods -l app=web kubectl get service web ``` ```output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.152.183.140 80:31742/TCP 15s ``` Haz una petición al puerto que aparece después de `80:` (en el ejemplo, `31742`): ```bash curl -s http://localhost:31742 | grep -i title ``` ```output Welcome to nginx! ``` ## 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: ```bash microk8s enable ingress ``` Abre los puertos en el firewall: ```bash 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: ```bash kubectl get ingressclass ``` ```output NAME CONTROLLER PARAMETERS AGE nginx k8s.io/ingress-nginx 30s public k8s.io/ingress-nginx 30s ``` Crea el Ingress. Sustituye `your_domain` por tu dominio y, si tu salida es distinta, `public` por la clase que te haya aparecido: ```bash nano web-ingress.yaml ``` ```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: ```bash kubectl apply -f web-ingress.yaml curl -s -H "Host: web.your_domain" http://your_server_ip | grep -i title ``` ```output Welcome to nginx! ``` ## 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: ```bash 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: ```bash microk8s add-node ``` ```output 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: ```bash sudo microk8s join 10.0.0.10:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05 --worker ``` Verifica el clúster desde el primer nodo: ```bash kubectl get nodes -o wide ``` ```output NAME STATUS ROLES AGE VERSION INTERNAL-IP microk8s1 Ready 40m v1.3x.x 10.0.0.10 microk8s2 Ready 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: ```bash 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`.