Al final de la lliçó anterior tenies un clúster arrencat i verificat amb un parell d'ordres manllevades. Ara anem a per l'eina en si. kubectl és el client oficial de l'API de Kubernetes i serà, de bon tros, el programa que més facis servir en aquest curs i en la teva vida professional amb Kubernetes: crear, consultar, inspeccionar, depurar i esborrar hi passen tots. La bona notícia és que kubectl és extraordinàriament regular: un cop n'entens la gramàtica, saps fer-lo servir amb qualsevol tipus d'objecte, inclosos els que encara no existeixen. Aquesta lliçó t'ensenya aquesta gramàtica, el fitxer de configuració que decideix amb quin clúster parles, els verbs que faràs servir cada dia sobre els components de Rutas Norte, els formats de sortida que converteixen kubectl en una eina de consulta seriosa, i els ajustos de productivitat que separen qui es baralla amb el clúster de qui hi treballa amb desimboltura.

Contingut

  1. Què és kubectl i instal·lació
  2. El fitxer kubeconfig: clústers, usuaris i contextos
  3. Anatomia d'una ordre kubectl
  4. Els verbs del dia a dia
  5. Formats de sortida i consultes
  6. Selecció per etiquetes i observació en viu
  7. Imperatiu enfront de declaratiu
  8. Productivitat: àlies, autocompletat, explain i plugins

  1. Què és kubectl i instal·lació

kubectl no té intel·ligència pròpia: tradueix les teves ordres a peticions HTTPS contra el kube-apiserver. Tot el que pot fer kubectl ho podria fer curl amb el certificat adequat; el que aporta és comoditat, format i validació local.

Conseqüència pràctica: qualsevol cosa que kubectl no et deixi fer, te la està prohibint el servidor (RBAC), no l'eina.

Instal·lació

Linux:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
rm kubectl

macOS:

brew install kubectl

Windows (PowerShell):

winget install -e --id Kubernetes.kubectl

Verificació:

kubectl version
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0

Regla de compatibilitat (version skew): kubectl admet una diferència d'una versió menor amunt o avall respecte al servidor. Un client 1.30 funciona amb servidors 1.29, 1.30 i 1.31. Amb diferències més grans poden fallar ordres concretes de manera poc evident, així que mantén el client a prop del servidor.

  1. El fitxer kubeconfig: clústers, usuaris i contextos

Quan a la lliçó anterior minikube va dir "kubectl is now configured to use rutas-norte", el que va fer va ser escriure a ~/.kube/config. Aquest fitxer respon a tres preguntes: a quin servidor parlo?, amb quines credencials? i en quin namespace per defecte?

# ~/.kube/config (simplificat)
apiVersion: v1
kind: Config
clusters:                       # A QUIN servidor
  - name: rutas-norte
    cluster:
      server: https://192.168.49.2:8443
      certificate-authority: /home/usuari/.minikube/ca.crt
users:                          # AMB QUINES credencials
  - name: rutas-norte
    user:
      client-certificate: /home/usuari/.minikube/profiles/rutas-norte/client.crt
      client-key: /home/usuari/.minikube/profiles/rutas-norte/client.key
contexts:                       # LA COMBINACIÓ de tots dos + namespace
  - name: rutas-norte
    context:
      cluster: rutas-norte
      user: rutas-norte
      namespace: default
current-context: rutas-norte    # quin està actiu ara

La idea clau: un context és una terna (clúster, usuari, namespace). Canviar de context és canviar de clúster o d'identitat amb una sola ordre. En un entorn professional tindràs contextos com rutas-norte-dev, rutas-norte-pre i rutas-norte-pro, i equivocar-te de context és la manera més ràpida de provocar un incident.

Ordres de gestió de context

# Veure tots els contextos disponibles; l'actiu porta asterisc
kubectl config get-contexts

# Canviar de context
kubectl config use-context rutas-norte

# Veure només el nom del context actiu
kubectl config current-context

# Fixar el namespace per defecte del context actiu
kubectl config set-context --current --namespace=rutas-norte-dev
CURRENT   NAME          CLUSTER       AUTHINFO      NAMESPACE
*         rutas-norte   rutas-norte   rutas-norte   rutas-norte-dev
          docker-desktop docker-desktop docker-desktop

