Una guida semplice per implementare l'archiviazione persistente in Kubernetes
Scopri come implementare l'archiviazione persistente per le applicazioni stateful in Kubernetes. Questa guida demistifica i PersistentVolume (PV) e i PersistentVolumeClaim (PVC), spiegando le modalità di accesso e le StorageClass. Include esempi YAML pratici per definire i PVC e montare l'archiviazione sui tuoi Pod, consentendo una persistenza dei dati affidabile nelle tue applicazioni containerizzate.
Una Guida Semplice per Implementare lo Storage Persistente in Kubernetes
Lo storage persistente in Kubernetes risolve un problema semplice: il tuo contenitore può scomparire, ma i tuoi file di database, upload o dati di coda non possono. I Pod stateless possono essere sostituiti in qualsiasi momento. Le app stateful necessitano di storage che sopravviva a riavvii dei Pod, riprogrammazioni e manutenzione dei nodi.
Questa guida spiega i PersistentVolume (PV), i PersistentVolumeClaim (PVC), le modalità di accesso e le StorageClass con esempi pratici in YAML che puoi adattare per un carico di lavoro reale.
Comprendere i PersistentVolume (PV) e i PersistentVolumeClaim (PVC)
Prima di montare lo storage in un Pod, sappi quale oggetto gestisce quale compito:
- PersistentVolume (PV): Un PV è un pezzo di storage nel cluster che è stato provisionato da un amministratore o provisionato dinamicamente utilizzando StorageClass. I PV sono risorse del cluster, proprio come i Nodi. Hanno un ciclo di vita indipendente da qualsiasi Pod che utilizza il PV. I PV astraggono i dettagli di implementazione dello storage sottostante (ad es., NFS, iSCSI, storage a blocchi del provider cloud).
- PersistentVolumeClaim (PVC): Un PVC è una richiesta di storage da parte di un utente. Consuma risorse di storage disponibili nel cluster come PV. I PVC sono simili ai Pod in quanto consumano risorse di calcolo e sono limitati a un namespace. Un PVC specifica la capacità di storage desiderata, le modalità di accesso e, opzionalmente, una StorageClass.
Questa separazione consente ai team di piattaforma di gestire i dettagli dello storage mentre i team applicativi richiedono la capacità e il modello di accesso di cui hanno bisogno.
Concetti Chiave: Modalità di Accesso e StorageClass
Due impostazioni controllano la maggior parte del comportamento dei PVC: come il volume può essere montato e quale backend di storage dovrebbe crearlo.
Modalità di Accesso
Le modalità di accesso definiscono come un volume può essere montato su un Pod. Le modalità di accesso disponibili sono:
ReadWriteOnce(RWO): Il volume può essere montato in lettura-scrittura da un singolo nodo.ReadOnlyMany(ROX): Il volume può essere montato in sola lettura da molti nodi.ReadWriteMany(RWX): Il volume può essere montato in lettura-scrittura da molti nodi.ReadWriteOncePod(RWOP): Il volume può essere montato in lettura-scrittura da un singolo Pod. È utile quando hai bisogno di un comportamento di scrittura singola più rigoroso e il tuo driver CSI lo supporta.
È importante notare che il supporto effettivo per queste modalità dipende dal provider di storage sottostante.
StorageClass
Una StorageClass fornisce un modo per gli amministratori di descrivere le "classi" di storage che offrono. Classi diverse possono corrispondere a livelli di qualità del servizio, politiche di backup o politiche arbitrarie determinate dagli amministratori del cluster. Una StorageClass ha un provisioner che provisiona lo storage e un insieme di parametri per il provisioner. Quando viene creato un PVC senza un PV specifico e richiede una StorageClass, Kubernetes provisionerà dinamicamente un PV utilizzando la StorageClass specificata.
Implementare lo Storage Persistente Passo dopo Passo
Esaminiamo uno scenario comune: richiedere e utilizzare lo storage persistente per un Pod.
Passo 1: Definire un PersistentVolumeClaim (PVC)
Prima di tutto, devi creare un PVC che specifichi i tuoi requisiti di storage. Questo PVC fungerà da richiesta di storage per la tua applicazione.
Esempio pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
In questo esempio:
name: my-pvc: Questo è il nome del nostro PVC.accessModes: - ReadWriteOnce: Stiamo richiedendo storage che può essere montato in lettura-scrittura da un singolo nodo.resources.requests.storage: 1Gi: Stiamo richiedendo 1 Gigabyte di storage.
Applicare il PVC:
Salva il contenuto sopra in un file chiamato pvc.yaml e applicalo al tuo cluster:
kubectl apply -f pvc.yaml
Dopo l'applicazione, puoi controllare lo stato del PVC:
kubectl get pvc my-pvc
Dovresti vedere un output che indica che il PVC è Bound se un PV adatto è disponibile o è stato provisionato dinamicamente.
Passo 2: Creare un Pod che Utilizza il PVC
Ora, creiamo un Pod che utilizzerà lo storage richiesto dal nostro PVC. Monteremo il volume fornito dal PVC in una directory specifica all'interno del nostro contenitore.
Esempio pod-with-pv.yaml:
apiVersion: v1
kind: Pod
metadata:
name: my-stateful-pod
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: my-persistent-storage
mountPath: /usr/share/nginx/html
volumes:
- name: my-persistent-storage
persistentVolumeClaim:
claimName: my-pvc
In questo esempio:
volumes: Definiamo un volume chiamatomy-persistent-storage.persistentVolumeClaim.claimName: my-pvc: Questo collega il nostro volume al PVC che abbiamo creato in precedenza.volumeMounts: All'interno della definizione del contenitore, specifichiamo dove questo volume deve essere montato (mountPath: /usr/share/nginx/html).
Applicare il Pod:
Salva il contenuto sopra in un file chiamato pod-with-pv.yaml e applicalo:
kubectl apply -f pod-with-pv.yaml
Ora, il tuo contenitore nginx avrà accesso allo storage persistente definito da my-pvc al percorso /usr/share/nginx/html. Qualsiasi dato scritto in questo percorso all'interno del contenitore sarà persistito anche se il Pod viene eliminato e ricreato, purché il PVC e il suo PV sottostante rimangano.
Provisioning Dinamico con StorageClass
Creare manualmente i PV può essere macchinoso. Kubernetes offre il provisioning dinamico, dove i PV vengono creati automaticamente quando un PVC richiede storage che non può essere soddisfatto dai PV esistenti. Questo si ottiene tramite StorageClass.
La maggior parte dei provider cloud (AWS, GCP, Azure) offre StorageClass preconfigurate. Puoi ispezionarle con:
kubectl get storageclass
Per utilizzare il provisioning dinamico, aggiungi semplicemente un campo storageClassName alla definizione del tuo PVC:
Esempio pvc-dynamic.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-dynamic-pvc
spec:
storageClassName: standard # Sostituisci 'standard' con un nome di StorageClass effettivo
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Quando applichi questo PVC, Kubernetes cercherà una StorageClass chiamata standard (o qualsiasi nome tu specifichi) e istruirà il suo provisioner a creare un nuovo PV di 5Gi e a legarlo a questo PVC.
Suggerimenti e Buone Pratiche
- Scegli la Modalità di Accesso Giusta: Considera attentamente la modalità di accesso richiesta dalla tua applicazione.
ReadWriteOnceè comune per database a replica singola, mentreReadWriteManyè necessario per file system condivisi utilizzati da più Pod. - Comprendi le Prestazioni dello Storage: Diversi provider di storage e StorageClass offrono caratteristiche di prestazioni variabili (IOPS, throughput). Scegli una StorageClass che soddisfi le esigenze di prestazioni della tua applicazione.
- Strategia di Backup: Lo storage persistente non significa automaticamente backup. Implementa una strategia di backup robusta per i tuoi volumi persistenti, specialmente per i dati critici.
- Politica di Recupero dei PV: I PV hanno una
persistentVolumeReclaimPolicy, comunementeDeleteoRetain. I volumi provisionati dinamicamente spesso utilizzano la politica di recupero definita dalla loro StorageClass. La vecchia politicaRecycleè deprecata e non dovrebbe essere utilizzata per nuove configurazioni. - Considerazioni sui Namespace: I PVC sono limitati ai namespace. Assicurati che il tuo Pod e il PVC siano nello stesso namespace affinché avvenga il binding.
Conclusione
Lo storage persistente in Kubernetes inizia con un PVC, un mount del Pod e una StorageClass che corrisponde al tuo carico di lavoro. Per un database a replica singola, inizia con una richiesta ReadWriteOnce, verifica che raggiunga lo stato Bound, montala nel contenitore e rendi i backup parte del progetto fin dal primo giorno.