Ya sabes qué hace Kubernetes, cómo está construido por dentro y qué significa cada término del vocabulario. Todo eso ha sido teoría necesaria, pero Kubernetes no se aprende leyendo: se aprende rompiendo cosas en un clúster propio. Esta lección tiene dos partes. Primero, un panorama honesto de las opciones reales para conseguir un clúster —local, autogestionado o gestionado en la nube— con criterios para elegir en un proyecto profesional. Y después, la guía práctica paso a paso para montar el clúster de prácticas que usarás durante los doce módulos del curso, donde desplegaremos la plataforma Rutas Norte. Al terminar tendrás un entorno funcional, sabrás pararlo, reanudarlo y destruirlo sin miedo, y conocerás las causas de los fallos de arranque más habituales.

Contenido

  1. Las tres vías para conseguir un clúster
  2. El clúster de prácticas del curso: requisitos
  3. Instalación de minikube y del driver
  4. Arranque del clúster con recursos suficientes
  5. Addons necesarios para el curso
  6. Verificación del clúster
  7. Ciclo de vida: parar, reanudar, destruir
  8. Alternativa con kind y clúster multinodo
  9. Resolución de fallos de arranque habituales

  1. Las tres vías para conseguir un clúster

Vía Herramientas Quién opera el plano de control Coste Cuándo elegirla
Local minikube, kind, k3d, Docker Desktop Tú, pero es desechable Solo tu máquina Aprender, desarrollar, probar manifiestos y CI
Autogestionada kubeadm, k3s, Rancher, distribuciones de proveedor Tú, de verdad: parches, certificados, etcd, copias Servidores + personas Centro de datos propio, requisitos legales de ubicación del dato, control total
Gestionada en la nube EKS (AWS), AKS (Azure), GKE (Google) El proveedor Cuota de plano de control + nodos La mayoría de empresas en producción

Criterios prácticos para decidir:

  • ¿Estás aprendiendo o desarrollando? Local. Sin discusión: es gratis, rápido de recrear y no te expone.
  • ¿Tienes un equipo de plataforma con guardias 24×7? Si la respuesta es no, evita autogestionar producción. Mantener etcd, rotar certificados y actualizar tres veces al año no es un trabajo pequeño.
  • ¿Hay restricciones de soberanía del dato o hardware especial? Autogestionado, con kubeadm o una distribución comercial.
  • ¿Producción normal de una empresa normal? Gestionado. Rutas Norte terminará aquí: el plano de control es un problema del proveedor y el equipo se concentra en la plataforma.

Cada vía tiene su lección propia más adelante: Minikube y Entornos Locales con kind, Kubeadm y Kubernetes Gestionado: EKS, AKS y GKE. Aquí solo montamos lo necesario para tener entorno de trabajo.

Por qué minikube para este curso

Elegimos minikube como opción principal porque trae de serie, mediante addons, dos cosas que necesitaremos mucho: un Ingress Controller (módulo 4) y un aprovisionador de almacenamiento dinámico (módulo 5). Instalarlas a mano en otras herramientas es trabajo extra que no aporta aprendizaje en este punto. Damos también la receta equivalente con kind, que es más ligero y permite clústeres multinodo con facilidad.

  1. El clúster de prácticas del curso: requisitos

Rutas Norte terminará con seis componentes desplegados a la vez más los complementos de observabilidad, así que conviene no quedarse corto de recursos.

Recurso Mínimo Recomendado para todo el curso
CPU 2 núcleos 4 núcleos
Memoria RAM 4 GiB libres 8 GiB libres (16 GiB en la máquina)
Disco 20 GiB libres 40 GiB libres
Sistema operativo Linux, macOS o Windows 10/11 con WSL2 Linux o macOS
Virtualización Docker, o hipervisor (KVM, HyperKit, Hyper-V) Docker como driver
Red Acceso a internet para descargar imágenes

