Tancàvem la lliçó anterior amb el mapa de peces del clúster: apiserver, etcd, scheduler, controladors, kubelet. Aquestes són les peces que executen Kubernetes. Ara toca l'altre vocabulari, el que tu escriuràs cada dia: pods, Deployments, Services, ConfigMaps, PVCs, namespaces. És un vocabulari gran i la temptació és aprendre'l com un diccionari, terme a terme, cosa que és una mala idea: els conceptes de Kubernetes no són independents, formen famílies amb relacions jeràrquiques clares. Aquesta lliçó et dona aquest mapa mental complet, de manera que quan al mòdul 5 aparegui un PersistentVolumeClaim ja sàpigues per endavant on encaixa i amb qui parla. No desenvoluparem l'ús pràctic de cada objecte —cadascun té la seva lliçó pròpia— sinó que els col·locarem al mapa.

Contingut

  1. La base: recurs, objecte i API
  2. Clúster i node
  3. El pod: la unitat mínima
  4. La família de càrregues de treball
  5. La família de xarxa
  6. La família de configuració
  7. La família d'emmagatzematge
  8. Organització: namespaces, etiquetes, selectors i anotacions
  9. Controladors, operadors i CRDs
  10. Taula mestra de conceptes

  1. La base: recurs, objecte i API

Abans dels noms concrets, tres termes que es confonen constantment:

Terme Definició Exemple
Recurs (resource) Un tipus d'entitat que l'API sap gestionar, amb el seu endpoint pods, deployments, services
Objecte (object) Una instància concreta d'un recurs, desada a etcd El pod anomenat api-reserves-7d9f a rutas-norte-dev
Manifest (manifest) El fitxer YAML que descriu l'objecte que vols k8s/base/api-reserves.yaml

I la regla que governa tot el sistema, que ja vam veure a l'arquitectura:

  • spec: el que tu vols. L'escrius tu.
  • status: el que realment hi ha. L'escriu el clúster.

Tot el que existeix a Kubernetes —una aplicació, una IP virtual, una contrasenya, un disc, un permís— és un objecte amb spec i status emmagatzemat a la mateixa API. Aquesta uniformitat és el que fa que una sola ordre, kubectl get, serveixi per a tot. El detall de l'anatomia d'un objecte el treballarem a Objectes, Manifests YAML i el Model Declaratiu.

  1. Clúster i node

  • Clúster: el conjunt complet. Un pla de control més un grup de nodes que es presenten com un únic sistema. Quan dius "desplego al clúster", estàs dient "lliuro la meva intenció a l'API i que el sistema decideixi on".
  • Node (node): una màquina —física o virtual— que executa càrregues. És també un objecte de l'API: kubectl get nodes t'ho demostra. Té capacitat (CPU, memòria, pods màxims), etiquetes (zona, tipus de disc) i condicions (Ready, MemoryPressure).

Rutas Norte farà servir un clúster de pràctiques d'un sol node (minikube) durant el curs, i parlarem de clústers multinode quan arribem a la planificació (mòdul 6) i a l'alta disponibilitat (mòdul 9).

  1. El pod: la unitat mínima

Aquest és el concepte fundacional, i el que més sorprèn venint de Docker.

Kubernetes no executa contenidors: executa pods. Un pod és un grup d'un o més contenidors que comparteixen xarxa i emmagatzematge i es programen sempre junts al mateix node.

Què comparteixen els contenidors d'un mateix pod:

  • Una única IP. Es veuen entre ells per localhost i no poden fer servir el mateix port.
  • Els volums declarats al pod.
  • El cicle de vida: neixen junts, moren junts, es mouen junts.

En la immensa majoria dels casos —i en gairebé tots els de Rutas Norte— un pod conté un sol contenidor. Els pods multicontenidor es reserven per a patrons concrets (sidecar, init container, adaptador) que s'estudien al mòdul 6.

Dues propietats del pod que cal interioritzar des del primer dia:

  1. És efímer. Un pod no es "repara" ni es mou: si el seu node cau, aquell pod es dona per perdut i se'n crea un altre de nou, amb un altre nom i una altra IP. No depenguis mai del nom ni de la IP d'un pod.
  2. Rarament es crea a mà. Un pod solt no té qui el ressusciti. Llevat de proves puntuals, sempre es crea a través d'un controlador de càrrega de treball. A la lliçó El Projecte del Curs en crearàs un de solt justament per experimentar aquesta fragilitat en primera persona.