Aquesta última ordre —fixar el namespace per defecte— t'estalviarà escriure -n rutas-norte-dev centenars de vegades durant el curs. Fes-ho tan bon punt creïs el namespace a la lliçó 01-07.

Variable KUBECONFIG: pots tenir diversos fitxers i combinar-los. És l'habitual quan treballes amb diversos clients o entorns:

export KUBECONFIG=~/.kube/config:~/.kube/rutas-norte-pro.yaml
kubectl config get-contexts

Consell de seguretat: el kubeconfig conté credencials. Tracta'l com una clau privada: permisos 600, mai a Git, mai per xat.

  1. Anatomia d'una ordre kubectl

Tota la CLI segueix aquesta gramàtica:

kubectl [verb] [tipus] [nom] [banderes]
         │      │       │     │
         │      │       │     └── -n, -o, -l, --dry-run, --watch...
         │      │       └──────── nom de l'objecte (opcional: si falta, tots)
         │      └──────────────── pod, deployment, service, pvc, node...
         └─────────────────────── get, describe, apply, delete, logs, exec...

Exemples llegits en veu alta:

kubectl get pods                                  # dona'm tots els pods del namespace actual
kubectl get pod api-reserves -n rutas-norte-dev   # dona'm aquell pod concret d'aquell namespace
kubectl describe deployment botiga-web            # explica'm en detall aquell Deployment
kubectl delete pod api-reserves                   # esborra aquell pod

Noms, plurals i abreviatures

Kubernetes accepta singular, plural i abreviatura indistintament. kubectl get po, kubectl get pod i kubectl get pods són idèntics. Les abreviatures que més estalvien:

Tipus Abreviatura Tipus Abreviatura
pods po services svc
deployments deploy namespaces ns
replicasets rs configmaps cm
statefulsets sts persistentvolumeclaims pvc
daemonsets ds persistentvolumes pv
ingresses ing serviceaccounts sa

La llista completa i autoritativa del teu clúster, amb abreviatures, grup d'API i si el recurs viu en un namespace:

kubectl api-resources
NAME          SHORTNAMES   APIVERSION   NAMESPACED   KIND
configmaps    cm           v1           true         ConfigMap
pods          po           v1           true         Pod
services      svc          v1           true         Service
nodes         no           v1           false        Node
deployments   deploy       apps/v1      true         Deployment
ingresses     ing          networking.k8s.io/v1  true  Ingress