También necesitas kubectl, cuya instalación y uso se cubren en detalle en la siguiente lección, La CLI de Kubernetes: kubectl. Si aún no lo tienes, minikube puede ejecutarlo por ti con minikube kubectl -- <comando>, aunque lo normal es instalarlo aparte.

  1. Instalación de minikube y del driver

3.1. El driver

minikube crea el clúster dentro de algo: un contenedor o una máquina virtual. Ese "algo" es el driver.

Driver Plataformas Ventajas Inconvenientes
docker (recomendado) Linux, macOS, Windows Rápido, sin hipervisor, arranque en segundos El nodo es un contenedor: menos aislado
kvm2 Linux Aislamiento real de VM Requiere KVM y permisos
hyperkit / vfkit macOS VM ligera Menos usado hoy
hyperv Windows Pro/Enterprise Integrado en el sistema Requiere edición Pro
none Linux Instala sobre la propia máquina Modifica tu sistema; solo para servidores dedicados

Usaremos docker. Comprueba que lo tienes y que tu usuario puede usarlo sin sudo:

docker version --format '{{.Server.Version}}'
docker run --rm hello-world

Si el segundo comando falla con permission denied, añade tu usuario al grupo docker y vuelve a iniciar sesión:

sudo usermod -aG docker $USER && newgrp docker

3.2. Instalar minikube

Linux (x86_64):

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
rm minikube-linux-amd64

macOS (con Homebrew):

brew install minikube

Windows (con winget, en PowerShell):

winget install Kubernetes.minikube

Verifica la instalación:

minikube version
minikube version: v1.33.1
commit: 5883c09216182566a63dff4c326a6fc9ed2982ff

  1. Arranque del clúster con recursos suficientes

Este es el comando que define tu entorno de trabajo para todo el curso:

minikube start \
  --profile=rutas-norte \
  --driver=docker \
  --kubernetes-version=v1.30.0 \
  --cpus=4 \
  --memory=8192 \
  --disk-size=40g

Qué hace cada opción, y por qué:

Opción Significado Por qué así
--profile=rutas-norte Nombre del clúster y del contexto Permite tener varios clústeres independientes en la misma máquina y no chocar con otros trabajos
--driver=docker Dónde se crea el nodo Rápido y sin hipervisor
--kubernetes-version=v1.30.0 Versión fijada El curso usa 1.30+; fijarla evita que un minikube start futuro cambie el comportamiento
--cpus=4 Núcleos asignados Suficiente para los seis componentes más Prometheus del módulo 7
--memory=8192 MiB de RAM Por debajo de 4096 empezarás a ver pods expulsados
--disk-size=40g Disco del nodo Las imágenes y los volúmenes persistentes ocupan

Salida esperada (abreviada):

😄  [rutas-norte] minikube v1.33.1 on Ubuntu 24.04
✨  Using the docker driver based on user configuration
👍  Starting "rutas-norte" primary control-plane node in "rutas-norte" cluster
🚜  Pulling base image ...
🔥  Creating docker container (CPUs=4, Memory=8192MB) ...
🐳  Preparing Kubernetes v1.30.0 on Docker 26.1.1 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "rutas-norte" cluster and "default" namespace by default

Dos detalles importantes de esa salida:

  • La última línea indica que minikube ha modificado tu kubeconfig y ha creado y activado un contexto llamado rutas-norte. Eso es lo que hace que kubectl hable con este clúster.
  • Ya se han habilitado dos addons por defecto: default-storageclass y storage-provisioner. Son los que nos permitirán pedir volúmenes persistentes en el módulo 5 sin infraestructura real.

Si tu máquina tiene menos recursos, arranca con --cpus=2 --memory=4096 y tenlo presente: en el módulo 7 tendrás que apagar componentes para hacer sitio.

  1. Addons necesarios para el curso

Los addons son componentes preempaquetados que minikube instala en el clúster. Habilita estos tres desde ya:

