Dijous, gener 15, 2026
VIRTUALITZACIÓ

Com muntar un entorn local de proves Kubernetes amb k3s, kind o minikube: avantatges i limitacions

Muntar un entorn local de Kubernetes per a proves i desenvolupament no és tan trivial com sembla en la documentació oficial. L’habitual és que un comenci amb qualsevol de les opcions més conegudes —k3s, kind o minikube— i, al cap d’uns dies, comencin a sortir les esquerdes: colls d’ampolla en el rendiment, problemes amb volums persistents, diferències de comportament respecte a entorns reals, o simplement una pèrdua de temps cada vegada que es necessita reiniciar tot per alguna configuració mal entesa.

A continuació, es revisen aquestes tres eines, no des de la teoria sinó des de l’experiència pràctica: quan convé cadascuna, quins problemes poden donar, quines dreceres estalvien temps i quines decisions convé evitar, fins i tot si semblen “l’estàndard”.

1. k3s: Kubernetes lleuger, però amb lletra petita

Avantatges reals

k3s té molt sentit quan es busca un entorn local més proper a producció quant a arquitectura (sense dependre de Docker-in-Docker, com kind), però amb menys sobrecàrrega que un cluster complet amb kubeadm. En estar empaquetat en un binari únic, es redueix el nombre de peces soltes. I no depèn de la informació, cosa que simplifica bastant en entorns no convencionals (WSL, Alpine, etc.).

Un avantatge concret: permet córrer control plane i workloads en el mateix node sense conflictes notables, una cosa que en minikube de vegades acaba malament si s’activen massa addons.

On comencen els problemes

Tot i que es ven com a “lleuger”, no significa “mínim”. A partir de cert nombre de pods concurrents (~50-60 en un node amb 4 CPU), k3s comença a mostrar limitacions en el scheduler i al consum de memòria de l’agent local. En proves amb CI locals, això es tradueix en colls d’ampolla si s’executen tests end-to-end en paral·lel.

El suport de storage class és enganyosament simple. Per defecte, k3s inclou local-path com a classe d’emmagatzematge, però té un comportament molt limitat: no és dinàmic en sentit real i tendeix a deixar escombraries en disc si es fan proves amb volums persistents (PVC) que es creen i destrueixen freqüentment. S’acumulen directoris sota /opt/local-path-provisioner sense neteja automàtica, la qual cosa porta a errors en tests posteriors si els PV queden penjats.

Decisió clau

Desactivar el trafik embegut des del començament (–dissable traefik) és gairebé obligatori si es té previst provar Ingress Controllers de forma explícita. Deixar-lo activat per inèrcia genera conflictes: redireccions inesperades, ports ja ocupats i un cluster que “funciona”, però amb comportaments erràtics.

Configuracions que ajuden

  • Instal·lar-lo via k3d (el wrapper Docker-based de k3s) per mantenir entorns aïllats reproduïbles. Permet destruir i recrear clusters en segons sense tocar res del host.
  • Desactivar el servidor de metrics si no es necessita (–dissable metrics-server), per reduir consum de CPU en màquines amb pocs recursos.
  • Mapejar directoris del host com a volums persistents en desenvolupament local. No usar volums en /tmp, perquè en reiniciar el node es poden perdre dades sense avís.

2. kind: fidelitat al control plane, amb restriccions pràctiques

Avantatges reals

kind (Kubernetes IN Docker) es va dissenyar per a testejar Kubernetes, no per desenvolupar sobre ell. Això fa que tingui un avantatge estructural: el cluster té un comportament molt predictible. És perfecte si es vol reproduir escenaris que depenen del control plane, com tests d’operadors, validacions de CRDs o experimentació amb els controls. Tot això sense desviacions “màgiques” de la distribució, com passa amb minikube o k3s.

Funciona bé en CI/CD, sobretot en runners amb privilegis reduïts. És fàcil aixecar un cluster a GitHub Actions amb kind i Docker sense instal·lar res al host.

Problemes pràctics

És lent. No perquè consumeixi molt, sinó perquè tot passa per Docker-in-Docker. Els I/O són especialment pesats quan es tracta de volums persistents. Si es munta un PV backed per un hostPath simulat, les escriptures van a través de capes d’overlayfs, cosa que en proves de bases de dades o sistemes amb molts writes (Redis, Mongo, etc.) genera latències enganyoses. Es perd completament la referència respecte a producció.