La columna NAMESPACED és important: explica per què kubectl get nodes -n rutas-norte-dev ignora el namespace (els nodes són d'àmbit de clúster).

El namespace, sempre present

kubectl get pods                       # namespace del context actual
kubectl get pods -n rutas-norte-pre    # un namespace concret
kubectl get pods -A                    # tots els namespaces (--all-namespaces)

Oblidar el namespace és la causa número u de "el meu pod ha desaparegut".

  1. Els verbs del dia a dia

Treballarem sobre un escenari de Rutas Norte amb la botiga web i l'API ja desplegades a rutas-norte-dev.

4.1. get — inventari ràpid

kubectl get pods -n rutas-norte-dev
NAME                            READY   STATUS             RESTARTS      AGE
api-reserves-6c8d7f9b45-2xk9p   1/1     Running            0             12m
api-reserves-6c8d7f9b45-hn4vq   1/1     Running            0             12m
botiga-web-7d4f8c6b9-lq2mn      1/1     Running            0             18m
worker-notificacions-59c7d8f    0/1     CrashLoopBackOff   5 (48s ago)   9m

Com llegir cada columna:

  • READY 1/1: contenidors llestos / contenidors totals del pod. 0/1 significa que el contenidor existeix però no ha superat la seva sonda de disponibilitat.
  • STATUS: Running és el normal; Pending (el scheduler no troba lloc), ContainerCreating, ImagePullBackOff (no pot descarregar la imatge), CrashLoopBackOff (arrenca i mor en bucle), Completed (tasques acabades).
  • RESTARTS: reinicis. Un nombre que creix és el senyal més clar d'un problema.
  • AGE: des de la creació de l'objecte.

En aquesta sortida, worker-notificacions està clarament trencat. Els tres verbs següents són com s'investiga.

4.2. describe — el diagnòstic

kubectl describe pod worker-notificacions-59c7d8f -n rutas-norte-dev
Name:         worker-notificacions-59c7d8f
Namespace:    rutas-norte-dev
Node:         rutas-norte/192.168.49.2
Labels:       app=worker-notificacions
              app.kubernetes.io/part-of=rutas-norte
              entorn=dev
Status:       Running
Containers:
  worker:
    Image:          registry.rutasnorte.example/worker-notificacions:1.2.0
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
    Restart Count:  5
Events:
  Type     Reason     Age                   From     Message
  ----     ------     ----                  ----     -------
  Normal   Scheduled  9m                    default-scheduler  Successfully assigned ...
  Normal   Pulled     8m (x4 over 9m)       kubelet  Container image already present
  Warning  BackOff    45s (x22 over 8m)     kubelet  Back-off restarting failed container

La secció Events és el primer que cal llegir sempre. És el diari del que el clúster ha intentat fer amb aquell objecte i per què ha fallat. Aquí ens diu que el contenidor acaba amb codi 1 i el kubelet el reintenta amb espera creixent. També veiem que el scheduler sí que el va assignar (per tant no és un problema de recursos) i que la imatge es va descarregar bé (per tant no és un problema de registre): la fallada és dins de l'aplicació.

describe funciona amb qualsevol tipus: kubectl describe node rutas-norte, kubectl describe svc api-reserves, kubectl describe pvc dades-postgres.

4.3. logs — la veu de l'aplicació

# Últimes línies del pod
kubectl logs worker-notificacions-59c7d8f -n rutas-norte-dev

# Els logs de l'execució ANTERIOR: imprescindible en CrashLoopBackOff
kubectl logs worker-notificacions-59c7d8f -n rutas-norte-dev --previous

# Seguir en viu, últimes 50 línies, amb marques de temps
kubectl logs -f --tail=50 --timestamps api-reserves-6c8d7f9b45-2xk9p -n rutas-norte-dev

# Logs agregats de TOTES les rèpliques seleccionades per etiqueta
kubectl logs -l app=api-reserves -n rutas-norte-dev --tail=20

# Un contenidor concret d'un pod multicontenidor
kubectl logs el-meu-pod -c sidecar-metriques
[2026-08-05T02:14:07Z] worker-notificacions v1.2.0 arrencant
[2026-08-05T02:14:07Z] connectant a redis-cache:6379
[2026-08-05T02:14:12Z] ERROR: dial tcp: lookup redis-cache: no such host
[2026-08-05T02:14:12Z] proces acabat amb codi 1

Aquí hi ha la causa: el worker no troba redis-cache per DNS, probablement perquè el Service encara no existeix. --previous és la bandera que més s'oblida i la més útil: sense ella, en un CrashLoopBackOff veuràs els logs d'un contenidor que acaba d'arrencar i encara no ha fallat.

4.4. exec — entrar al contenidor

# Una ordre puntual
kubectl exec api-reserves-6c8d7f9b45-2xk9p -n rutas-norte-dev -- env | grep DB_

# Sessió interactiva
kubectl exec -it api-reserves-6c8d7f9b45-2xk9p -n rutas-norte-dev -- sh
DB_HOST=postgres-reserves
DB_PORT=5432
DB_NAME=reserves

El -- separa les banderes de kubectl de l'ordre a executar a dins; oblidar-lo és un error clàssic. -it significa interactiu amb terminal, igual que a Docker.

Nota professional: moltes imatges ben construïdes són distroless i no tenen ni sh ni eines de xarxa. Per a aquests casos existeix kubectl debug, que injecta un contenidor efímer amb utilitats; ho veurem al mòdul 7.

4.5. apply i delete — canviar l'estat desitjat

kubectl apply -f k8s/base/api-reserves.yaml         # un fitxer
kubectl apply -f k8s/base/                          # tots els del directori
kubectl apply -f k8s/base/ --recursive              # incloent-hi subdirectoris

kubectl delete -f k8s/base/api-reserves.yaml        # esborrar el que declara el fitxer
kubectl delete pod api-reserves-6c8d7f9b45-2xk9p    # esborrar un objecte concret
kubectl delete pods -l app=api-reserves             # esborrar per etiqueta

apply és el cor del model declaratiu i l'estudiarem a fons a la lliçó següent, Objectes, Manifests YAML i el Model Declaratiu.

Sobre delete: recorda que l'esborrat és asíncron i que esborrar un pod gestionat per un controlador no l'elimina, només provoca que se'n creï un de nou. Per eliminar-lo de debò cal esborrar el controlador.

4.6. edit — modificació puntual en calent

kubectl edit deployment api-reserves -n rutas-norte-dev

Obre l'objecte al teu editor ($EDITOR) i en desar aplica els canvis. És còmode per experimentar i perillós en producció: el canvi no queda a Git, així que el següent apply des del repositori el revertirà silenciosament. Fes-lo servir per explorar; mai com a forma de desplegar.

4.7. port-forward — accés local sense exposar res

kubectl port-forward pod/botiga-web-7d4f8c6b9-lq2mn 8080:80 -n rutas-norte-dev
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

Ara http://localhost:8080 arriba a aquell pod. El format és port-local:port-del-contenidor. També funciona contra un Service (svc/api-reserves 8081:80). És la manera més ràpida de comprovar que alguna cosa funciona abans de tenir Ingress, i és exactament el que faràs servir a la lliçó 01-07 per veure la botiga de Rutas Norte al teu navegador. El procés queda en primer pla: es talla amb Ctrl+C.

4.8. explain — la documentació fora de línia

kubectl explain pod.spec.containers.resources
KIND:       Pod
VERSION:    v1
FIELD: resources <ResourceRequirements>
DESCRIPTION:
    Compute Resources required by this container. Cannot be updated.
FIELDS:
  limits <map[string]Quantity>
    Limits describes the maximum amount of compute resources allowed.
  requests <map[string]Quantity>
    Requests describes the minimum amount of compute resources required.

Aquesta ordre mereix un paràgraf a part perquè és la que més rendibilitat té a llarg termini. Consulta l'esquema del teu propi clúster, inclosos els CRDs instal·lats, així que mai no et dona informació desactualitzada ni d'una altra versió. Funciona a qualsevol profunditat i amb --recursive mostra l'arbre complet de camps:

kubectl explain deployment.spec.strategy
kubectl explain ingress.spec --recursive | head -30

A la certificació CKA/CKAD, on només es permet consultar la documentació oficial, kubectl explain és la drecera que estalvia minuts.

  1. Formats de sortida i consultes

La bandera -o transforma kubectl de visor en eina de consulta.

Format Per a què serveix
(per defecte) Taula resumida llegible
-o wide Afegeix columnes: IP del pod, node, imatge
-o yaml L'objecte complet tal com és a l'API, amb el seu status
-o json Igual, en JSON, per processar amb jq
-o name Només tipus/nom, ideal per encadenar ordres
-o jsonpath='...' Extreu camps concrets
-o custom-columns=... Taula a mida
kubectl get pods -o wide -n rutas-norte-dev
NAME                            READY   STATUS    IP           NODE          NOMINATED NODE
api-reserves-6c8d7f9b45-2xk9p   1/1     Running   10.244.0.17  rutas-norte   <none>
botiga-web-7d4f8c6b9-lq2mn      1/1     Running   10.244.0.14  rutas-norte   <none>
# L'objecte complet, incloent-hi el que ha escrit el sistema
kubectl get pod api-reserves-6c8d7f9b45-2xk9p -n rutas-norte-dev -o yaml | head -25

# Extreure camps concrets amb jsonpath
kubectl get pods -n rutas-norte-dev \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

# Taula a mida: nom, imatge i node
kubectl get pods -n rutas-norte-dev \
  -o custom-columns='POD:.metadata.name,IMATGE:.spec.containers[0].image,NODE:.spec.nodeName'

# Ordenar: els pods que més han reiniciat, primer
kubectl get pods -A --sort-by=.status.containerStatuses[0].restartCount

# Ordenar per antiguitat
kubectl get pods -n rutas-norte-dev --sort-by=.metadata.creationTimestamp
POD                             IMATGE                                                    NODE
api-reserves-6c8d7f9b45-2xk9p   registry.rutasnorte.example/api-reserves:2.4.0            rutas-norte
botiga-web-7d4f8c6b9-lq2mn      registry.rutasnorte.example/botiga-web:1.8.0              rutas-norte

custom-columns i jsonpath són les dues eines que converteixen kubectl en una cosa apta per a auditories ràpides: "dona'm totes les imatges en ús a producció", "digues-me quins pods no tenen límits de memòria".

  1. Selecció per etiquetes i observació en viu

Recorda de la lliçó Conceptes i Terminologia Clau que les etiquetes són el mecanisme d'acoblament del sistema. La bandera -l et dona accés a aquest mateix mecanisme des de la CLI:

# Igualtat
kubectl get pods -l app=api-reserves -n rutas-norte-dev

# Diverses condicions (AND)
kubectl get pods -l app=api-reserves,entorn=dev -n rutas-norte-dev

# Desigualtat
kubectl get pods -l 'entorn!=pro' -A

# Conjunts
kubectl get pods -l 'app in (api-reserves,botiga-web)' -n rutas-norte-dev
kubectl get pods -l 'app notin (informes-ocupacio)' -n rutas-norte-dev

# Existència de la clau, amb qualsevol valor
kubectl get pods -l app.kubernetes.io/part-of -A

# Tota la plataforma Rutas Norte, de qualsevol tipus, d'un sol cop
kubectl get all -l app.kubernetes.io/part-of=rutas-norte -A

Aquesta última consulta és la raó per la qual val la pena ser disciplinat amb l'esquema d'etiquetes del projecte: et permet veure, esborrar o inspeccionar la plataforma sencera amb una sola ordre.

Observació en viu amb --watch (o -w): l'ordre no acaba i va imprimint els canvis a mesura que passen. És la millor manera de veure el bucle de reconciliació en acció:

kubectl get pods -l app=api-reserves -n rutas-norte-dev --watch
NAME                            READY   STATUS              RESTARTS   AGE
api-reserves-6c8d7f9b45-2xk9p   1/1     Running             0          12m
api-reserves-6c8d7f9b45-2xk9p   1/1     Terminating         0          14m
api-reserves-6c8d7f9b45-wq7rt   0/1     Pending             0          0s
api-reserves-6c8d7f9b45-wq7rt   0/1     ContainerCreating   0          1s
api-reserves-6c8d7f9b45-wq7rt   1/1     Running             0          4s

Reconeixes aquesta seqüència: és exactament el recorregut de la lliçó Arquitectura de KubernetesPending mentre el scheduler decideix, ContainerCreating mentre el kubelet treballa, Running quan el contenidor viu— passant davant dels teus ulls perquè el ReplicaSet ha reposat un pod esborrat.

Ordres germanes que també esperen:

kubectl wait --for=condition=Ready pod -l app=api-reserves -n rutas-norte-dev --timeout=60s
kubectl get events -n rutas-norte-dev --watch

  1. Imperatiu enfront de declaratiu

kubectl admet els dos estils i convé tenir criteri sobre quan fer servir cadascun.

Aspecte Imperatiu Declaratiu
Ordre típica kubectl create deployment ..., kubectl scale, kubectl expose kubectl apply -f k8s/
Font de veritat L'historial del teu terminal Els fitxers del repositori
Reproduïble No
Revisable en una petició de canvi No
Velocitat per a alguna cosa puntual Molt alta Mitjana
Ús recomanat Aprendre, proves ràpides, exàmens cronometrats Tot el que arribi a un entorn real
# Imperatiu: ràpid, però no queda rastre en cap fitxer
kubectl create deployment api-reserves --image=registry.rutasnorte.example/api-reserves:2.4.0
kubectl scale deployment api-reserves --replicas=4
kubectl expose deployment api-reserves --port=80 --target-port=3000

# Declaratiu: l'estat desitjat viu a Git
kubectl apply -f k8s/base/api-reserves.yaml

El punt intermedi, i probablement el truc més útil de tota la lliçó: generar el manifest amb una ordre imperativa i desar-lo, fent servir --dry-run=client -o yaml.

kubectl create deployment api-reserves \
  --image=registry.rutasnorte.example/api-reserves:2.4.0 \
  --dry-run=client -o yaml > k8s/base/api-reserves.yaml

Això no crea res al clúster: només imprimeix el YAML que kubectl hauria enviat. L'edites, el versiones i l'apliques. És la manera habitual de no escriure manifests des de zero, i a la CKAD és pràcticament obligatori per arribar a temps. La lliçó següent aprofundeix en --dry-run, kubectl diff i la mecànica interna d'apply.

  1. Productivitat: àlies, autocompletat, explain i plugins

Afegeix això al teu ~/.bashrc o ~/.zshrc. La diferència de comoditat és enorme:

# Autocompletat (bash)
source <(kubectl completion bash)

# Àlies curt i autocompletat també per a l'àlies
alias k=kubectl
complete -o default -F __start_kubectl k

# Dreceres habituals
alias kgp='kubectl get pods'
alias kgpw='kubectl get pods -o wide'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias kaf='kubectl apply -f'
alias kns='kubectl config set-context --current --namespace'

Per a zsh, substitueix completion bash per completion zsh. Amb això, k get po -n <TAB> et completa fins i tot els noms dels namespaces existents, perquè l'autocompletat consulta l'API.

Altres eines que convé conèixer, encara que no les fem servir encara:

Eina Què aporta
krew Gestor de plugins de kubectl (kubectl krew install ...)
kubectl ctx / kubectl ns (plugins ctx i ns) Canviar de context i namespace de manera interactiva
kubectl tree Veure la jerarquia Deployment → ReplicaSet → Pod
kubectl neat Neteja un -o yaml de camps generats pel sistema
stern Logs agregats i acolorits de molts pods alhora
k9s Interfície de terminal per navegar pel clúster

Instal·lar krew i un plugin, a tall d'exemple:

kubectl krew install ctx ns
kubectl ns rutas-norte-dev

Res d'això no és imprescindible, però en un dia de feina real estalvia hores. L'essencial és l'anterior: àlies, autocompletat i kubectl explain.

Errors Comuns i Consells

  • Treballar al context equivocat. L'error més car de tots. Abans de qualsevol ordre destructiva, kubectl config current-context. Configura el teu prompt per mostrar context i namespace (kube-ps1, starship, oh-my-zsh) i tracta-ho com a innegociable tan bon punt tinguis accés a un entorn de producció.
  • Oblidar el namespace. Si un objecte "no existeix", prova-ho amb -A abans de concloure res. Fixa el namespace per defecte amb kubectl config set-context --current --namespace=....
  • Llegir logs sense --previous en un CrashLoopBackOff. Veuràs l'arrencada del contenidor actual, no l'error que va matar l'anterior.
  • Ometre el -- a kubectl exec. Sense ell, kubectl interpreta les banderes de la teva ordre com a seves i falla de manera confusa.
  • Fer servir kubectl edit com a mètode de desplegament. El canvi no queda enlloc i es perd en el següent apply. Serveix per investigar, no per operar.
  • Creure que kubectl delete pod elimina l'aplicació. Si hi ha un controlador al darrere, el pod torna. Cal esborrar el Deployment, o millor, el manifest amb kubectl delete -f.
  • Ignorar kubectl explain. És documentació exacta de la teva versió, sense connexió a internet i sense canviar de finestra. Acostuma't a fer-lo servir abans que a buscar al web.
  • Consell: memoritza aquest trio de diagnòstic i aplica'l sempre en aquest ordre — kubectl get (existeix i en quin estat?), kubectl describe (què ha intentat el clúster i què diuen els esdeveniments?), kubectl logs (què diu l'aplicació?). Resol la gran majoria de les incidències.