minikube addons enable ingress --profile=rutas-norte
minikube addons enable metrics-server --profile=rutas-norte
minikube addons list --profile=rutas-norte
Addon Qué instala Para qué lo necesitaremos
ingress Un Ingress Controller basado en NGINX Publicar www.rutasnorte.example y api.rutasnorte.example (módulo 4)
metrics-server Recolector de métricas de CPU y memoria kubectl top y el autoescalado horizontal (módulos 7 y 9)
storage-provisioner Aprovisionador dinámico de volúmenes El disco de postgres-reservas (módulo 5). Ya activo por defecto
dashboard (opcional) Interfaz web del clúster Cómodo para explorar; se abre con minikube dashboard

Comprueba que el controlador de Ingress ha arrancado antes de seguir:

kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-9k2xq       0/1     Completed   0          62s
ingress-nginx-admission-patch-hn4vp        0/1     Completed   0          62s
ingress-nginx-controller-768f948f8f-7lxjp  1/1     Running     0          62s

Los dos pods en Completed no son un error: son Jobs de instalación que ya terminaron su trabajo (recuerda de la lección anterior que un Job termina, no se queda corriendo). El importante es el tercero, en Running y 1/1.

  1. Verificación del clúster

Tres comprobaciones que conviene hacer siempre después de crear un clúster.

1. El nodo está listo:

kubectl get nodes -o wide
NAME          STATUS   ROLES           AGE   VERSION   INTERNAL-IP    OS-IMAGE             CONTAINER-RUNTIME
rutas-norte   Ready    control-plane   3m    v1.30.0   192.168.49.2   Ubuntu 22.04.4 LTS   docker://26.1.1

Lo relevante: STATUS: Ready (el kubelet reporta y el plugin de red funciona) y ROLES: control-plane (en minikube el mismo nodo hace de plano de control y de trabajador, algo que en producción nunca ocurriría).

2. Los componentes del sistema están sanos:

kubectl get pods -A
NAMESPACE       NAME                                  READY   STATUS    RESTARTS   AGE
ingress-nginx   ingress-nginx-controller-768f948f8f   1/1     Running   0          2m
kube-system     coredns-7db6d8ff4d-4rzmt              1/1     Running   0          3m
kube-system     etcd-rutas-norte                      1/1     Running   0          3m
kube-system     kube-apiserver-rutas-norte            1/1     Running   0          3m
kube-system     kube-controller-manager-rutas-norte   1/1     Running   0          3m
kube-system     kube-proxy-9wgbn                      1/1     Running   0          3m
kube-system     kube-scheduler-rutas-norte            1/1     Running   0          3m
kube-system     metrics-server-7d9f8c6b5-x2klp        1/1     Running   0          1m
kube-system     storage-provisioner                   1/1     Running   0          3m

Reconoce esta lista: son exactamente los componentes de la lección Arquitectura de Kubernetes, ahora corriendo de verdad en tu máquina. Fíjate en que en minikube el plano de control se ejecuta como pods dentro del propio clúster (static pods gestionados por el kubelet), y que aparece coredns, el servidor DNS interno que estudiaremos en el módulo 4.

3. La API responde y sabes a qué clúster hablas:

kubectl cluster-info
kubectl config current-context
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
rutas-norte

Si las tres comprobaciones pasan, tienes un clúster operativo.

  1. Ciclo de vida: parar, reanudar, destruir

Un clúster local consume recursos aunque no lo uses. Estos son los cuatro comandos que necesitas:

# Parar el clúster conservando TODO su estado (objetos, imágenes, volúmenes)
minikube stop --profile=rutas-norte

# Reanudarlo tal y como estaba, con la misma configuración
minikube start --profile=rutas-norte

# Ver el estado actual
minikube status --profile=rutas-norte

# Destruirlo por completo: se pierde todo lo desplegado
minikube delete --profile=rutas-norte
Comando Qué conserva Cuándo usarlo
stop Todo: objetos, datos de volúmenes, imágenes descargadas Al terminar la sesión de estudio
start (sobre un perfil existente) Todo lo anterior Al retomar el curso
delete Nada de ese perfil Cuando el clúster está roto o al acabar el curso

