Fins ara, en tot el curs, hi ha hagut un clúster. Els namespaces rutas-norte-dev, rutas-norte-pre i rutas-norte-pro hi convivien, separats per quotes, polítiques de xarxa i RBAC. És una arquitectura perfectament defensable i és on comença gairebé tothom.
Però arriba un moment en què deixa de ser-ho. Pot ser una actualització del pla de control que afecta els tres entorns alhora; pot ser l'auditor preguntant per què el clúster que executa rutas-norte-dev té accés a la xarxa on viuen les dades personals de producció; pot ser que l'empresa obri operacions en una altra regió i la latència des de Portugal a eu-west-1 comenci a notar-se en la conversió. A Rutas Norte va ser el primer: una actualització d'EKS que va sortir malament a pre va deixar també pro inaccessible durant dinou minuts.
Aquesta lliçó tracta de què canvia quan la plataforma deixa de cabre en un clúster: per què s'hi arriba, quines topologies existeixen, com es treballa cada dia sense aplicar al clúster equivocat, com Argo CD governa una flota, com es connecten clústers entre si, i el problema que no té solució fàcil quan cal recuperar-se d'un desastre, que és la dada.
Advertiment de compliment normatiu. La distribució de clústers entre regions afecta directament la residència de les dades personals dels clients de Rutas Norte. Replicar
postgres-reservesa una altra regió, emmagatzemar còpies de seguretat fora de la regió principal, o permetre que un clúster d'una regió consulti dades allotjades en una altra, són decisions amb implicacions legals que han de ser revisades i aprovades pel responsable de compliment normatiu abans d'implantar-se. Els exemples d'aquesta lliçó són il·lustratius.
Contingut
- Per què una empresa acaba amb diversos clústers
- Topologies habituals i quina triar
- El treball diari amb diversos contextos
- Desplegament multi-clúster amb Argo CD
- Configuració i polítiques comunes: el clúster com a producte
- Connectivitat entre clústers
- Recuperació davant de desastres
- El pla de Rutas Norte
- El cost, la complexitat i quan no fer-ho
- Per què una empresa acaba amb diversos clústers
No és una decisió que es prengui un matí. S'hi arriba per acumulació de raons, i convé reconèixer-les per saber quina t'hi està empenyent.
1.1. Aïllament entre producció i la resta
Els namespaces separen càrregues, però no separen el pla de control. Comparteixen servidor d'API, etcd, planificador, CNI, controlador d'Ingress i complements. Tot el que sigui "de clúster" és compartit: CRDs, ClusterRole, webhooks d'admissió, versions d'operadors.
A la pràctica, això significa que un desenvolupador que desplega un CRD mal format a dev, o un operador que consumeix memòria sense control, pot degradar producció. A Rutas Norte va ser un webhook de validació mal configurat a dev el que, en no respondre, va bloquejar la creació de pods a tot el clúster durant vuit minuts, producció inclosa.
1.2. Radi d'impacte
Amb un clúster, la pregunta "què passa si el clúster falla?" té una resposta única i molt dolenta: tot cau. El pla de control gestionat d'EKS és molt fiable, però no és l'únic punt de fallada: una NetworkPolicy massa àmplia, un esgotament d'IP de la VPC, una versió de CNI defectuosa o un error humà amb kubectl delete afecten tot el que hi ha a dins.
1.3. Regions i latència
Rutas Norte opera principalment al nord peninsular, però està estudiant expandir-se al sud de França. Una petició des de Tolosa a eu-west-1 (Irlanda) suma uns 35-45 ms d'anada i tornada només per la xarxa. Sobre una compra de bitllet amb sis crides encadenades, això són gairebé 300 ms de latència afegida que l'usuari percep.
1.4. Requisits normatius de residència de la dada
Aquest és el motiu que no admet discussió tècnica: si la normativa aplicable, un contracte amb un client corporatiu o una decisió del responsable de compliment exigeix que les dades personals de determinats clients no surtin d'un territori, cal infraestructura en aquell territori. No hi ha configuració de namespace que resolgui això.
1.5. Versions diferents
Kubernetes publica una versió menor cada quatre mesos aproximadament, i el suport de cadascuna dura al voltant de catorze. Actualitzar és obligatori, i provar l'actualització al mateix clúster que produeix és impossible per definició. Amb diversos clústers es pot portar dev a la versió nova, deixar que trenqui el que hagi de trencar, i actualitzar producció setmanes després amb la lliçó apresa.
1.6. El clúster també s'actualitza
Relacionat, però diferent: fins i tot les actualitzacions que surten bé tenen finestres de risc. Els nodes es reemplacen, els complements es reinicien, el CNI s'actualitza. Amb un sol clúster, cada actualització és un esdeveniment de producció. Amb dos, és un esdeveniment de producció una vegada cada dues actualitzacions, perquè la primera s'ha assajat.
1.7. I el que costa
| Cost | Detall |
|---|---|
| Pla de control | A EKS, uns 73 €/mes per clúster; multiplicat per la flota |
| Complements duplicats | Prometheus, Grafana, ingress-nginx, cert-manager, Kyverno, Argo CD a cada clúster |
| Capacitat ociosa | Cada clúster necessita marge propi; no es comparteix |
| Complexitat operativa | Cada procediment s'executa N vegades, o cal automatitzar-lo per a N |
| Deriva entre clústers | El risc real: dos clústers que haurien de ser iguals deixen de ser-ho |
| Càrrega cognitiva | "En quin clúster sóc?" és una pregunta amb conseqüències |
La deriva mereix èmfasi: el problema de tenir diversos clústers no és tenir-los, és mantenir-los iguals. Un pedaç aplicat a mà en un i no en un altre genera una diferència que ningú no recorda fins que causa un incident mesos després. Tot el de l'apartat 5 existeix per combatre això.
- Topologies habituals i quina triar
| Topologia | Descripció | Avantatges | Inconvenients | Quan |
|---|---|---|---|---|
| Per entorn | Un clúster per a dev+pre, un altre per a pro |
Aïlla el pla de control de producció; permet assajar actualitzacions | Duplica complements; no resol regions | Gairebé sempre el primer pas. És el més rendible |
| Per regió | Un clúster per regió geogràfica | Latència baixa; residència de la dada; tolerància a fallada regional | Replicació de dades entre regions (el problema difícil) | Presència en diverses geografies o requisit normatiu |
| Per unitat de negoci | Un clúster per equip o producte | Autonomia total; costos clarament atribuïts | Proliferació; complements multiplicats; molta deriva | Organitzacions grans amb equips de plataforma per unitat |
| Per criticitat | Un per al que és crític, un altre per a la resta | Protegeix el que és important sense duplicar-ho tot | Frontera difusa: on va el que és intermedi? | Quan hi ha una diferència clara entre el crític i l'accessori |
| Clúster de gestió | Un que només allotja les eines (Argo CD, observabilitat central) i governa els altres | Punt únic de desplegament i visibilitat; no competeix amb les càrregues | Punt únic de fallada del govern; sobredimensionat per a flotes petites | A partir de tres o quatre clústers |
2.1. Recomanació
Comença per un. Un sol clúster amb namespaces ben separats, quotes, polítiques de xarxa i RBAC resol el 80 % dels casos i costa una fracció.
El primer desdoblament ha de ser producció davant de la resta. És el que aporta més per unitat de complexitat: aïlla el pla de control del que és crític, permet assajar actualitzacions i satisfà qualsevol auditoria raonable.
El segon, si arriba, ve imposat per la geografia o la normativa, no per preferències d'arquitectura.
El clúster de gestió, a partir del tercer. Amb dos clústers, Argo CD pot viure al de producció gestionant-los tots dos. Amb quatre, cal un lloc neutral.
graph TB
subgraph fase1["Fase 1 · avui"]
C1[Clúster únic<br/>ns dev / pre / pro]
end
subgraph fase2["Fase 2 · Rutas Norte ara"]
C2A[rutasnorte-pro<br/>eu-west-1]
C2B[rutasnorte-nopro<br/>dev + pre · eu-west-1]
ACD2[Argo CD a pro] -.gestiona.-> C2A
ACD2 -.gestiona.-> C2B
end
subgraph fase3["Fase 3 · si arriba l'expansió"]
MGT[Clúster de gestió<br/>Argo CD + observabilitat]
C3A[pro eu-west-1]
C3B[pro eu-west-3]
C3C[nopro]
MGT --> C3A
MGT --> C3B
MGT --> C3C
end
fase1 --> fase2 --> fase3
- El treball diari amb diversos contextos
Aquí és on es produeixen els accidents. Un kubectl delete deploy executat creient ser a dev quan s'és a pro és un incident real i freqüent.
3.1. El kubeconfig amb diversos clústers
# ~/.kube/config (fragment)
apiVersion: v1
kind: Config
current-context: rutasnorte-nopro
clusters:
- name: rutasnorte-pro
cluster:
server: https://ABC123.gr7.eu-west-1.eks.amazonaws.com
certificate-authority-data: LS0tLS1CRUdJTiBDRVJU...
- name: rutasnorte-nopro
cluster:
server: https://DEF456.gr7.eu-west-1.eks.amazonaws.com
certificate-authority-data: LS0tLS1CRUdJTiBDRVJU...
users:
- name: joan-pro
exec:
apiVersion: client.authentication.k8s.io/v1
command: aws
args: [eks, get-token, --cluster-name, rutasnorte-pro, --role-arn,
"arn:aws:iam::111122223333:role/rutasnorte-pro-lectura"]
- name: joan-nopro
exec:
apiVersion: client.authentication.k8s.io/v1
command: aws
args: [eks, get-token, --cluster-name, rutasnorte-nopro]
contexts:
# El nom del context és la primera línia de defensa: que faci por.
- name: PRODUCCIO-rutasnorte
context: { cluster: rutasnorte-pro, user: joan-pro, namespace: rutas-norte-pro }
- name: rutasnorte-nopro
context: { cluster: rutasnorte-nopro, user: joan-nopro, namespace: rutas-norte-dev }kubectl config get-contexts
kubectl config use-context rutasnorte-nopro
kubectl config current-contextCURRENT NAME CLUSTER NAMESPACE
PRODUCCIO-rutasnorte rutasnorte-pro rutas-norte-pro
* rutasnorte-nopro rutasnorte-nopro rutas-norte-dev3.2. kubectx i kubens
kubectx # llista contextos
kubectx rutasnorte-nopro # canvia de context
kubectx - # torna a l'anterior
kubens rutas-norte-pre # canvia de namespace sense tocar el contextSón dues utilitats petites que estalvien molt de temps. Instal·lar-les és el primer que fa qualsevol que treballi amb més d'un clúster.
3.3. Les mesures per no equivocar-se de clúster
Cinc capes, de la més tova a la més dura. Les tres primeres són avisos; les dues últimes són barreres reals.
Capa 1: el prompt mostra el context. És imprescindible. Sense això, tota la resta és opcional.
# ~/.bashrc — context i namespace al prompt, en vermell si és producció
context_k8s() {
local ctx ns
ctx=$(kubectl config current-context 2>/dev/null) || return
ns=$(kubectl config view --minify -o jsonpath='{..namespace}' 2>/dev/null)
if [[ "$ctx" == *PRODUCCIO* ]]; then
printf '\001\e[41;97m\002 ⚠ %s:%s \001\e[0m\002' "$ctx" "${ns:-default}"
else
printf '\001\e[36m\002(%s:%s)\001\e[0m\002' "$ctx" "${ns:-default}"
fi
}
PS1='$(context_k8s) \w \$ 'Fons vermell quan ets a producció. Sembla trivial i és la mesura que més accidents evita.
Capa 2: context per sessió, no global. El problema d'use-context és que canvia l'estat de totes les terminals obertes. Una solució millor és aïllar el kubeconfig per terminal:
# Àlies que obre una sessió amb el seu propi kubeconfig
alias k-pro='export KUBECONFIG=~/.kube/pro.yaml && echo "⚠ SESSIÓ DE PRODUCCIÓ"'
alias k-dev='export KUBECONFIG=~/.kube/nopro.yaml'Així, la terminal de producció és la de producció i prou: no hi ha manera que un use-context d'una altra finestra la canviï.
Capa 3: confirmació explícita per a verbs destructius.
# Embolcall de kubectl: demana confirmació a producció per al que és perillós
kubectl() {
local ctx; ctx=$(command kubectl config current-context 2>/dev/null)
if [[ "$ctx" == *PRODUCCIO* && "$1" =~ ^(delete|drain|cordon|scale|patch|replace|edit)$ ]]; then
echo "⚠ Executaràs '$1' a $ctx"
read -r -p "Escriu el nom del clúster per confirmar: " r
[[ "$r" == "$ctx" ]] || { echo "Cancel·lat."; return 1; }
fi
command kubectl "$@"
}Capa 4: contextos de només lectura per defecte. Aquesta és la primera barrera real, perquè no depèn de la disciplina de ningú. L'usuari joan-pro del kubeconfig assumeix el rol rutasnorte-pro-lectura, mapejat a un ClusterRole de només lectura:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: plataforma-lectura-pro
subjects:
- kind: Group
name: rutasnorte:plataforma
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view # ClusterRole integrat: get, list, watch. Res més.
apiGroup: rbac.authorization.k8s.ioEscriure a producció exigeix assumir explícitament un altre rol, amb una sessió temporal i un motiu registrat. És una fricció deliberada de trenta segons que converteix cada escriptura en un acte conscient.
Capa 5: no escriure mai a mà a producció. L'objectiu últim. Amb GitOps (10-05), l'únic que aplica canvis a pro és Argo CD. Les persones llegeixen, diagnostiquen i proposen canvis a Git. L'escriptura manual queda reservada per a incidents, amb el procediment d'assumpció de rol i el seu registre d'auditoria.
| Mesura | Cost d'implantació | Accidents que evita |
|---|---|---|
| Prompt amb context | 5 minuts | La majoria dels descuits |
| Kubeconfig per sessió | 10 minuts | Canvis de context creuats entre terminals |
| Confirmació en verbs destructius | 15 minuts | Els delete per inèrcia |
| Contextos de només lectura | 1 hora + RBAC | Tots els accidents d'escriptura casual |
Només GitOps escriu a pro |
El projecte sencer | Tot, i a més dona traçabilitat |
- Desplegament multi-clúster amb Argo CD
Argo CD gestiona clústers remots des d'una única instal·lació. Cada clúster es registra com a destí i les Application apunten al que correspongui.
4.1. Registrar clústers
# Des del clúster on viu Argo CD
argocd cluster add rutasnorte-nopro --name nopro \
--label entorn=nopro --label region=eu-west-1
argocd cluster add PRODUCCIO-rutasnorte --name pro \
--label entorn=pro --label region=eu-west-1 --label critic=true
argocd cluster listSERVER NAME VERSION STATUS LABELS
https://DEF456.gr7.eu-west-1.eks.amazonaws.com nopro 1.30 Successful entorn=nopro,region=eu-west-1
https://ABC123.gr7.eu-west-1.eks.amazonaws.com pro 1.30 Successful entorn=pro,region=eu-west-1,critic=true
https://kubernetes.default.svc in-cluster 1.30 SuccessfulLes etiquetes són la part important: són el que permet escriure "desplega això a tots els clústers de producció" sense enumerar-los.
argocd cluster add crea una ServiceAccount al clúster destí amb els permisos necessaris i en desa les credencials com un Secret al clúster d'Argo CD. Aquest Secret és una credencial d'alt valor: qui el llegeixi pot desplegar a producció. Ha d'estar protegit per RBAC estricte i, preferiblement, xifrat en repòs amb una clau gestionada externament.
4.2. El generador de clústers d'ApplicationSet
Un ApplicationSet genera Application automàticament a partir d'una plantilla i un generador. El generador de clústers en crea una per cada clúster que compleixi un selector.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: plataforma-base
namespace: argocd
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- clusters:
# Tots els clústers registrats amb aquesta etiqueta.
selector:
matchLabels:
rutasnorte.example/gestionat: "true"
template:
metadata:
# El nom inclou el clúster: una Application per clúster.
name: 'base-{{.name}}'
spec:
project: plataforma
source:
repoURL: https://github.com/rutasnorte/manifests
targetRevision: main
path: 'plataforma/base'
kustomize:
# Cada clúster té el seu patch amb les seves particularitats.
components:
- '../components/{{index .metadata.labels "entorn"}}'
destination:
server: '{{.server}}'
namespace: plataforma
syncPolicy:
automated: { prune: true, selfHeal: true }
syncOptions: [CreateNamespace=true]Això desplega els complements comuns (Kyverno, cert-manager, ingress-nginx, node-exporter) a tots els clústers etiquetats, amb les diferències per entorn resoltes per Kustomize.
Per a les aplicacions de negoci, el generador de matriu combina clústers amb aplicacions:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: rutas-norte-aplicacions
namespace: argocd
spec:
goTemplate: true
generators:
- matrix:
generators:
# Eix 1: clústers de producció
- clusters:
selector:
matchLabels: { entorn: pro }
# Eix 2: els components, llegits dels directoris del repositori
- git:
repoURL: https://github.com/rutasnorte/manifests
revision: main
directories:
- path: 'overlays/pro/*'
template:
metadata:
name: '{{.path.basename}}-{{.name}}'
annotations:
# Ordena el desplegament: la base de dades abans que l'API.
argocd.argoproj.io/sync-wave: '{{if eq .path.basename "postgres-reserves"}}-1{{else}}0{{end}}'
spec:
project: rutas-norte
source:
repoURL: https://github.com/rutasnorte/manifests
targetRevision: main
path: '{{.path.path}}'
destination:
server: '{{.server}}'
namespace: 'rutas-norte-pro'
syncPolicy:
automated: { prune: true, selfHeal: true }Amb dos clústers de producció i sis components, això genera dotze Application sense escriure dotze fitxers. Afegir una regió és registrar un clúster amb l'etiqueta correcta; afegir un component és crear un directori.
4.3. Com es combina amb Kustomize
L'estructura del repositori suporta dues dimensions: entorn i clúster.
manifests/
├── base/
│ ├── api-reserves/
│ ├── botiga-web/
│ └── postgres-reserves/
├── components/ # variacions reutilitzables
│ ├── alta-disponibilitat/ # més rèpliques, PDB estricte
│ ├── recursos-reduits/ # per a dev
│ └── replica-lectura/ # només per a clústers secundaris
└── overlays/
├── dev/
├── pre/
├── pro-eu-west-1/ # regió principal
│ ├── kustomization.yaml
│ └── regio-patch.yaml
└── pro-eu-west-3/ # regió secundària
├── kustomization.yaml
└── regio-patch.yaml# overlays/pro-eu-west-3/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: rutas-norte-pro
resources:
- ../../base/api-reserves
- ../../base/botiga-web
components:
- ../../components/alta-disponibilitat
- ../../components/replica-lectura # aquí PostgreSQL és rèplica, no primari
patches:
- path: regio-patch.yaml
target: { kind: Deployment }
images:
# El MATEIX digest que a eu-west-1: la promoció actualitza tots dos overlays.
- name: api-reserves
newName: registry.rutasnorte.example/rutasnorte/api-reserves
digest: sha256:9a8b7c6d5e4f30291a8b7c6d5e4f30291a8b7c6d5e4f30291a8b7c6d5e4f3029Regla important: el que és igual entre clústers viu a base; el que difereix, i només això, a l'overlay. Cada línia d'un overlay és una diferència que algú haurà d'entendre d'aquí a sis mesos. Si un overlay creix molt, gairebé sempre significa que la base està mal factoritzada.
- Configuració i polítiques comunes: el clúster com a producte
Amb diversos clústers, la pregunta deixa de ser "com desplego la meva aplicació?" i passa a ser "com garanteixo que els N clústers compleixen les mateixes regles?".
La idea de clúster com a producte consisteix que l'equip de plataforma no lliura "accés a un clúster", sinó un producte amb contracte: un clúster acabat de crear ja ve amb observabilitat, polítiques de seguretat, RBAC, quotes, controlador d'Ingress, gestió de certificats i còpies configurades. Ningú no ha de muntar res, i per tant ningú no ho munta diferent.
5.1. Què forma part del producte
| Categoria | Components | Desplegat per |
|---|---|---|
| Seguretat | Kyverno amb les polítiques corporatives, Pod Security Standards, Falco | ApplicationSet plataforma-base |
| Identitat i accés | ClusterRole i bindings per grup del proveïdor d'identitat |
ApplicationSet plataforma-rbac |
| Xarxes | ingress-nginx, cert-manager amb els emissors, NetworkPolicy deny-all per defecte |
ApplicationSet plataforma-base |
| Observabilitat | kube-prometheus-stack, Fluent Bit cap al destí central, regles d'alerta | ApplicationSet plataforma-observabilitat |
| Costos | OpenCost, etiquetatge obligatori de càrregues | ApplicationSet plataforma-base |
| Còpies | Velero amb el seu destí i el seu calendari | ApplicationSet plataforma-base |
| Autoescalat | Karpenter amb les classes de node aprovades | Terraform (és infraestructura, no càrrega) |
5.2. Les polítiques que garanteixen l'homogeneïtat
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: exigir-etiquetes-corporatives
annotations:
policies.kyverno.io/description: >-
Tota càrrega ha de declarar equip i component. Sense això, el repartiment
de costos d'11-06 i la resposta a incidents són impossibles.
spec:
validationFailureAction: Enforce
background: true
rules:
- name: etiquetes-obligatories
match:
any:
- resources:
kinds: [Deployment, StatefulSet, DaemonSet, CronJob, Rollout]
exclude:
any:
- resources:
namespaces: [kube-system, plataforma, argocd, monitoratge]
validate:
message: "Falten les etiquetes rutasnorte.example/equip i app.kubernetes.io/part-of"
pattern:
metadata:
labels:
rutasnorte.example/equip: "?*"
app.kubernetes.io/part-of: "?*"5.3. Detectar la deriva
Encara que tot es desplegui per GitOps, la deriva apareix: versions de complements instal·lats per Terraform, pedaços d'emergència, diferències en la versió del mateix Kubernetes. Convé un informe periòdic.
#!/usr/bin/env bash
# comparar-flota.sh — executat setmanalment per un CronJob
for CTX in rutasnorte-nopro PRODUCCIO-rutasnorte; do
echo "=== $CTX ==="
kubectl --context "$CTX" version -o json | jq -r '.serverVersion.gitVersion'
kubectl --context "$CTX" get clusterpolicies -o name | sort
helm --kube-context "$CTX" list -A -o json | jq -r '.[] | "\(.name)\t\(.chart)"' | sort
doneI la comprovació que importa de debò, feta des d'Argo CD:
# Cap Application no ha d'estar OutOfSync sense motiu declarat
argocd app list -o json | jq -r '.[] | select(.status.sync.status != "Synced")
| "\(.metadata.name)\t\(.spec.destination.name)\t\(.status.sync.status)"'
- Connectivitat entre clústers
Dos clústers són dues xarxes de pods diferents. Un pod d'eu-west-3 no pot resoldre api-reserves.rutas-norte-pro.svc.cluster.local del clúster d'eu-west-1, ni arribar a les seves IP. Hi ha tres nivells de solució, amb complexitat molt diferent.
6.1. Nivell 1: DNS global i balanceig entre regions
El més simple i el que resol la majoria dels casos. El trànsit d'usuaris es dirigeix a la regió adequada mitjançant DNS, i cada regió és autosuficient.
www.rutasnorte.example
├── política de latència
├── eu-west-1 → balancejador del clúster pro-1 [comprovació de salut: /salut]
└── eu-west-3 → balancejador del clúster pro-3 [comprovació de salut: /salut]- Política de latència: cada usuari va a la regió més ràpida per a ell.
- Política de commutació: si la comprovació de salut d'una regió falla, el DNS deixa de resoldre-la.
- Límit important: el DNS té TTL. Amb TTL de 60 segons, la commutació triga entre un i diversos minuts, perquè hi ha resolutors que ignoren els TTL curts. No hi ha commutació instantània per DNS.
6.2. Nivell 2: connectivitat de xarxa entre clústers
Quan un servei d'un clúster necessita cridar-ne un altre d'un altre clúster (per exemple, la rèplica de PostgreSQL seguint el primari), cal connectivitat de xarxa real: aparellament de VPC o passarel·la de trànsit, rangs CIDR que no se solapin, i regles de tallafoc explícites.
El requisit dels rangs mereix atenció: si els dos clústers fan servir 10.244.0.0/16 per a pods, l'encaminament entre ells és impossible. Cal planificar l'adreçament abans de crear el segon clúster, i és un error que es paga amb una reconstrucció.
6.3. Nivell 3: malla de servei multi-clúster
Istio, Linkerd o Cilium Cluster Mesh permeten que un Service d'un clúster sigui assolible des d'un altre de manera transparent, amb mTLS, repartiment de càrrega entre regions, commutació per localitat i observabilitat unificada.
Què resolen de debò:
- Descobriment transparent:
api-reserves.rutas-norte-pro.svcfunciona des de qualsevol clúster de la malla. - Commutació per localitat: es prefereix la instància local i es desborda a la remota només si la local no està sana.
- mTLS entre clústers sense tocar l'aplicació.
- Una sola vista de la topologia del trànsit.
Què costen:
- Un sidecar per pod (o eBPF, segons la implementació), amb el seu consum de CPU i memòria.
- Un pla de control més per operar i actualitzar.
- Una capa sencera de nous modes de fallada, amb una corba d'aprenentatge considerable.
- Depuració notablement més difícil: el trànsit ja no va on sembla.
El criteri honest: una malla multi-clúster es justifica quan hi ha molts serveis cridant-se entre regions. Si la comunicació entre clústers es redueix a la replicació de la base de dades i a un parell de crides, l'aparellament de VPC i uns Services de tipus ExternalName resolen el mateix per una fracció del cost.
Rutas Norte no fa servir malla de servei. Amb dos clústers, sis components i una única conversa entre regions (la replicació de PostgreSQL), no està justificada. Es revisarà si apareix una tercera regió.
- Recuperació davant de desastres
Aquí és on el multi-clúster deixa de ser una qüestió d'arquitectura i passa a ser una qüestió de supervivència del negoci.
7.1. Actiu-passiu davant d'actiu-actiu
| Aspecte | Actiu-passiu | Actiu-actiu |
|---|---|---|
| Trànsit normal | Tot a la regió principal | Repartit entre regions |
| Regió secundària | Infraestructura mínima, dades replicant-se | Capacitat completa servint |
| Cost addicional | 20-40 % | 100 % o més |
| Temps de recuperació | Minuts a hores | Segons (el DNS deixa d'enviar a la caiguda) |
| Complexitat de la dada | Replicació en una direcció | Escriptures en dos llocs: el problema difícil |
| Es prova | Amb simulacres programats | Contínuament, per construcció |
| Risc de sorpresa | Alt: el camí fred pot no funcionar | Baix: el camí està sempre calent |
L'argument a favor de l'actiu-actiu no és el temps de recuperació, és que el camí de recuperació s'exerceix cada dia. Un secundari passiu que mai no ha servit trànsit real és una hipòtesi, igual que la còpia que mai no es va restaurar d'11-02.
L'argument en contra és doble: costa el doble, i sobretot obliga a resoldre les escriptures concurrents en dues regions, que és un problema de disseny d'aplicació, no d'infraestructura.
7.2. RTO i RPO
Els mateixos conceptes d'11-02, ara a escala de regió:
| Escenari | RTO objectiu | RPO objectiu | Com s'aconsegueix |
|---|---|---|---|
| Caiguda d'un pod | segons | 0 | Rèpliques i sondes |
| Caiguda d'un node | 1-2 min | 0 | Reprogramació i topologySpread |
| Caiguda d'una zona | 2-5 min | 0 | Repartiment multizona dins del clúster |
| Caiguda del clúster | 30 min | < 5 min | Segon clúster + replicació |
| Caiguda de la regió | 2 h | < 15 min | Clúster en una altra regió + còpies replicades |
7.3. El problema que no té solució fàcil: la dada
Els manifests es repliquen amb git push. L'aplicació arrenca en qualsevol lloc en minuts. La dada és una altra cosa.
Replicació asíncrona de PostgreSQL entre regions. És el que fa Rutas Norte: una rèplica a eu-west-3 que segueix el primari d'eu-west-1 per replicació en flux. El retard típic entre Irlanda i París és de 25-40 ms de xarxa, cosa que a la pràctica significa un retard de replicació de menys d'un segon amb càrrega normal, i d'uns segons durant el pont de maig.
La conseqüència: si la regió principal desapareix de cop, es perden les transaccions confirmades que encara no havien arribat a la rèplica. Amb RPO de 15 minuts hi ha marge de sobres, però convé dir-ho amb claredat: actiu-passiu amb replicació asíncrona no és RPO zero. Pot haver-hi reserves confirmades al client que no existeixin després de la commutació, i el negoci ha de saber què fer-ne.
Replicació síncrona donaria RPO zero, però cada confirmació de transacció esperaria l'anada i tornada a l'altra regió: 35 ms afegits a cada escriptura. Al pont de maig, això és inassumible.
graph LR
subgraph W1["eu-west-1 · principal"]
P[(postgres-reserves<br/>PRIMARI)]
API1[api-reserves<br/>8-40 rèpliques]
API1 --> P
end
subgraph W3["eu-west-3 · secundària"]
R[(postgres-reserves<br/>RÈPLICA dempeus)]
API3[api-reserves<br/>2 rèpliques mínimes]
API3 -.només lectura.-> R
end
S3[(Còpies + WAL<br/>replicades a totes dues regions)]
P ==>|replicació asíncrona<br/>retard menor d'1 s| R
P --> S3
DNS[DNS global<br/>latència + salut] --> API1
DNS -.si eu-west-1 falla.-> API3
I el problema encara pitjor: la tornada. Quan la regió principal es recupera, la seva base de dades té un estat divergent del de la que ha estat servint. No es pot simplement tornar: cal reconstruir l'antiga principal com a rèplica de la nova i després commutar ordenadament. Aquest procediment ha d'estar escrit abans de necessitar-lo.
- El pla de Rutas Norte
8.1. Estat actual: dos clústers, mateixa regió
| Clúster | Regió | Conté | Nodes |
|---|---|---|---|
rutasnorte-nopro |
eu-west-1 | rutas-norte-dev, rutas-norte-pre, entorns efímers d'11-03 |
3-8 (Karpenter, majoria interrompibles) |
rutasnorte-pro |
eu-west-1 | rutas-norte-pro, Argo CD, observabilitat |
6-30 (Karpenter, base sota demanda + interrompibles per al que és tolerant) |
La separació va resoldre el problema que la va motivar: les actualitzacions d'EKS s'assagen a nopro, i un webhook mal configurat per desenvolupament ja no pot afectar la venda de bitllets.
8.2. El pla aprovat: segona regió
Després de l'anàlisi de risc, la direcció va aprovar una regió secundària a eu-west-3 (París) en mode actiu-passiu, amb aquestes decisions:
| Decisió | Valor | Raó |
|---|---|---|
| Mode | Actiu-passiu | L'actiu-actiu exigiria resoldre escriptures multiregió a api-reserves, un projecte de mesos |
| Capacitat en repòs | 2 rèpliques d'api-reserves i botiga-web, sempre enceses |
Un secundari a zero és un secundari que no se sap si funciona |
| Base de dades | Rèplica de CloudNativePG seguint el primari | RPO real de segons |
| Còpies | Replicades a totes dues regions, amb immutabilitat | Un desastre no pot endur-se regió i còpies alhora |
| Manifests | Mateix repositori, overlay pro-eu-west-3 |
Una sola font de veritat |
| Argo CD | Instància a pro d'eu-west-1 i una segona instància inactiva a eu-west-3 |
Si cau la regió principal, cau també l'Argo CD que la governa |
| DNS | Registres amb comprovació de salut, TTL 60 s | Commutació en 1-3 minuts |
| Cost addicional estimat | ~34 % sobre la factura actual | Aprovat per direcció |
El punt d'Argo CD mereix atenció. És un error clàssic: posar l'eina que desplega dins del clúster que pot desaparèixer. Rutas Norte ho resol amb una segona instància a eu-west-3 apuntant al mateix repositori, amb syncPolicy.automated desactivada en condicions normals; s'activa com a part del procediment de commutació.
8.3. Procediment de commutació
# ===== PROCEDIMENT DE COMMUTACIÓ A eu-west-3 =====
# Executar NOMÉS amb la decisió del comandament d'incidència (11-06).
# Temps objectiu total: 30 minuts.
# --- Pas 1 (2 min). Confirmar que és un desastre regional, no una avaria local.
# Comprovar l'estat de la regió al panell del proveïdor i des d'una xarxa externa.
# --- Pas 2 (3 min). Congelar escriptures a la regió caiguda si encara és assolible,
# per evitar l'escenari de doble primari.
kubectl --context PRODUCCIO-rutasnorte scale deploy/api-reserves --replicas=0 || true
# --- Pas 3 (5 min). Promocionar la rèplica de PostgreSQL a eu-west-3.
kubectl --context rutasnorte-pro-w3 -n rutas-norte-pro \
cnpg promote postgres-reserves postgres-reserves-1
kubectl --context rutasnorte-pro-w3 -n rutas-norte-pro get cluster postgres-reserves
# Anotar l'últim LSN aplicat: defineix la pèrdua real de dades.
# --- Pas 4 (5 min). Activar Argo CD secundari i escalar l'aplicació.
kubectl --context rutasnorte-pro-w3 -n argocd patch application api-reserves-w3 \
--type merge -p '{"spec":{"syncPolicy":{"automated":{"selfHeal":true,"prune":true}}}}'
kubectl --context rutasnorte-pro-w3 -n rutas-norte-pro scale deploy/api-reserves --replicas=12
kubectl --context rutasnorte-pro-w3 -n rutas-norte-pro rollout status deploy/api-reserves
# --- Pas 5 (3 min). Verificació per capes d'11-01 contra la URL interna.
curl -sf https://api-w3.rutasnorte.example/preparat
npm run proves:fum -- --base-url https://api-w3.rutasnorte.example
# --- Pas 6 (2 min). Commutar el DNS.
aws route53 change-resource-record-sets --hosted-zone-id Z123 \
--change-batch file://commutar-a-w3.json
# --- Pas 7 (10 min). Vigilar i comunicar.
# Panell de Grafana de la regió secundària. Comunicació al negoci: quines
# reserves poden haver-se perdut (segons l'LSN del pas 3).8.4. El simulacre anual
Un procediment escrit i mai executat és una redacció, no un pla. Rutas Norte fa un simulacre anual complet a l'octubre, fora de temporada alta:
| Fase | Contingut |
|---|---|
| Preparació (2 setmanes abans) | Revisar el procediment, avisar el negoci, definir criteris d'èxit i d'avortament |
| Execució | Commutació real a eu-west-3 amb trànsit de producció, en horari de baixa demanda |
| Permanència | 4 hores servint des de la regió secundària |
| Retorn | Reconstruir eu-west-1 com a rèplica i commutar de tornada ordenadament |
| Anàlisi posterior | Temps reals de cada pas, què va fallar, accions de millora amb responsable i data |
Resultats del simulacre d'octubre de 2025, el primer: RTO real de 71 minuts davant de l'objectiu de 30. Les troballes van ser reveladores i cap no s'hauria descobert sense executar-lo:
- El certificat TLS d'
eu-west-3havia caducat: cert-manager no podia completar el repte ACME perquè el DNS no apuntava a aquella regió. Es va corregir fent servir el repte DNS-01 en lloc d'HTTP-01. - Els ExternalSecrets d'
eu-west-3apuntaven a un magatzem que no estava replicat a aquella regió. - Ningú no recordava on estava escrit el procediment de commutació del DNS.
- La rèplica de PostgreSQL feia onze dies que no replicava per una regla de tallafoc afegida en un canvi no relacionat. Ningú no ho sabia perquè no hi havia alerta sobre el retard de replicació entre regions.
Aquesta última troballa, tota sola, va justificar el simulacre sencer: en un desastre real s'haurien perdut onze dies de reserves.
- El cost, la complexitat i quan no fer-ho
9.1. El que realment costa
| Concepte | Cost anual estimat a Rutas Norte |
|---|---|
| Pla de control del segon clúster | ~880 € |
Pla de control del tercer (eu-west-3) |
~880 € |
| Capacitat mínima a la regió secundària | ~9.400 € |
| Rèplica de PostgreSQL entre regions | ~4.200 € |
| Trànsit entre regions (replicació) | ~1.800 € |
| Complements duplicats (còmput) | ~3.100 € |
| Total infraestructura | ~20.260 € |
| Temps de plataforma (implantació, ~6 setmanes-persona) | ~24.000 € |
| Manteniment continu (~15 % d'una persona) | ~9.000 €/any |
És una inversió seriosa. La pregunta que la justifica no és tècnica: quant costa a Rutas Norte una hora caiguda durant el pont de maig? Si són 40.000 € de vendes perdudes més el dany reputacional, la inversió es paga evitant un sol incident regional. Si el negoci pot absorbir mig dia caigut sense conseqüències greus, no.
9.2. Quan NO fer-ho
- Quan un sol clúster encara funciona. Si els namespaces, quotes i polítiques de xarxa cobreixen les teves necessitats d'aïllament, afegir clústers només afegeix deriva.
- Quan no hi ha GitOps. Amb desplegaments manuals, N clústers signifiquen N oportunitats de divergir. GitOps és requisit previ, no complement.
- Quan no hi ha observabilitat centralitzada. Diagnosticar un incident saltant entre panells de tres clústers és inviable. Els logs i les mètriques de tota la flota s'han de veure en un sol lloc.
- Quan l'equip no dona l'abast amb un. Multiplicar la infraestructura no multiplica la capacitat de l'equip, la divideix.
- Quan la raó és "per si de cas". Sense un escenari concret per resoldre, la complexitat es paga sense rebre res.
- Quan la dada no es pot replicar. Si l'aplicació no tolera coherència eventual i no hi ha pressupost per redissenyar-la, un segon clúster dona una falsa sensació de seguretat.
9.3. L'ordre correcte de les inversions
Abans de plantejar-se el segon clúster, convé tenir resolt l'anterior, perquè gairebé tot millora la fiabilitat més per menys diners:
- Còpies provades i restauració cronometrada (11-02).
- GitOps amb tot a Git (10-05).
- Observabilitat i alertes amb runbooks (07-04, 11-06).
- Alta disponibilitat dins del clúster: multizona, PDB,
topologySpread(09-05). - Desplegaments segurs amb canari (11-04).
- I llavors sí, el segon clúster.
Un equip que salta al pas 6 sense els cinc anteriors acaba amb dos clústers fràgils en lloc d'un.
Errors Comuns i Consells
- Crear el segon clúster amb el mateix rang CIDR que el primer. Impedeix l'encaminament entre ells i obliga a reconstruir. Planifica l'adreçament de tota la flota abans de crear el segon.
- Posar Argo CD només dins del clúster de producció. Quan aquest clúster desapareix, desapareix la capacitat de desplegar en qualsevol lloc. Instància secundària o clúster de gestió a part.
- Suposar que el DNS commuta a l'instant. Els TTL curts no sempre es respecten; compta amb un a tres minuts com a mínim.
- Un secundari a zero rèpliques. D'un camí fred no se sap si funciona. Capacitat mínima permanent i trànsit real, encara que sigui poc.
- No alertar sobre el retard de replicació entre regions. És exactament la fallada que Rutas Norte va descobrir al simulacre: onze dies sense replicar i ningú no ho sabia.
- Duplicar l'overlay sencer en afegir una regió. Només el que difereix va a l'overlay; si creix molt, la base està mal factoritzada.
- Instal·lar una malla de servei multi-clúster per defecte. És una de les peces més complexes de l'ecosistema. Només es justifica amb molta comunicació entre regions.
- Consell: posa el context al prompt avui mateix, amb fons vermell per a producció. És la mesura de més retorn per minut invertit de tota la lliçó.
- Consell: fes que els contextos de producció siguin de només lectura per defecte. Escriure ha d'exigir un acte deliberat i registrat.
- Consell: escriu el procediment de commutació i el de tornada. La tornada és més difícil que l'anada i gairebé ningú no la documenta.
Exercicis
Exercici 1: decidir si desdoblar
Una empresa té un clúster amb dev, pre i pro en namespaces separats, GitOps amb Argo CD, còpies provades mensualment i observabilitat centralitzada. Ha patit dos incidents en sis mesos: un per un operador instal·lat per desenvolupament que va consumir tota la memòria d'un node compartit, i un altre per una actualització de la versió del clúster que va deixar pro degradat durant 25 minuts. L'equip de plataforma són dues persones. Recomana una topologia, justifica-la i digues explícitament què NO recomanes i per què.
Exercici 2: escriure l'ApplicationSet
Rutas Norte afegeix el clúster rutasnorte-pro-w3 amb les etiquetes entorn=pro, region=eu-west-3 i rol=secundari. Escriu un ApplicationSet que desplegui api-reserves a tots els clústers amb entorn=pro, fent servir l'overlay overlays/pro-{{region}}, i que als clústers amb rol=secundari arrenqui amb menys rèpliques. Indica a més què s'ha de complir al repositori perquè funcioni.
Exercici 3: analitzar el simulacre
Al simulacre anual, un equip obté: pas 3 (promoció de PostgreSQL) 4 min, pas 4 (Argo CD i escalat) 22 min, pas 5 (verificació) 6 min, pas 6 (DNS) 14 min. RTO total 46 min davant d'un objectiu de 30. Identifica els dos passos problemàtics, proposa una causa probable per a cadascun i una acció correctora concreta.
Solucions
Solució 1. Recomanació: topologia per entorn, dos clústers — un per a pro i un altre per a dev+pre. Justificació: els dos incidents patits són exactament els que aquesta topologia resol; el primer és contenció de recursos i del pla de control entre entorns, el segon és la impossibilitat d'assajar l'actualització abans d'aplicar-la a producció. A més, els requisits previs estan coberts: hi ha GitOps, còpies provades i observabilitat centralitzada, així que la deriva és manejable. El cost incremental per a dues persones és assumible perquè la major part de l'operació ja està automatitzada.
El que no es recomana: (a) un clúster per unitat de negoci, perquè amb dues persones de plataforma la proliferació és inassumible i no hi ha cap problema que ho motivi; (b) una segona regió, perquè cap dels incidents no va ser regional i el cost (infraestructura més replicació de la dada) no està justificat per l'evidència disponible; (c) un clúster de gestió dedicat, innecessari amb només dos clústers, on Argo CD pot viure al de producció gestionant-los tots dos.
Solució 2.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: api-reserves-flota
namespace: argocd
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- clusters:
selector:
matchLabels: { entorn: pro }
template:
metadata:
name: 'api-reserves-{{index .metadata.labels "region"}}'
spec:
project: rutas-norte
source:
repoURL: https://github.com/rutasnorte/manifests
targetRevision: main
path: 'overlays/pro-{{index .metadata.labels "region"}}'
kustomize:
components:
# Component addicional només als secundaris.
- '{{if eq (index .metadata.labels "rol") "secundari"}}../../components/capacitat-reduida{{else}}../../components/capacitat-completa{{end}}'
destination:
server: '{{.server}}'
namespace: rutas-norte-pro
syncPolicy:
automated: { prune: true, selfHeal: true }Requisits al repositori: (a) han d'existir els directoris overlays/pro-eu-west-1 i overlays/pro-eu-west-3; (b) han d'existir els components capacitat-reduida i capacitat-completa; (c) tots els clústers destí han d'estar registrats a Argo CD amb les etiquetes entorn, region i rol; (d) l'AppProject rutas-norte ha de tenir tots dos servidors a la seva llista de destins permesos, o Argo CD rebutjarà les Application generades. Nota addicional: com que l'HPA governa les rèpliques, el component hauria d'ajustar minReplicas/maxReplicas de l'HPA, no el camp replicas del Deployment.
Solució 3. Passos problemàtics: el 4 (22 min sobre uns 5 d'esperats) i el 6 (14 min sobre 2).
Pas 4: causa probable, la regió secundària no tenia capacitat de nodes disponible i es va haver d'esperar que l'autoescalador aprovisionés nodes nous, incloent-hi la descàrrega d'imatges que no estaven en memòria cau en aquells nodes. Acció correctora: mantenir capacitat mínima permanent i preescalfar les imatges (per exemple, amb un DaemonSet que les descarregui, o reservant nodes amb les imatges ja presents). Alternativa complementària: sobreaprovisionar amb pods de baixa prioritat que Karpenter desallotgi en escalar (09-03).
Pas 6: catorze minuts per a un canvi de DNS indica que no estava automatitzat; probablement algú va editar registres a mà en una consola web sota pressió, o es van haver de buscar les credencials. Acció correctora: guionitzar el canvi amb el fitxer de canvi ja escrit i versionat al repositori, executable amb una sola comanda, i provar-lo fora del simulacre. Comprovar a més que el TTL dels registres és de 60 segons i no el valor per defecte, que sol ser molt més gran.
Conclusió
Hem vist per què una empresa acaba amb diversos clústers —aïllament del pla de control, radi d'impacte, latència per regions, residència de la dada, versions diferents i el simple fet que un clúster també s'actualitza— i què costa això realment. Vam recórrer les topologies habituals amb la recomanació de començar per un i desdoblar primer producció davant de la resta; les cinc capes de defensa per no aplicar mai al clúster equivocat, de les quals la més rendible és posar el context al prompt i la més efectiva és que producció sigui de només lectura per defecte; el govern de la flota amb el generador de clústers d'ApplicationSet combinat amb les superposicions de Kustomize; la idea de clúster com a producte per combatre la deriva; els tres nivells de connectivitat entre clústers i el criteri honest sobre quan una malla de servei es justifica; i la recuperació davant de desastres, on el difícil mai no són els manifests sinó la dada, amb la seva replicació asíncrona, el seu RPO no nul i el procediment de tornada que gairebé ningú no escriu.
El pla de Rutas Norte, amb dos clústers avui i una regió secundària aprovada, il·lustra l'essencial: la decisió no es pren per elegància arquitectònica, sinó comparant el cost de la redundància amb el cost d'una hora caiguda al pont de maig. I el simulacre d'octubre, amb el seu RTO real de 71 minuts i els seus onze dies de replicació trencada que ningú no havia detectat, deixa la lliçó més important: un procediment no executat no és un pla.
Ja tenim la plataforma desplegada, amb estat, amb canalització, amb desplegaments segurs i amb una flota governada. Falta el que cap tutorial no explica i el que ocupa realment el dia a dia: mantenir-la viva. A l'última lliçó del mòdul, Operació en Producció: Incidències, Runbooks i Costos, veurem com es gestiona una incidència, com s'escriu un runbook útil, com el pressupost d'error decideix què fa l'equip el mes que ve, com es planifica la capacitat del pont de maig i per què la factura de Kubernetes es dispara i què fer-hi.
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