Exercicis

Exercici 1: Context, namespace i exploració

Sobre el teu clúster rutas-norte:

  1. Mostra el context actiu i comprova que és el correcte.
  2. Crea el namespace rutas-norte-dev i fixa'l com a namespace per defecte del context.
  3. Llista tots els pods del clúster, de tots els namespaces, mostrant el node i la IP.
  4. Esbrina, sense sortir del terminal i sense buscar a internet, què significa el camp spec.restartPolicy d'un pod i quins valors admet.
  5. Mostra els pods de kube-system ordenats per antiguitat, del més antic al més recent.

Exercici 2: Consultes avançades d'auditoria

L'equip de seguretat de Rutas Norte demana un inventari. Escriu les ordres que responen a:

  1. Totes les imatges en ús al clúster, amb el pod i el namespace al qual pertanyen, en format de taula.
  2. Els pods de tot el clúster ordenats per nombre de reinicis, per localitzar els inestables.
  3. Només els noms dels pods que tinguin l'etiqueta app.kubernetes.io/part-of=rutas-norte, en format apte per encadenar amb una altra ordre.
  4. Tots els recursos del clúster que no viuen en un namespace.

Exercici 3: De l'imperatiu al declaratiu

Sense crear res al clúster, genera el manifest YAML d'un pod anomenat botiga-web amb la imatge registry.rutasnorte.example/botiga-web:1.8.0, desa'l a k8s/base/botiga-web-pod.yaml, i després explica quina diferència hi ha entre executar aquella ordre amb --dry-run=client i sense. Com a comprovació addicional, esbrina amb kubectl si el recurs Pod pertany al grup d'API core o a apps.