Consejo de método: que minikube delete no te dé miedo es precisamente el objetivo. Si todos tus manifiestos están versionados en el directorio k8s/ del repositorio —como haremos desde la lección 01-07— recrear el clúster y volver a aplicarlos debería costarte cinco minutos. Si te da miedo borrarlo, es señal de que hay estado importante que no está en Git.

También te resultará útil:

# Abrir un shell dentro del nodo (para inspeccionar el runtime)
minikube ssh --profile=rutas-norte

# Obtener la IP del nodo, que necesitaremos para el Ingress del módulo 4
minikube ip --profile=rutas-norte
192.168.49.2

  1. Alternativa con kind y clúster multinodo

kind (Kubernetes IN Docker) crea cada nodo como un contenedor Docker. Es más ligero que minikube y su gran ventaja es lo fácil que resulta montar un clúster multinodo, algo que te vendrá bien cuando estudiemos planificación y afinidad (módulo 6). Su desventaja: no trae addons, así que Ingress y almacenamiento requieren pasos extra.

Instalación en Linux:

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
sudo install ./kind /usr/local/bin/kind && rm ./kind
kind version

Fichero de configuración con un nodo de control y dos trabajadores, preparado además para Ingress:

# k8s/entorno-local/kind-rutas-norte.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: rutas-norte
nodes:
  - role: control-plane
    # Etiqueta que el Ingress Controller de kind espera encontrar
    kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-labels: "ingress-ready=true"
    # Publicamos 80 y 443 del nodo en la máquina anfitriona
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP
  - role: worker
    labels:
      zona: norte
  - role: worker
    labels:
      zona: sur

Explicación de las partes que importan:

  • nodes: cada entrada es un contenedor Docker que actuará como nodo. Aquí tendremos tres.
  • extraPortMappings: sin esto, el puerto 80 del clúster no sería accesible desde tu navegador. Es el equivalente al minikube tunnel.
  • labels en los workers: etiquetas de nodo que usaremos para practicar afinidad y antiafinidad en el módulo 6, simulando dos zonas de disponibilidad.

Creación y verificación:

kind create cluster --config k8s/entorno-local/kind-rutas-norte.yaml
kubectl get nodes
NAME                        STATUS   ROLES           AGE   VERSION
rutas-norte-control-plane   Ready    control-plane   75s   v1.30.0
rutas-norte-worker          Ready    <none>          52s   v1.30.0
rutas-norte-worker2         Ready    <none>          52s   v1.30.0

Instalar el Ingress Controller (kind no lo trae) y borrar el clúster cuando ya no haga falta:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
kind delete cluster --name rutas-norte

Qué elegir: si dudas, minikube. Usa kind cuando necesites varios nodos o cuando montes Kubernetes dentro de un pipeline de integración continua, donde su rapidez de creación es decisiva.

  1. Resolución de fallos de arranque habituales

Síntoma Causa probable Solución
Exiting due to RSRC_INSUFFICIENT_CORES Has pedido más CPU de la disponible Baja --cpus, o amplía los recursos de Docker Desktop en Ajustes → Resources
docker: permission denied while trying to connect to the Docker daemon socket Tu usuario no está en el grupo docker sudo usermod -aG docker $USER && newgrp docker
Unable to pick a default driver No hay Docker ni hipervisor disponible Instala Docker y arranca su servicio; después --driver=docker
El arranque se queda en Pulling base image Red lenta, proxy corporativo o límite de descargas Configura HTTP_PROXY/HTTPS_PROXY, o reintenta; la imagen base ronda 1 GB
Nodo en NotReady de forma permanente Plugin de red no listo o falta de memoria kubectl describe node y revisa las condiciones; suele resolverse con minikube delete y volver a crear
Pods en ImagePullBackOff Imagen inexistente, etiqueta mal escrita o registro privado sin credenciales kubectl describe pod y lee los eventos; verifica el nombre exacto de la imagen
Pods del sistema en CrashLoopBackOff tras suspender el portátil Desfase de reloj entre el anfitrión y el nodo, que invalida los certificados minikube stop && minikube start sobre el mismo perfil
kubectl responde connection refused El clúster está parado o el contexto apunta a otro sitio minikube status y kubectl config use-context rutas-norte
The connection to the server localhost:8080 was refused No hay kubeconfig: kubectl usa el valor por defecto Arranca minikube, o exporta KUBECONFIG al fichero correcto
Se acaba el disco a mitad de curso Imágenes acumuladas minikube ssh -- docker system prune -a, o recrea el clúster con --disk-size mayor

