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
- Què és kubectl i instal·lació
- El fitxer kubeconfig: clústers, usuaris i contextos
- Anatomia d'una ordre kubectl
- Els verbs del dia a dia
- Formats de sortida i consultes
- Selecció per etiquetes i observació en viu
- Imperatiu enfront de declaratiu
- Productivitat: àlies, autocompletat, explain i plugins
- 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 kubectlmacOS:
Windows (PowerShell):
Verificació:
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0Regla 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.
- 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 araLa 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-devCURRENT NAME CLUSTER AUTHINFO NAMESPACE
* rutas-norte rutas-norte rutas-norte rutas-norte-dev
docker-desktop docker-desktop docker-desktopAquesta ú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:
Consell de seguretat: el kubeconfig conté credencials. Tracta'l com una clau privada: permisos
600, mai a Git, mai per xat.
- 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 podNoms, 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:
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 IngressLa 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".
- 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
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) 9mCom llegir cada columna:
- READY
1/1: contenidors llestos / contenidors totals del pod.0/1significa 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
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 containerLa 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 1Aquí 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 -- shEl -- 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 etiquetaapply é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
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
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
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:
A la certificació CKA/CKAD, on només es permet consultar la documentació oficial, kubectl explain és la drecera que estalvia minuts.
- 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 |
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.creationTimestampPOD 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-nortecustom-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".
- 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 -AAquesta ú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ó:
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 4sReconeixes aquesta seqüència: és exactament el recorregut de la lliçó Arquitectura de Kubernetes —Pending 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
- 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 | Sí |
| Revisable en una petició de canvi | No | Sí |
| 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.yamlEl 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.yamlAixò 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.
- 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:
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
-Aabans de concloure res. Fixa el namespace per defecte ambkubectl config set-context --current --namespace=.... - Llegir
logssense--previousen unCrashLoopBackOff. Veuràs l'arrencada del contenidor actual, no l'error que va matar l'anterior. - Ometre el
--akubectl exec. Sense ell, kubectl interpreta les banderes de la teva ordre com a seves i falla de manera confusa. - Fer servir
kubectl editcom a mètode de desplegament. El canvi no queda enlloc i es perd en el següentapply. Serveix per investigar, no per operar. - Creure que
kubectl delete podelimina l'aplicació. Si hi ha un controlador al darrere, el pod torna. Cal esborrar el Deployment, o millor, el manifest ambkubectl 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:
- Mostra el context actiu i comprova que és el correcte.
- Crea el namespace
rutas-norte-devi fixa'l com a namespace per defecte del context. - Llista tots els pods del clúster, de tots els namespaces, mostrant el node i la IP.
- Esbrina, sense sortir del terminal i sense buscar a internet, què significa el camp
spec.restartPolicyd'un pod i quins valors admet. - Mostra els pods de
kube-systemordenats 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:
- Totes les imatges en ús al clúster, amb el pod i el namespace al qual pertanyen, en format de taula.
- Els pods de tot el clúster ordenats per nombre de reinicis, per localitzar els inestables.
- 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. - 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.restartPolicyFIELD: restartPolicy <string>
DESCRIPTION:
Restart policy for all containers within the pod. One of Always, OnFailure,
Never. Default to Always.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=falseEl 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.yamlDiferè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:
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 get → describe → logs, 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
- Què és Kubernetes?
- Arquitectura de Kubernetes
- Conceptes i Terminologia Clau
- Configuració d'un Clúster de Kubernetes
- La CLI de Kubernetes: kubectl
- Objectes, Manifests YAML i el Model Declaratiu
- El Projecte del Curs: la Plataforma Rutas Norte
Mòdul 2: Components Principals de Kubernetes
- Pods
- ReplicaSets
- Deployments
- Actualitzacions, Rollbacks i Estratègies de Desplegament
- Serveis
- Namespaces
- Etiquetes, Selectors i Anotacions
Mòdul 3: Gestió de Configuració i Secrets
- ConfigMaps
- Secrets
- Variables d'Entorn
- Quotes i Límits de Recursos
- LimitRanges i Classes de Qualitat de Servei (QoS)
- ServiceAccounts i Accés a l'API des dels Pods
Mòdul 4: Xarxes a Kubernetes
- Xarxes de Clúster
- Tipus de Serveis
- DNS Intern i Descobriment de Serveis
- Controladors d'Ingress
- TLS i Gestió de Certificats amb cert-manager
- Polítiques de Xarxa
Mòdul 5: Emmagatzematge a Kubernetes
- Volums
- Volums Persistents
- Reclamacions de Volums Persistents
- Classes d'Emmagatzematge
- Aprovisionament Dinàmic, Expansió i Snapshots
- Còpies de Seguretat i Restauració de Dades
Mòdul 6: Conceptes Avançats de Kubernetes
- StatefulSets
- DaemonSets
- Treballs i CronJobs
- Init Containers, Sidecars i Patrons Multicontenidor
- Planificació: Afinitat, Taints i Toleracions
- Definicions de Recursos Personalitzats (CRDs)
- Operadors i el Patró Controlador
Mòdul 7: Monitoratge i Registre
- Verificacions de Salut i Sondes
- Servidor de Mètriques i kubectl top
- Monitoratge amb Prometheus
- Visualització i Alertes amb Grafana i Alertmanager
- Registre Centralitzat amb Elasticsearch, Fluentd i Kibana (EFK)
- Depuració d'Aplicacions i Esdeveniments del Clúster
Mòdul 8: Seguretat a Kubernetes
- Control d'Accés Basat en Rols (RBAC)
- Contextos de Seguretat i Enduriment del Contenidor
- Polítiques de Seguretat de Pods i Pod Security Standards
- Seguretat de Xarxa
- Seguretat d'Imatges
- Auditoria, Escaneig i Gestió de Vulnerabilitats
Mòdul 9: Escalat i Rendiment
- Autoescalat Horitzontal de Pods
- Autoescalat Vertical de Pods
- Autoescalat de Clúster
- Escalat per Esdeveniments i Mètriques Personalitzades amb KEDA
- Alta Disponibilitat: PodDisruptionBudgets i Topologia
- Ajust de Rendiment
Mòdul 10: Ecosistema i Eines de Kubernetes
- Minikube i Entorns Locals amb kind
- Kubeadm
- Helm
- Kustomize
- GitOps amb Argo CD i Flux
- Kubernetes Gestionat: EKS, AKS i GKE
Mòdul 11: Estudis de Cas i Aplicacions del Món Real
- Desplegament d'una Aplicació Web
- Execució d'Aplicacions amb Estat
- CI/CD amb Kubernetes
- Estratègies de Desplegament: Blue-Green i Canary
- Gestió Multi-Clúster
- Operació en Producció: Incidències, Runbooks i Costos