A més, el networking és limitat. No hi ha un CNI real. Si es fan proves que depenen de polítiques de xarxa (network policies, DNS intern, etc.), kind no és fiable: les coses funcionen fins i tot quan no haurien de fer.

Errors comuns

  • Assumir que es poden exposar serveis LoadBalancer sense més. kind no té integració nativa per a això. Cal fer servir port-forwarding o configurar un Ingress manualment.
  • Fer servir imatges locals sense carregar-les explícitament al cluster. kind load docker-image és obligatori; en cas contrari, els pods fallen sense logs clars perquè el node no té accés al host registry.
  • Aixecar múltiples nodes i esperar comportament realista de schedulers. Els workers són containers també, i el temps que tarden a arrencar dona lloc a errors de sincronització que no ocorren en clusters reals.

Per evitar inconsistències, convé definir sempre els clusters kind amb un kind-config.yaml explícit. Evita sorpreses com ports que no estan oberts, storage que no persisteix entre reinicis o noms de nodes que canvien entre execucions.

3. minikube: flexibilitat total, a costa de manteniment

Punts forts

minikube té un ventall ampli de possibilitats: es pot aixecar amb Docker, amb virtualbox, amb KVM, amb Hyperkit… i això és tant un avantatge com una font de caos. Si es tria bé el driver, pot donar una experiència propera a un entorn bare-metal. Per exemple, amb –driver=none, corre directament sobre el sistema operatiu i ofereix un rendiment acceptable en I/O. També té un sistema força complet d’ addons que permeten simular entorns més complexos: Ingress, metrics-server, dashboard, CSI, etc.

Una característica útil: permet fer minikube mount per mapejar directoris de l’host directament, sense passar per volums. Per a desenvolupament actiu, això estalvia temps si es recompilen imatges freqüentment o es munten carpetes locals com a font de configuració.

Problemes

El sistema d’addons és fràgil. S’activen fàcil, però s’espatllen fàcil també. El dashboard, el metrics-server i l’espai de nginx tenen dependències internes que no sempre queden netes en fer un minikube delete. Queden pods penjant, configmaps duplicats, o ports en conflicte en reinicis posteriors.

Un altre problema comú: el DNS intern pot fallar si la configuració de xarxa de l’host canvia. Això passa molt en fer servir VPNs o proxies corporatius. Quan coredns comença a resoldre amb latència, les aplicacions dins del cluster fallen amb timeouts difícils de rastrejar. Reiniciar minikube no sempre ho arregla; cal resetejar la configuració de xarxa completa (minikube stop && minikube delete && minikube start –clean-config).

Errors per inèrcia

  • Triar VirtualBox com a driver per costum. Al 2025, és innecessari en gairebé tots els casos. Docker o KVM són més ràpids i menys propensos a conflictes amb firewalls o configuracions de xarxa d’ empresa.
  • Deixar tots els addons actius. En entorns de prova, cada addon és una font potencial de bugs laterals. El recomanable és activar-los un a un, i només quan es provi una cosa que ho requereixi explícitament.
  • Assumir que els canvis sobreviuen entre reinicis. El driver Docker, en particular, perd configuracions de xarxa, volums i certificats amb facilitat.

Configuracions que estalvien temps

  • Fer servir minikube cache add <imatge> per evitar pulls repetits en clusters efímers.
  • Activar minikube tunnel només quan es necessiten serveis LoadBalancer reals, però no deixar-ho corrent. Consumeix recursos fins i tot sense trànsit i genera conflictes amb serveis al port 443 del host.
  • Establir perfils (–profile) per separar entorns: desenvolupament, testing, proves amb storage, etc. És més net que reciclar un únic cluster i perdre reproducibilitat.

Comparativa directa: quan triar cadascú?

No hi ha una resposta única, però es poden traçar línies clares segons el cas d’ ús i el context tècnic.