Comandos de diagnóstico de propósito general cuando algo va mal en el arranque:

minikube status --profile=rutas-norte
minikube logs --profile=rutas-norte | tail -50
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -20

El tercero es especialmente valioso y lo usaremos mucho: los eventos son el diario del clúster y casi siempre contienen la explicación en texto plano de por qué algo no ha funcionado.

Errores Comunes y Consejos

  • Arrancar con los valores por defecto (2 CPU, 2 GiB). Funciona para los primeros módulos y se queda corto en cuanto añadas observabilidad. Es mejor dimensionar bien desde el principio que recrear el clúster a mitad de curso.
  • No usar --profile. Si trabajas con varios clústeres locales, el perfil por defecto se convierte en una fuente de confusión: acabas aplicando manifiestos en el clúster equivocado. Nombrar el perfil rutas-norte deja siempre claro dónde estás.
  • Cambiar la versión de Kubernetes entre sesiones. Si un día arrancas con 1.30 y otro sin fijar versión, cambian comportamientos y APIs. Fija la versión en el comando y anótala en el repositorio.
  • Confundir "el clúster arrancó" con "el clúster está listo". minikube start retorna antes de que los addons estén operativos. Comprueba siempre con kubectl get pods -A que no hay nada en Pending o ContainerCreating.
  • Esperar que Service de tipo LoadBalancer obtenga IP externa. En local no hay cloud-controller-manager (lo vimos en 01-02): se queda en <pending>. Se resuelve con minikube tunnel, y lo trataremos en el módulo 4.
  • Dejar el clúster corriendo permanentemente. Consume CPU y batería. minikube stop al terminar la sesión conserva absolutamente todo.
  • Consejo: guarda tu comando de creación de clúster en el propio repositorio (por ejemplo, en k8s/entorno-local/README o un script crear-cluster.sh). Forma parte de la documentación del proyecto tanto como los manifiestos.

Ejercicios

Ejercicio 1: Crear y verificar tu clúster

Monta el clúster de prácticas con el perfil rutas-norte, 4 CPU, 8 GiB y Kubernetes 1.30, habilita los addons ingress y metrics-server, y responde:

  1. ¿Cuántos nodos tiene y qué rol tienen?
  2. ¿Cuántos pods hay en el namespace kube-system y cuáles se corresponden con componentes del plano de control que estudiaste en la lección 01-02?
  3. ¿Cuál es la IP del nodo?
  4. ¿Qué contexto de kubectl está activo?

Ejercicio 2: Ciclo de vida y persistencia del estado

Crea el namespace de desarrollo del proyecto, para el clúster, reanúdalo y comprueba si el namespace sigue existiendo:

kubectl create namespace rutas-norte-dev
minikube stop --profile=rutas-norte
minikube start --profile=rutas-norte
kubectl get namespaces

Explica por qué el resultado es el que es, mencionando dónde se guarda ese objeto. Después, indica qué comando haría desaparecer ese namespace junto con todo lo demás.

Ejercicio 3: Clúster multinodo con kind

Crea con kind un clúster llamado rutas-norte-multi con un nodo de control y dos trabajadores etiquetados como zona: norte y zona: sur. Comprueba que los tres nodos están Ready y muestra únicamente los nodos de la zona norte. Explica en dos líneas por qué este clúster te será útil en el módulo 6 y por qué no lo usamos como entorno principal del curso.

