La gestione dello storage per le applicazioni stateful è un aspetto cruciale dell'orchestrazione dei container. Kubernetes Persistent Volume (PV) è una funzionalità fondamentale che soddisfa questa esigenza fornendo un meccanismo per gestire le risorse di storage in modo indipendente dal ciclo di vita dei singoli pod. In questo articolo approfondiremo il concetto di Kubernetes Persistent Volume, le sue caratteristiche e le best practice per utilizzarlo efficacemente nei cluster Kubernetes.
Che cos'è Kubernetes Persistent Volume?
Un volume persistente Kubernetes (PV ) è una risorsa di storage in un cluster Kubernetes che astrae la tecnologia di storage sottostante. A differenza dello storage temporaneo, che è legato al ciclo di vita di un pod e scompare quando il pod viene terminato, le PV forniscono un modo per gestire e allocare lo storage persistente alle applicazioni. Ciò garantisce che i dati rimangano intatti anche se i pod che vi accedono vengono terminati o ripianificati.
L'utilizzo di volumi persistenti offre vantaggi quali:
- Astrazione dallo storage: Le PV nascondono le specifiche dello storage fisico (ad es. dischi locali, SAN, storage cloud) dai pod. Gli utenti possono richiedere lo storage senza dover conoscere i dettagli specifici dell'implementazione.
- Persistenza: Le PV garantiscono la persistenza dei dati anche durante il riavvio o la riprogrammazione dei pod. Immagina un pod di server web che utilizzi lo storage effimero per archiviare i log temporanei. Quando il pod viene riavviato, i registri vengono persi. Lo storage persistente, invece, garantisce che i dati, come quelli delle applicazioni gestiti da un pod di database, rimangano intatti.
- Disaccoppiamento dello storage dai pod: Questa separazione consente una maggiore flessibilità e controllo sulle risorse di storage. I pod possono essere facilmente scalati verso l'alto o verso il basso senza influire sullo storage sottostante.
Caratteristiche principali dei volumi persistenti Kubernetes
I volumi persistenti di Kubernetes offrono diverse funzionalità chiave che li rendono potenti e adattabili alle diverse esigenze di storage:
Classi di storage
Le classi di storage agiscono come modelli che definiscono diversi tier o categorie di storage disponibili in un cluster. Possono specificare caratteristiche come le performance (ad esempio, SSD e HDD), la capacità, la durata e i costi. Ciò consente agli amministratori di eseguire il provisioning dello storage in base ai requisiti specifici delle applicazioni.
Modalità di accesso
Le modalità di accesso definiscono il modo in cui i pod possono interagire con lo storage fornito da una PV. Ecco una descrizione dettagliata delle modalità più comuni:
- ReadWriteOnce (RWO): Solo un pod alla volta può montare il volume con autorizzazioni di lettura-scrittura. Ciò garantisce l'integrità dei dati per le applicazioni che richiedono un accesso esclusivo in scrittura, come una replica del database primario.
- ReadOnlyMolti (ROX): Più pod possono montare il volume contemporaneamente, ma solo in modalità di sola lettura. Ciò è utile per gli scenari in cui le applicazioni devono accedere ai dati condivisi senza modifiche, come un file di configurazione o un repository di log.
- ReadWriteMolti (RWX): Più pod possono montare il volume con autorizzazioni di lettura-scrittura. Questa modalità di accesso deve essere utilizzata con cautela a causa di potenziali incoerenze dei dati se più pod scrivono contemporaneamente. È ideale per casi d'uso specifici come cache condivise o strumenti di editing collaborativo.
Politiche di recupero
Le policy di recupero stabiliscono il modo in cui Kubernetes gestisce una PV dopo che non è più legata a un pod. Le policy principali includono:
- Conservare: La PV rimane dopo che il pod si è sbloccato, consentendo l'amministrazione manuale per un potenziale utilizzo o migrazione futuri.
- Riciclaggio: Kubernetes ricicla la PV. Ciò comporta in genere la cancellazione dei dati esistenti e la disponibilità dello storage per le assegnazioni future dei pod.
- Elimina: L'oggetto PV e la relativa risorsa di storage sottostante vengono completamente eliminati. Usalo con cautela, perché il ripristino dei dati potrebbe non essere possibile.
Plug-in per volumi
Kubernetes sfrutta i plug-in di volume per colmare il divario tra la piattaforma e vari provider di storage. Questi plug-in consentono a Kubernetes di comprendere e interagire con diversi backend di storage, tra cui storage locale, soluzioni NAS (Network Attached Storage) come NFS o iSCSI e servizi di storage specifici per provider cloud come AWS EBS o GCE Persistent Disk. Questa architettura plug-in offre una notevole flessibilità nella scelta e nell'integrazione delle soluzioni di storage con il cluster Kubernetes.
Provisioning di volumi persistenti
Kubernetes offre due metodi principali per il provisioning dei volumi persistenti (PV): il provisioning statico e il provisioning dinamico. Ogni approccio si adatta a diversi casi d'uso e offre vantaggi distinti.
Provisioning statico
Nel provisioning statico, gli amministratori dei cluster creano e configurano manualmente le PV in anticipo. Questo approccio fornisce un controllo granulare sulla configurazione dello storage ed è adatto per scenari con requisiti di storage ben definiti che non cambiano di frequente. Per eseguire il provisioning statico di una PV:
1. Definisci i dettagli dello storage: Determinare la capacità di storage, le modalità di accesso (ReadWriteOnce, ReadOnlyMany, ReadWriteMany), i criteri di recupero (Retain, Recycle, Delete) e le specifiche del plug-in di volume (ad esempio, l'indirizzo del server per NFS).
2. Crea l'oggetto PV utilizzando YAML: Utilizzare un file manifest YAML per definire la configurazione PV. Ecco un esempio di utilizzo dello storage NFS:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /path/to/nfs/share
server: nfs-server.example.com
- nome: Nome univoco per PV PV.
- storage: Capacità di storage desiderata (ad es. 10Gi per 10 Gigabyte).
- modalità di accesso: Scegli la modalità di accesso appropriata in base ai requisiti dell'applicazione.
- persistentVolumeReclaimPolicy: Definisci in che modo Kubernetes dovrebbe gestire la PV dopo che è stata liberata da un pod.
- nfs.path: Percorso alla condivisione NFS sul server NFS.
- server nfs.: Indirizzo IP o nome host del server NFS.
3. Applicare il manifesto YAML: Usa il comando kubectl apply -f per creare l'oggetto PV nel cluster Kubernetes.
Provisioning dinamico
Il provisioning dinamico sfrutta StorageClasses per automatizzare la creazione di PV. Gli amministratori definiscono le classi di storage che specificano le caratteristiche di storage desiderate e consentono a Kubernetes di gestire la creazione di PV on demand quando un PersistentVolumeClaim (PVC) richiede lo storage. Per utilizzare il provisioning dinamico:
1. Definizione di una classe di storage: Creare un manifesto YAML StorageClass che specifichi il provisioning, il tipo di storage (es. SSD, HDD) e gli eventuali parametri aggiuntivi richiesti dal provisioning. Ecco un esempio per AWS EBS:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-ebs
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
- nome: Nome univoco per StorageClass.
- provisioning: Nome del plug-in del provisioning dello storage (ad esempio, kubernetes.io/aws-ebs per AWS EBS).
- parameters.type: Tipo di storage all'interno del provisioning (ad esempio, gp2 per un tipo di volume SSD generico in AWS EBS).
2. Applica il manifesto StorageClass: Usa kubectl apply -f per creare l'oggetto StorageClass nel cluster.
Associazione dei volumi persistenti ai pod
Il legame di una PV a un pod consente alle applicazioni di sfruttare lo storage persistente. Questo legame si ottiene in genere tramite un PersistentVolumeClaim (PVC ).
Un PVC agisce come una richiesta di storage inviata da un pod. Specifica i requisiti di storage di un pod, tra cui:
- Modalità di accesso: Definisce il modo in cui il pod può interagire con lo storage (ad esempio, ReadWriteOnce, ReadOnlyMany, ReadWriteMany).
- Capacità di storage: La quantità di storage desiderata per il pod.
- StorageClassName (opzionale): Fa riferimento a una classe di storage per il provisioning dinamico.
Ecco un esempio di pod denominato "pod-example" che utilizza un PVC denominato "pvc-example":
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: app
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pvc-storage
volumes:
- name: pvc-storage
persistentVolumeClaim:
claimName: pvc-example
In questo esempio, il pod monta il PVC denominato "pvc-esempio" in corrispondenza del percorso "/usr/share/nginx/html" all'interno del container. Ciò consente al pod di accedere e gestire i dati persistenti memorizzati nella PV sottostante.
Gestione dei volumi persistenti
È essenziale gestire efficacemente i volumi persistenti (PV) per mantenere un utilizzo dello storage efficiente e scalabile nel cluster Kubernetes. Alcuni aspetti chiave della gestione della PV includono:
1. Ridimensionamento dei volumi persistenti
Kubernetes v1.11 ha introdotto la possibilità di ridimensionare le PV. In questo modo puoi regolare dinamicamente la capacità di storage allocata a una PV, in base ai requisiti di storage in continua crescita delle tue applicazioni.
Per ridimensionare un PV, aggiorna la richiesta di storage del PVC: Modificare il PVC che fa riferimento alla PV e modificare il valore di storage all'interno della sezione Risorse.richiede della specifica YAML del PVC. Ad esempio, per aumentare le dimensioni di un PVC denominato "pvc-esempio" a 20Gi, aggiornare il manifesto YAML:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
resources:
requests:
storage: 20Gi
Una volta aggiornata la richiesta di storage del PVC, Kubernetes tenta di ridimensionare lo storage sottostante fornito per il PV. Il ridimensionamento di una PV è generalmente un'operazione unidirezionale (espansione dello storage). La riduzione delle dimensioni di una PV non è supportata a causa di potenziali problemi di perdita di dati.
2. Eliminazione dei volumi persistenti
Per eliminare una PV, assicurati che non sia attualmente legata ad alcun PVC. Non è possibile eliminare una PV utilizzata da un PVC per evitare la perdita di dati. Ecco come eliminare una PV:
kubectl delete pv pv-example
Sostituisci l'esempio pv con il nome effettivo della PV che desideri eliminare.
3. Aggiornamento dei volumi persistenti
Sebbene la capacità di storage di base non possa essere modificata direttamente all'interno di un oggetto PV, è possibile aggiornare alcuni campi di metadati di una PV, come etichette o annotazioni. Queste etichette e annotazioni possono essere utilizzate per organizzare, identificare e gestire meglio le PV all'interno del cluster.
Best practice per l'utilizzo dei volumi persistenti Kubernetes
Di seguito sono riportate alcune delle best practice da seguire per ottenere il massimo dai volumi persistenti Kubernetes:
- Seleziona le classi di storage appropriate: Scegli classi di storage che soddisfano i requisiti di performance e durata delle tue applicazioni. Ad esempio, utilizza lo storage con supporto SSD per le applicazioni a performance elevate e lo storage con supporto HDD per scopi di archiviazione.
- Configura correttamente le modalità di accesso: Seleziona la modalità di accesso appropriata per la tua PV in base alle esigenze delle tue applicazioni per accedere allo storage. Ad esempio, è possibile utilizzare RWX per i file system condivisi e RWO per i database a istanza singola.
- Implementa le policy di recupero con saggezza: Imposta policy di recupero che si adattino alla tua strategia di gestione del ciclo di vita dei dati. Utilizza la policy Retain per i dati critici che richiedono un intervento manuale prima dell'eliminazione.
- Monitoraggio e registrazione: Utilizza gli strumenti di monitoraggio e registrazione per monitorare l'utilizzo, le performance e lo stato di salute delle PV. Strumenti come Prometheus e Grafana possono fornire preziose informazioni approfondite sull'infrastruttura di storage.
- Usa Portworx ® per una gestione avanzata dei dati: Per la gestione avanzata dei dati e le soluzioni di storage persistente in Kubernetes, considera l'utilizzo di Portworx di Pure Storage. Portworx offre funzionalità come alta disponibilità, disaster recovery e backup progettati specificamente per le applicazioni containerizzate.
Conclusione
I volumi persistenti (PV) di Kubernetes offrono un meccanismo fondamentale per la gestione dello storage nelle applicazioni stateful. Sfruttando le PV, puoi garantire la persistenza dei dati, l'alta disponibilità e un utilizzo efficiente dello storage all'interno del cluster Kubernetes. Soluzioni come Portworx di Pure Storage offrono un modo intuitivo per sfruttare i vantaggi dei volumi persistenti di Kubernetes. Con funzionalità come alta disponibilità, disaster recovery e backup che utilizzano l'intelligenza artificiale per migliorare l'efficienza, Portworx è la soluzione di storage persistente Kubernetes ideale per le applicazioni containerizzate.