Criteri tècnickindk3s / k3dminikube
Testeig d’ operadors, CRDs, control plane personalitzatMolt fiableAlgunes desviacionsMassa capes
Entorns amb recursos limitats (portàtils, WSL, etc.)Pesat per Docker-in-DockerMolt lleugerDepèn del driver
Reproducció d’ entorns reals amb CNI i PVCsLimitatAcceptable si s’ afinaConfigurable, però fràgil
Volums persistents per a bases de dades en provesMal rendiment I/ONomés si es controla netejaMillor amb –driver=none o KVM
Ús intensiu en CI/CD localExcel·lent en runnersBon equilibriLent, alt manteniment
Exposició realista de serveis (LoadBalancer, Ingress)Requereix configuració manualFunciona bé amb MetallbBon suport, però addons fràgils

Pràctiques que eviten pèrdues de temps (independentment de l’entorn)

Al marge de l’eina escollida, hi ha certs patrons que convé repetir sempre per evitar problemes típics en entorns locals Kubernetes.

1. Fer servir imatges locals amb etiquetes versionades

No convé fer servir :latest ni etiquetes genèriques. Encara que el tag estigui ben definit al Dockerfile, la majoria d’entorns (especialment kind) necessiten que es carregui explícitament en el cluster. kind load docker-image my-app:dev-20250730 garanteix que aquesta versió està disponible i no es resol des d’un registry extern.

2. Desplegar els mateixos manifests que a staging

Encara que sembli redundant, desplegar en local els mateixos YAMLs (o Helm charts) que a staging redueix la distància operativa. Molts problemes sorgeixen per tenir manifestos simplificats “només per a local” que després divergeixen. Si alguna cosa requereix sobreescriptura (com StorageClass o tolerations), millor fer servir kustomize o overlays dedicats.

3. Netejar volums i xarxes en destruir

Esborrar un cluster no significa alliberar-ho tot. En minikube, els volums persistents continuen ocupant espai fins que es destrueix el driver o es netegen els discos virtuals manualment. En k3d, els contenidors Docker de vegades es queden aturats però no esborrats. És bona pràctica incloure una neteja explícita (docker system prune –volumes) en entorns efímers.

4. Monitorització simple amb eines conegudes

Instal·lar Prometheus, Loki o Grafana en local pot semblar exagerat, però tenir encara que sigui mètriques bàsiques visibles en proves complexes (com reconciliacions lentes o problemes de xarxa) permet distingir entre “l’app està malament” i “l’entorn s’està ofegant”. Si no es vol instrumentar tot, almenys fer servir kubectl top i stern per a seguir logs agrupats per label.

Consideracions no tècniques, però inevitables

Suport d’ equip

No tothom té les mateixes capacitats locals. Si l’equip és mixt (Linux, macOS, Windows), kind i k3d tenen millor portabilitat. minikube amb VirtualBox pot ser l’origen de molts bugs compartits. En aquests casos, fer servir Docker com a driver comú és més sostenible.

Ús en remot

Algunes proves requereixen integració amb serveis externs (OAuth, APIs privades, etc.). minikube té l’avantatge de permetre minikube tunnel per simular LoadBalancers reals, mentre que en kind cal muntar proxies o fer servir eines com ngrok. Si es necessiten proves reals amb callbacks o webhooks, això és determinant.

Compatibilitat amb eines de tercers

Certes plataformes (com Skaffold, Tilt o Garden) tenen integracions més completes amb minikube o k3d que amb kind. Si es fa servir alguna d’aquestes eines com a part del flux de desenvolupament, convé validar primer amb quin entorn treballen millor, o es perdran hores en configuracions que “gairebé” funcionen.

Conclusió

Cap de les tres opcions és clarament superior. L’entorn correcte depèn del que s’ha de provar, amb quina freqüència, en quines condicions i amb quin pressupost de temps. El que sí que es pot afirmar és que:

  • kind és excel·lent per a clústers d’un sol ús, reproduïbles i CI/CD sense acoblaments amb el host.
  • k3s (especialment via k3d) és útil quan es busca un clúster lleuger però més proper al comportament real.
  • minikube continua tenint sentit si es necessita flexibilitat, accés directe al host i simulació raonable de features de cloud.

Triar bé significa evitar dies perduts ajustant configuracions que no encaixen. I, sobretot, tenir clar què es vol provar abans de llençar el primer start. Si l’entorn s’assembla al de producció, els bugs apareixen abans. Si se simula malament, apareixen després i amb menys context. Aquesta diferència pesa molt més que 500MB de RAM o uns segons d’arrencada.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *