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.

31 visualizzazioni

Una Guida Semplice all'Implementazione dello Storage Persistente in Kubernetes

Nel mondo dell'orchestrazione dei container, Kubernetes eccelle nella gestione di applicazioni stateless – quelle che non necessitano di conservare dati tra riavvii o eventi di scaling. Tuttavia, molte applicazioni moderne, come database, code di messaggi e archivi chiave-valore, sono intrinsecamente stateful. Queste applicazioni richiedono un modo affidabile per archiviare e accedere ai dati in modo persistente, anche se i Pod che le eseguono vengono riprogrammati o sostituiti. È qui che entra in gioco lo Storage Persistente di Kubernetes.

Questa guida demistificherà i concetti di PersistentVolumes (PV) e PersistentVolumeClaims (PVC), che sono i componenti fondamentali per la gestione dello storage persistente in Kubernetes. Illustreremo come definire, richiedere e associare storage ai tuoi Pod con esempi pratici di YAML, permettendoti di distribuire con sicurezza applicazioni stateful sul tuo cluster Kubernetes.

Comprensione di PersistentVolumes (PV) e PersistentVolumeClaims (PVC)

Prima di addentrarci nell'implementazione, è fondamentale comprendere i ruoli di PV e PVC:

  • PersistentVolume (PV): Un PV è una porzione di storage nel cluster che è stata provisionata da un amministratore o provisionata dinamicamente utilizzando StorageClasses. I PV sono risorse del cluster, molto simili ai Node. Hanno un ciclo di vita indipendente da qualsiasi singolo Pod che utilizza il PV. I PV astraggono i dettagli di implementazione dello storage sottostante (ad esempio, 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 nel consumare risorse di calcolo e sono delimitati da un namespace. Un PVC specifica la capacità di storage desiderata, le modalità di accesso e, opzionalmente, una StorageClass.

Questa separazione delle responsabilità consente agli amministratori del cluster di provisionare e gestire le risorse di storage in modo indipendente, mentre gli sviluppatori di applicazioni possono richiedere storage senza dover conoscere i dettagli dell'implementazione sottostante.

Concetti Chiave: Modalità di Accesso e StorageClasses

Due concetti importanti da afferrare quando si lavora con PV e PVC sono le Modalità di Accesso e le StorageClasses:

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.

È importante notare che il supporto effettivo per queste modalità dipende dal provider di storage sottostante.

StorageClasses

Una StorageClass fornisce un modo agli amministratori per descrivere le "classi" di storage che offrono. Classi diverse potrebbero corrispondere a livelli di qualità del servizio, policy di backup o policy 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 questo richiede una StorageClass, Kubernetes provisionerà dinamicamente un PV utilizzando la StorageClass specificata.

Implementazione dello Storage Persistente: Passo dopo Passo

Analizziamo uno scenario comune: richiedere e utilizzare lo storage persistente per un Pod.

Passo 1: Definire un PersistentVolumeClaim (PVC)

Innanzitutto, 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 uno storage che possa essere montato in lettura-scrittura da un singolo nodo.
  • resources.requests.storage: 1Gi: Stiamo richiedendo 1 Gigabyte di storage.

Applicazione del 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 container.

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 chiamato my-persistent-storage.
  • persistentVolumeClaim.claimName: my-pvc: Questo collega il nostro volume al PVC creato in precedenza.
  • volumeMounts: All'interno della definizione del container, specifichiamo dove questo volume deve essere montato (mountPath: /usr/share/nginx/html).

Applicazione del 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 container nginx avrà accesso allo storage persistente definito da my-pvc nel percorso /usr/share/nginx/html. Qualsiasi dato scritto in questo percorso all'interno del container verrà mantenuto anche se il Pod viene eliminato e ricreato, purché il PVC e il suo PV sottostante rimangano.

Provisioning Dinamico con StorageClasses

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 da PV esistenti. Questo viene realizzato tramite le StorageClasses.

La maggior parte dei provider cloud (AWS, GCP, Azure) offre StorageClasses pre-configurate. Puoi ispezionarle con:

kubectl get storageclass

Per utilizzare il provisioning dinamico, è sufficiente aggiungere un campo storageClassName alla definizione del PVC:

Esempio pvc-dynamic.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-dynamic-pvc
spec:
  storageClassName: standard # Sostituisci 'standard' con il nome effettivo di una StorageClass
  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 da 5Gi e ad associarlo a questo PVC.

Suggerimenti e Best Practices

  • Scegliere la Modalità di Accesso Corretta: Considera attentamente la modalità di accesso richiesta dalla tua applicazione. ReadWriteOnce è comune per i database a replica singola, mentre ReadWriteMany è necessaria per i file system condivisi utilizzati da più Pod.
  • Comprendere le Prestazioni dello Storage: Diversi provider di storage e StorageClasses offrono caratteristiche di performance variabili (IOPS, throughput). Scegli una StorageClass che soddisfi le esigenze di performance 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 dati critici.
  • Policy di Reclamo PV: I PV hanno una reclaimPolicy che può essere Delete (predefinita), Retain o Recycle (deprecata). Retain è utile per garantire che i dati non vengano persi se un PV viene eliminato ma lo storage sottostante esiste ancora.
  • Considerazioni sui Namespace: I PVC sono namespaced. Assicurati che il tuo Pod e il PVC siano nello stesso namespace affinché l'associazione avvenga.

Conclusione

L'implementazione dello storage persistente è un requisito fondamentale per l'esecuzione di applicazioni stateful in Kubernetes. Comprendendo e utilizzando PersistentVolumes e PersistentVolumeClaims, insieme alla flessibilità delle StorageClasses, puoi gestire in modo affidabile i dati della tua applicazione. Questa guida ha fornito le conoscenze fondamentali e gli esempi pratici per iniziare, permettendoti di distribuire workload stateful più sofisticati e resilienti su Kubernetes.