| Pod | JVM process | Unité d'exécution minimale (1+ containers Docker partageant network & storage) |
| Container | .jar exécutable | L'image Docker = ton binaire packagé avec ses deps |
| Deployment | @Service + replication | Déclare "je veux N pods de ce container", K8s les maintient |
| ReplicaSet | JEE cluster manager | Géré auto par Deployment, garantit N pods identiques running |
| Service | DNS + load-balancer Spring Cloud | Adresse stable interne (ClusterIP) qui distribue les requêtes sur les N pods |
| Ingress | nginx / Apache reverse-proxy | Reverse-proxy déclaratif : "host X.example.com → Service Y, path /api → Service Z" |
| ConfigMap | application-prod.yml | Config non-sensible injectée dans les pods en env vars ou fichiers |
| Secret | .env / Vault / @PropertySource encrypted | Pareil que ConfigMap mais base64-encoded + RBAC restreint |
| PersistentVolumeClaim (PVC) | DataSource JDBC | Demande de stockage persistant ; K8s alloue un PV qui survit aux restarts pod |
| StorageClass | JDBC URL pool + driver | "Comment provisionner le stockage" (local-path RWO, Longhorn RWX, NFS, AWS EBS, etc.) |
| Namespace | Java package + profile | Isolation logique : on met "maritime", "preprod", "argocd" séparés pour gérer accès et quotas |
| CRD (Custom Resource) | @Entity + Spring repository | Tu déclares ton propre type de ressource (ex: RabbitmqCluster) avec son operator |
| Operator | @PostConstruct + scheduled reconciler | Daemon qui watch les CRD et fait du "réconciliation continue" : "l'état réel correspond-il au YAML ?" |
| Job / CronJob | Quartz Scheduler | Une exécution one-shot (Job) ou récurrente (CronJob) — utile pour batches, migrations DB |
| StatefulSet | Cluster JEE stateful (replica DB) | Comme Deployment mais avec identité stable (pod-0, pod-1) et stockage par pod (pour DB, Kafka, etc.) |
| ServiceAccount + RBAC | Spring Security + @PreAuthorize | Identité d'un pod + ce qu'il a le droit de faire dans le cluster (lire pods, écrire configs, etc.) |