Fragment mínim, només per veure'n la forma:

apiVersion: v1
kind: Pod
metadata:
  name: api-reserves
spec:
  containers:
    - name: api
      image: registry.rutasnorte.example/api-reserves:2.4.0

  1. La família de càrregues de treball

Tots aquests objectes tenen el mateix propòsit: crear i mantenir pods. Es diferencien en com i quan.

4.1. La jerarquia essencial

flowchart TD
    D["Deployment<br/>gestiona versions"] --> RS["ReplicaSet<br/>garanteix N rèpliques"]
    RS --> P1["Pod"]
    RS --> P2["Pod"]
    RS --> P3["Pod"]
    P1 --> C1["contenidor"]
    P2 --> C2["contenidor"]
    P3 --> C3["contenidor"]

Llegeix-ho així, de baix a dalt:

  • El contenidor executa el teu procés.
  • El pod embolcalla un o diversos contenidors i és la unitat que es programa en un node.
  • El ReplicaSet vigila que hi hagi exactament N pods iguals; si en falta un, el crea.
  • El Deployment gestiona ReplicaSets per poder canviar de versió de manera progressiva: crea un ReplicaSet nou amb la imatge nova i va reduint el vell.

Per això tu escrius Deployments, gairebé mai ReplicaSets ni Pods. El ReplicaSet existeix, el veuràs amb kubectl get rs, però és un intermediari que el Deployment gestiona per tu.

4.2. Les sis càrregues de treball

Objecte Per a què serveix Tret distintiu A Rutas Norte
Deployment Aplicacions sense estat, amb rèpliques intercanviables Actualització progressiva i rollback botiga-web, api-reserves, worker-notificacions
ReplicaSet Mantenir N còpies idèntiques El gestiona el Deployment; no s'escriu a mà Creat automàticament pels anteriors
StatefulSet Aplicacions amb estat i identitat estable Noms fixos (-0, -1), disc propi per rèplica, arrencada ordenada postgres-reserves
DaemonSet Una còpia a cada node S'ajusta sol en afegir o treure nodes Agents de logs i mètriques (mòdul 7)
Job Tasca que s'executa fins a completar-se Acaba; pot reintentar i paral·lelitzar Migracions d'esquema de la base de dades
CronJob Job llançat segons un horari Sintaxi cron informes-ocupacio, nocturn

La pregunta clau per triar és sempre la mateixa: les meves rèpliques són intercanviables? Si qualsevol pot atendre qualsevol petició i no desen res al disc, és un Deployment. Si cada rèplica té identitat i dades pròpies, és un StatefulSet.

  1. La família de xarxa