Solucions

Solució 1

# 1
kubectl config current-context                       # -> rutas-norte

# 2
kubectl create namespace rutas-norte-dev
kubectl config set-context --current --namespace=rutas-norte-dev

# 3
kubectl get pods -A -o wide

# 4
kubectl explain pod.spec.restartPolicy
FIELD: restartPolicy <string>
DESCRIPTION:
    Restart policy for all containers within the pod. One of Always, OnFailure,
    Never. Default to Always.
# 5
kubectl get pods -n kube-system --sort-by=.metadata.creationTimestamp

Solució 2

# 1
kubectl get pods -A -o custom-columns='NS:.metadata.namespace,POD:.metadata.name,IMATGE:.spec.containers[*].image'

# 2
kubectl get pods -A --sort-by=.status.containerStatuses[0].restartCount

# 3
kubectl get pods -A -l app.kubernetes.io/part-of=rutas-norte -o name

# 4
kubectl api-resources --namespaced=false

El punt 3 retorna línies del tipus pod/api-reserves-6c8d7f9b45-2xk9p, que es poden passar directament a kubectl delete o kubectl describe. El punt 4 llista nodes, namespaces, persistentvolumes, storageclasses, clusterroles, entre d'altres: els recursos d'àmbit de clúster que vam veure a la lliçó de conceptes.