Soluciones

Solución 1

minikube start --profile=rutas-norte --driver=docker \
  --kubernetes-version=v1.30.0 --cpus=4 --memory=8192 --disk-size=40g
minikube addons enable ingress --profile=rutas-norte
minikube addons enable metrics-server --profile=rutas-norte
  1. Un solo nodo, con rol control-plane. En minikube ese mismo nodo ejecuta también las cargas de usuario, algo que en producción no se hace: el plano de control se reserva mediante taints.
  2. Alrededor de ocho pods. Se corresponden con la arquitectura: etcd, kube-apiserver, kube-scheduler, kube-controller-manager (plano de control), kube-proxy (nodo), más coredns (DNS interno), storage-provisioner y metrics-server. No aparece cloud-controller-manager porque no hay proveedor de nube.
  3. minikube ip --profile=rutas-norte → típicamente 192.168.49.2.
  4. kubectl config current-contextrutas-norte.

Solución 2

El namespace sigue existiendo después de stop y start. La razón es que stop no destruye nada: apaga el contenedor o la VM del nodo conservando su disco, y en ese disco está etcd, que es donde vive el objeto Namespace. Al reanudar, el apiserver vuelve a leer de la misma etcd y todo el estado declarado reaparece.

El comando que sí lo destruiría todo es minikube delete --profile=rutas-norte, que elimina el nodo y su disco, etcd incluida. Por eso los manifiestos deben vivir en Git: recrear el clúster es entonces un trámite.

Solución 3

kind create cluster --config k8s/entorno-local/kind-rutas-norte.yaml --name rutas-norte-multi
kubectl get nodes --show-labels
kubectl get nodes -l zona=norte
NAME                              STATUS   ROLES    AGE   VERSION
rutas-norte-multi-worker          Ready    <none>   90s   v1.30.0

Será útil en el módulo 6 porque la afinidad, la antiafinidad, los taints y la dispersión por topología solo se pueden practicar de verdad con varios nodos: en un clúster de un solo nodo el scheduler no tiene ninguna decisión que tomar. No lo usamos como entorno principal porque kind no incluye addons: habría que instalar a mano el Ingress Controller y un aprovisionador de almacenamiento, trabajo que en este punto del curso distrae del objetivo.

Conclusión

Ya tienes un clúster de Kubernetes funcionando en tu máquina, con el perfil rutas-norte, la versión 1.30 fijada, recursos suficientes para todo el curso y los addons de Ingress, métricas y almacenamiento dinámico habilitados. Has visto también el panorama completo de opciones —local, autogestionado con kubeadm, gestionado en la nube— y los criterios para elegir una u otra en un proyecto real, además de una alternativa multinodo con kind para cuando lleguemos a la planificación. Y, sobre todo, sabes pararlo, reanudarlo y destruirlo sin miedo, porque la verdad operativa del curso es que el clúster es reemplazable y los manifiestos no.

Tienes el entorno, pero apenas has usado la herramienta con la que vas a hablar con él. En la siguiente lección, La CLI de Kubernetes: kubectl, dominaremos kubectl a fondo: el fichero kubeconfig y los contextos, los verbos que usarás todos los días, los formatos de salida, la selección por etiquetas y los trucos de productividad que marcan la diferencia entre pelearse con el clúster y trabajar con soltura.

Curso de Kubernetes

Módulo 1: Introducción a Kubernetes

Módulo 2: Componentes Principales de Kubernetes

Módulo 3: Gestión de Configuración y Secretos

Módulo 4: Redes en Kubernetes

Módulo 5: Almacenamiento en Kubernetes

Módulo 6: Conceptos Avanzados de Kubernetes

Módulo 7: Monitoreo y Registro

Módulo 8: Seguridad en Kubernetes

Módulo 9: Escalado y Rendimiento

Módulo 10: Ecosistema y Herramientas de Kubernetes

Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real

Módulo 12: Preparación para la Certificación de Kubernetes

© Copyright 2026. Todos los derechos reservados