Els pods són efímers i les seves IP canvien. La família de xarxa existeix per donar estabilitat i accessibilitat damunt d'aquest caos.

  • Service: una IP virtual i un nom DNS estables que reparteixen trànsit entre un conjunt de pods, triats per etiquetes. És la peça que fa possible que botiga-web cridi api-reserves pel seu nom sense conèixer cap IP. Tipus principals: ClusterIP (intern, l'habitual), NodePort i LoadBalancer (exposició externa), i ExternalName.
  • Ingress: regles HTTP/HTTPS que encaminen per domini i ruta cap a Services diferents, amb terminació TLS. És el que permetrà publicar www.rutasnorte.example i api.rutasnorte.example sobre una única IP pública. Un Ingress no fa res per si sol: necessita un Ingress Controller instal·lat al clúster (NGINX, Traefik…).
  • NetworkPolicy: tallafoc a nivell de pod. Per defecte, a Kubernetes tots els pods poden parlar amb tots. Una NetworkPolicy ho restringeix: per exemple, que només api-reserves es pugui connectar a postgres-reserves. Atès que aquesta base de dades desa dades personals, per a Rutas Norte no és opcional.
  • EndpointSlice: la llista, mantinguda automàticament, de les IP de pods sans que hi ha darrere d'un Service. No s'escriu a mà, però és el primer que es mira quan un Service "no arriba enlloc".
flowchart LR
    U["Usuari<br/>www.rutasnorte.example"] --> ING["Ingress"]
    ING --> SVC1["Service<br/>botiga-web"]
    ING --> SVC2["Service<br/>api-reserves"]
    SVC1 --> PA["Pod botiga-web"]
    SVC1 --> PB["Pod botiga-web"]
    SVC2 --> PC["Pod api-reserves"]
    SVC2 --> PD["Pod api-reserves"]
    PC --> SVC3["Service<br/>postgres-reserves"]
    PD --> SVC3
    SVC3 --> PG["Pod postgres-reserves"]

  1. La família de configuració

La regla d'or: la imatge conté el codi; mai la configuració ni les credencials. La mateixa imatge api-reserves:2.4.0 ha de poder executar-se a rutas-norte-dev i a rutas-norte-pro sense reconstruir-se.

Objecte Contingut Com arriba al contenidor Advertiment
ConfigMap Configuració no sensible: URLs, mides de memòria cau, fitxers .conf Variables d'entorn o fitxer muntat No xifra res; no hi posis contrasenyes
Secret Dades sensibles: contrasenyes, tokens, certificats TLS Igual que el ConfigMap Va codificat en base64, que no és xifratge; requereix RBAC i xifratge en repòs
ServiceAccount Identitat d'un pod davant de l'API de Kubernetes Token muntat automàticament Diferent de la identitat d'una persona

Un detall que evita molts malentesos: base64 és codificació, no protecció. Qualsevol amb permís de lectura sobre Secrets els pot descodificar en un segon. La protecció real ve de RBAC (mòdul 8) i del xifratge en repòs d'etcd.

Relacionats amb aquesta família hi ha els límits de recursos (requests i limits de CPU i memòria), les ResourceQuota per namespace i els LimitRange, que s'estudien al mòdul 3 i determinen la classe de qualitat de servei (QoS) del pod.

  1. La família d'emmagatzematge

El sistema de fitxers d'un contenidor és efímer: en reiniciar-se, es perd. Per a postgres-reserves això és inacceptable, així que existeix aquesta família.

Objecte Què és Analogia
Volume Directori muntat al pod, definit dins del mateix pod Un directori compartit; molts tipus moren amb el pod (emptyDir)
PersistentVolume (PV) Una peça d'emmagatzematge real del clúster, amb vida independent del pod El disc físic disponible
PersistentVolumeClaim (PVC) La petició d'un usuari: "vull 20 GiB en mode lectura-escriptura" El val que bescanvies per un disc
StorageClass El "tipus" d'emmagatzematge i com s'aprovisiona automàticament El catàleg: ssd-rapid, hdd-barat

El flux normal, que veuràs al mòdul 5, és: declares un PVC al teu manifest → la StorageClass aprovisiona dinàmicament un PV real → el PVC queda vinculat a ell → el pod munta aquest PVC com un volum. Tu, com a desenvolupador, gairebé sempre escrius només el PVC.

La separació PV/PVC respon a un repartiment de responsabilitats: l'administrador del clúster gestiona l'oferta (PV i StorageClass), el desenvolupador expressa la demanda (PVC), i cap dels dos no necessita saber els detalls de l'altre.

  1. Organització: namespaces, etiquetes, selectors i anotacions

Amb 40 objectes, el clúster es torna inmanejable sense organització. Kubernetes ofereix dos eixos complementaris.

8.1. Namespace: divisió dura

Un namespace és una partició lògica del clúster. Rutas Norte en farà servir tres: rutas-norte-dev, rutas-norte-pre i rutas-norte-pro.

Què et dona un namespace:

  • Unicitat de noms: pot haver-hi un Service api-reserves a cadascun sense conflicte.
  • Àmbit de RBAC: "aquest equip pot desplegar a dev però només llegir a pro".
  • Àmbit de quotes: límits de CPU i memòria per entorn.
  • DNS: un servei es resol com api-reserves.rutas-norte-dev.svc.cluster.local.

Què no et dona: aïllament de xarxa (per a això, NetworkPolicy) ni aïllament de nodes. A més, alguns objectes són d'àmbit de clúster i no viuen en cap namespace: Node, PersistentVolume, StorageClass, ClusterRole, el mateix Namespace.

8.2. Etiquetes i selectors: la divisió tova

Una etiqueta (label) és un parell clau-valor enganxat a un objecte. Un selector és una consulta sobre etiquetes. Aquest parell és el mecanisme d'acoblament de tot Kubernetes: un Service no coneix els seus pods pel nom, els troba per etiqueta. El mateix fa un ReplicaSet amb les seves rèpliques.

Convencions que Rutas Norte farà servir a tots els objectes:

metadata:
  labels:
    app: api-reserves                       # el component
    app.kubernetes.io/part-of: rutas-norte  # la plataforma
    entorn: dev                             # l'entorn

I el selector corresponent en un Service:

spec:
  selector:
    app: api-reserves
    entorn: dev

Les anotacions (annotations) són també parells clau-valor, però amb un propòsit oposat: no es poden seleccionar. Serveixen per adjuntar metadades que consumeixen eines: la configuració d'un Ingress Controller, el commit de Git que va originar el desplegament, un identificador de certificat. Regla mnemotècnica: si hi filtraràs, etiqueta; si és informació per a una eina o per a un humà, anotació.

  1. Controladors, operadors i CRDs

Aquests tres tanquen el mapa i són la porta a la part avançada del curs.

  • Controlador: un procés que executa el bucle de reconciliació de la lliçó anterior sobre un tipus d'objecte. El controlador de ReplicaSet vigila ReplicaSets i crea pods. És el patró universal de Kubernetes.
  • CRD (Custom Resource Definition): un objecte que defineix un tipus d'objecte nou. En aplicar un CRD, l'API del teu clúster comença a entendre, per exemple, kind: Certificate o kind: PostgresCluster, amb el seu propi kubectl get certificates.
  • Operador: la combinació d'un CRD amb un controlador propi que sap reconciliar-lo. És "coneixement d'un administrador expert convertit en programari": un operador de PostgreSQL pot crear rèpliques, fer còpies de seguretat i executar una commutació per error sense intervenció humana.
flowchart LR
    CRD["CRD<br/>defineix el tipus PostgresCluster"] --> API["API de Kubernetes"]
    CR["Objecte PostgresCluster<br/>'reserves', 3 rèpliques"] --> API
    API --> CTRL["Controlador de l'operador"]
    CTRL --> SS["StatefulSet"]
    CTRL --> SVC["Services"]
    CTRL --> SEC["Secrets"]
    CTRL --> PVC["PVCs"]

Quan al mòdul 6 valoris si postgres-reserves s'ha de gestionar amb un StatefulSet propi o amb un operador, aquesta serà la distinció clau.

  1. Taula mestra de conceptes

Desa aquesta taula: és l'índex conceptual de tot el curs.

Concepte Què és en una frase On el veurem a Rutas Norte Mòdul
Clúster Pla de control + nodes com un sol sistema El clúster de pràctiques i el futur de producció 1, 10
Node Màquina que executa pods Node únic de minikube; multinode amb kind 1, 6
Pod Unitat mínima: contenidors que comparteixen xarxa i disc Primer desplegament de botiga-web 1, 2
ReplicaSet Garanteix N pods idèntics Creat pels Deployments 2
Deployment Gestiona ReplicaSets per desplegar i actualitzar sense tall botiga-web, api-reserves, worker-notificacions 2
StatefulSet Rèpliques amb identitat i disc propis postgres-reserves 6
DaemonSet Un pod per node Agent de logs i de mètriques 6, 7
Job Tasca que corre fins a acabar Migració de l'esquema de reserves 6
CronJob Job programat per horari informes-ocupacio, cada nit 6
Service IP i nom estables + balanceig cap a pods api-reserves, postgres-reserves, redis-cache 2, 4
Ingress Encaminament HTTP per domini i ruta, amb TLS www.rutasnorte.example, api.rutasnorte.example 4
NetworkPolicy Tallafoc entre pods Només l'API accedeix a la base de dades 4, 8
ConfigMap Configuració no sensible externalitzada Paràmetres de l'API i nginx.conf de la botiga 3
Secret Dades sensibles gestionades a part Contrasenya de postgres-reserves, credencials SMTP 3, 8
ServiceAccount Identitat del pod davant de l'API Compte mínim per a cada component 3, 8
Volume Directori muntat al pod Memòria cau temporal, fitxers compartits entre contenidors 5
PersistentVolume Emmagatzematge real amb vida pròpia Disc de la base de dades 5
PersistentVolumeClaim Petició d'emmagatzematge Els 20 GiB que demana postgres-reserves 5
StorageClass Catàleg i aprovisionament dinàmic de discos Classe per defecte de minikube i classes de núvol 5
Namespace Partició lògica del clúster rutas-norte-dev, -pre, -pro 2
Etiqueta / selector Metadada consultable / consulta sobre ella app, entorn, app.kubernetes.io/part-of 2
Anotació Metadada no consultable, per a eines Configuració de l'Ingress, commit desplegat 2, 4
Recurs / objecte Tipus d'entitat / instància concreta Tot el que escriguis a k8s/ 1
Controlador Procés que reconcilia un tipus d'objecte Els que creen els teus pods sense que els vegis 1, 6
CRD Defineix un tipus d'objecte nou a l'API El que instal·la cert-manager 4, 6
Operador CRD + controlador amb lògica experta Alternativa gestionada per a PostgreSQL 6
HPA Ajusta el nombre de rèpliques automàticament Pics de ponts i vacances 9
Sonda (probe) Comprovació de salut d'un contenidor Liveness i readiness de l'API 7
RBAC Qui pot fer què sobre quins recursos Permisos de l'equip i dels pods 8

Errors Comuns i Consells

  • Confondre pod i contenidor. Un pod pot tenir diversos contenidors, però es programa, es mou i s'escala com una unitat. "Escalar" significa crear més pods, no més contenidors dins del pod.
  • Crear pods solts en producció. Ningú no els ressuscita. Sempre a través d'un Deployment, StatefulSet, DaemonSet o Job.
  • Desar una contrasenya en un ConfigMap. És l'error de seguretat més freqüent en clústers reals. La distinció ConfigMap/Secret existeix precisament per poder aplicar RBAC diferent a cadascun.
  • Suposar que un Secret està xifrat. base64 és codificació. Sense xifratge en repòs i RBAC, un Secret és text pla amb un pas extra.
  • Creure que un namespace aïlla la xarxa. No ho fa: un pod de rutas-norte-dev pot arribar a un de rutas-norte-pro tret que existeixi una NetworkPolicy.
  • Canviar etiquetes a la lleugera. Les etiquetes són el mecanisme d'acoblament: si modifiques l'etiqueta d'un pod, el seu Service deixa de veure'l i el seu ReplicaSet en crea un de nou per substituir-lo. Es fa a propòsit en algunes tècniques de depuració, però mai per accident.
  • Consell: quan aparegui un objecte que no coneguis, fes-te tres preguntes — a quina família pertany (càrrega, xarxa, configuració, emmagatzematge)?, quin altre objecte el crea o el consumeix?, és d'àmbit de namespace o de clúster? Amb aquestes tres respostes ja el pots situar. I kubectl explain <recurs> te les respon sense sortir del terminal.

Exercicis

Exercici 1: Triar l'objecte adequat

Per a cada necessitat de Rutas Norte, indica quin objecte (o combinació d'objectes) faries servir i per què:

  1. Executar 4 còpies intercanviables d'api-reserves i poder passar de la versió 2.4.0 a la 2.5.0 sense tallar el servei.
  2. Que postgres-reserves conservi les seves dades encara que el seu pod es recreï, i que sempre es digui igual.
  3. Generar un informe d'ocupació cada nit a les 02:30.
  4. Que botiga-web arribi a api-reserves per un nom fix encara que les rèpliques canviïn d'IP.
  5. Desar la contrasenya de la base de dades fora de la imatge.
  6. Impedir que worker-notificacions es pugui connectar directament a la base de dades.

Exercici 2: La cadena de responsabilitat

Explica amb les teves paraules, en 6 línies com a màxim, què passa des que escrius replicas: 3 en un Deployment fins que hi ha tres contenidors corrent, anomenant tots els objectes i components que hi intervenen. Després respon: si esborres un d'aquests tres pods a mà, qui el recrea exactament?

Exercici 3: Etiqueta o anotació

Classifica cada metadada com a etiqueta o anotació i justifica-ho en una línia:

  1. app: api-reserves
  2. entorn: pro
  3. rutasnorte.example/commit: 9f3a1c2
  4. nginx.ingress.kubernetes.io/proxy-body-size: 8m
  5. app.kubernetes.io/part-of: rutas-norte
  6. rutasnorte.example/responsable: [email protected]

Solucions

Solució 1

  1. Deployment. És una aplicació sense estat amb rèpliques intercanviables; el Deployment gestiona ReplicaSets i permet l'actualització progressiva i el rollback.
  2. StatefulSet + PersistentVolumeClaim (amb la seva StorageClass al darrere). El StatefulSet dona identitat estable (postgres-reserves-0) i un PVC propi per rèplica que sobreviu a la recreació del pod.
  3. CronJob, que al seu torn crea un Job i aquest un Pod a cada execució programada.
  4. Service de tipus ClusterIP. Dona nom DNS i IP virtual estables i reparteix entre els pods sans seleccionats per etiqueta.
  5. Secret, muntat com a variable d'entorn o fitxer, amb RBAC restrictiu. Mai un ConfigMap.
  6. NetworkPolicy que permeti trànsit d'entrada a postgres-reserves només des de pods amb l'etiqueta app: api-reserves.

Solució 2

Escrius el Deployment i l'apliques; l'apiserver el desa a etcd. El controlador de Deployment crea un ReplicaSet amb replicas: 3. El controlador de ReplicaSet observa que hi ha 0 pods i crea 3 objectes Pod. El kube-scheduler assigna node a cadascun. El kubelet de cada node demana al runtime, via CRI, que descarregui la imatge i arrenqui el contenidor. Cadena completa: Deployment → ReplicaSet → Pod → contenidor.

Si esborres un pod a mà, el recrea el controlador de ReplicaSet (no el Deployment): detecta que hi ha 2 pods on el seu spec en demana 3 i en crea un de nou, amb nom i IP diferents.

Solució 3

  1. Etiqueta. Identifica el component i és la clau per la qual seleccionen Services i ReplicaSets.
  2. Etiqueta. Es fa servir per filtrar i per a selectors per entorn.
  3. Anotació. És traçabilitat; mai no seleccionaràs objectes per commit i el valor canvia a cada desplegament.
  4. Anotació. És configuració que consumeix l'Ingress Controller, no un criteri de selecció.
  5. Etiqueta. Etiqueta estàndard recomanada que permet consultar tota la plataforma d'un cop (-l app.kubernetes.io/part-of=rutas-norte).
  6. Anotació. Informació de contacte per a humans; no té sentit filtrar-hi i el seu format lliure no encaixa en les restriccions de valor d'una etiqueta.

Conclusió

Ja tens el mapa complet del vocabulari: els objectes de Kubernetes s'agrupen en famílies amb papers clars —càrregues de treball que creen pods, xarxa que els dona estabilitat i accés, configuració que els parametritza, emmagatzematge que els dona persistència— organitzades per namespaces i acoblades entre si mitjançant etiquetes i selectors, amb els controladors reconciliant-ho tot i els CRDs i operadors permetent estendre el sistema. La jerarquia Deployment → ReplicaSet → Pod → contenidor és la columna vertebral que convé tenir sempre present, i la taula mestra et serveix d'índex per a la resta del curs.

Fins aquí, tot ha estat teoria. És el moment de tenir un clúster propi on provar cada cosa que anem aprenent: a la lliçó següent, Configuració d'un Clúster de Kubernetes, muntarem pas a pas l'entorn de pràctiques que farem servir durant els dotze mòduls.

Curs de Kubernetes

Mòdul 1: Introducció a Kubernetes

Mòdul 2: Components Principals de Kubernetes

Mòdul 3: Gestió de Configuració i Secrets

Mòdul 4: Xarxes a Kubernetes

Mòdul 5: Emmagatzematge a Kubernetes

Mòdul 6: Conceptes Avançats de Kubernetes

Mòdul 7: Monitoratge i Registre

Mòdul 8: Seguretat a Kubernetes

Mòdul 9: Escalat i Rendiment

Mòdul 10: Ecosistema i Eines de Kubernetes

Mòdul 11: Estudis de Cas i Aplicacions del Món Real

Mòdul 12: Preparació per a la Certificació de Kubernetes

© Copyright 2026. Tots els drets reservats