Solució 3

kubectl run botiga-web \
  --image=registry.rutasnorte.example/botiga-web:1.8.0 \
  --dry-run=client -o yaml > k8s/base/botiga-web-pod.yaml

Diferència: amb --dry-run=client, kubectl construeix l'objecte localment i l'imprimeix, sense enviar res al servidor; no es crea cap pod i ni tan sols cal que el clúster estigui arrencat. Sense aquesta bandera, la petició s'envia a l'apiserver, passa autenticació, autorització i admissió, s'escriu a etcd i el pod es crea de debò. Existeix a més --dry-run=server, que sí que envia la petició però indica al servidor que no la persisteixi: valida contra els webhooks d'admissió reals sense crear res. Ho veurem a la lliçó següent.

Per al grup d'API:

kubectl api-resources | grep -w pods
pods    po    v1    true    Pod

La columna APIVERSION mostra v1 a seques, sense barra ni prefix de grup: això significa que Pod pertany al grup core (o "legacy"), a diferència de Deployment, que apareix com a apps/v1.

Conclusió

kubectl és un client HTTP amb una gramàtica molt regular: verb, tipus, nom i banderes. Dominar-lo consisteix a interioritzar aquesta gramàtica, saber sempre en quin context i namespace estàs treballant, manejar amb desimboltura el trio de diagnòstic getdescribelogs, i aprofitar els formats de sortida i la selecció per etiquetes per convertir la CLI en una eina de consulta real. Amb kubectl explain tens a més documentació exacta del teu propi clúster sense sortir del terminal, i amb els àlies i l'autocompletat la feina diària deixa de ser teclejar.

En aquesta lliçó hem fet servir apply sense explicar del tot què fa per dins, i hem vist manifests YAML sense desmenuçar-ne l'estructura. Aquest deute el salda la lliçó següent, Objectes, Manifests YAML i el Model Declaratiu: anatomia camp a camp d'un objecte, grups i versions de l'API, el YAML que cal saber, la diferència real entre apply, create i replace, les eines de validació prèvia i com organitzar els manifests de Rutas Norte al directori k8s/.

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