Un volume Kubernetes è una directory contenente dati, a cui possono accedere i container in un pod Kubernetes. La posizione della directory, il supporto di storage che la ospita e il suo contenuto dipendono dal tipo specifico di volume utilizzato.
I processi in esecuzione all'interno dei container in un pod visualizzano una vista del file system composta da:
I volumi sono definiti nel campo .spec.containers[*].volumeMounts del modello di pod. Per ogni pod e per ogni immagine container all'interno del pod, è necessario specificare quali volumi verranno montati e su quali percorsi (i percorsi possono essere diversi per ogni container).
Esistono alcuni tipi di volumi in Kubernetes. I più importanti sono i volumi temporanei, che vengono archiviati localmente sul nodo Kubernetes e vengono eliminati al riavvio di un pod, e volumi persistenti Kubernetes (PV) che conservano i dati anche dopo l'arresto di un pod.
In questo articolo:
Kubernetes supporta vari volumi, consentendo a ogni pod di utilizzare diversi tipi di volume contemporaneamente. I volumi effimeri sono legati al ciclo di vita del pod, mentre i volumi persistenti possono persistere oltre il ciclo di vita del pod. Ciò significa che Kubernetes distrugge i volumi effimeri una volta che il loro pod non esiste più, mantenendo i dati dei volumi persistenti.
Kubernetes fornisce un sottosistema PersistentVolume con un'API che astrae il provisioning dello storage e il consumo. Funziona con due risorse API—PersistentVolume (PV) e PersistentVolumeClaim (PVC).
PersistentVolume (PV)
Un PV è una risorsa di storage situata nel cluster. Gli amministratori possono eseguire il provisioning manuale dei PV e Kubernetes può utilizzare le classi di storage per eseguire il provisioning dinamico dei PV. Come i volumi, i PV sono plugin, ma il loro ciclo di vita è indipendente da qualsiasi pod che utilizza il PV.
Un PV funziona come un oggetto API che acquisisce i dettagli dell'implementazione dello storage, inclusi iSCSI, NFS e i sistemi di storage dei cloud provider. Funziona in modo simile a un nodo, ma offre risorse di storage anziché di calcolo.
PersistentVolumeClaim (PVC)
Un PVC è una richiesta di storage effettuata da un utente. Funziona in modo simile a un pod ma consuma risorse PV anziché risorse di nodo. Un PVC può richiedere risorse di storage specifiche, specificando modalità di accesso come ReadWriteOnce, ReadWriteMany e ReadOnlyMany.
I PVC consentono agli utenti di consumare risorse di storage astratte, ma gli utenti in genere necessitano di PV con proprietà variabili per problemi diversi. Questo è il motivo per cui gli amministratori di cluster devono spesso offrire PV variabili che differiscono non solo per dimensioni e modalità di accesso. Possono farlo senza esporre gli utenti ai dettagli di implementazione tramite risorse StorageClass.
Contenuto correlato: Leggi la nostra guida a Kubernetes PVC
I volumi temporanei non memorizzano i dati in modo persistente tra i riavvii. Questi volumi sono legati alla durata del pod, il che significa che vengono creati ed eliminati insieme al pod. Consente di arrestare e riavviare i pod senza limitarli alla disponibilità di volume persistente.
I volumi temporanei sono semplici da implementare e gestire. Puoi specificarli inline nella pod spec. I volumi temporanei sono ideali per le applicazioni che non richiedono storage persistente, come i servizi di caching.
Un volume emptyDir viene creato quando Kubernetes assegna un pod a un nodo. La durata di questo volume è legata al ciclo di vita di un pod esistente su quel nodo specifico. Un volume emptyDir viene ricreato quando i container si riavviano o si arrestano in modo anomalo. Tuttavia, i dati in questo volume vengono eliminati e persi quando il pod viene rimosso dal nodo, si arresta in modo anomalo o muore.
Dopo aver creato un volume emptyDir, puoi dichiarare il nome del tipo di volume come campo nel file manifesto del pod. Viene visualizzato nella sezione delle proprietà del volume con parentesi graffe{} come valore. I volumi EmptyDir sono adatti principalmente per l'archiviazione temporanea dei dati. Ad esempio, puoi usarlo per uno spazio temporaneo, come una fusione basata su disco.
È possibile archiviare i volumi emptyDir sul supporto che sostiene il nodo. Ad esempio, puoi utilizzare storage di rete o SSD. In alternativa, puoi impostare "memory" nel campo emptyDir.medium e Kubernetes monterà un file system supportato da RAM (tmpfs). Nota che Kubernetes cancella tmpfs al riavvio del nodo.
Un volume hostPath monta una directory o un file dal filesystem del nodo host nel tuo pod.
Di seguito sono riportati i principali casi d'utilizzo per i volumi hostPath:
HostPath volumes sicurezza
HostPath volumes comportano molti rischi per la sicurezza. Evita di utilizzarli ogni volta che è possibile. Se devi utilizzare un HostPath volume, dovresti limitarlo solo alla directory o al file richiesto e montarlo come ReadOnly.
Ecco i principali rischi per la sicurezza:
È possibile utilizzare AdmissionPolicy per limitare l'accesso HostPath a determinate directory. Tuttavia, il criterio è efficace solo se si richiede a volumeMounts di utilizzare montaggi readOnly.
Un ConfigMap consente di inserire dati di configurazione nei pod. I dati archiviati all'interno di un ConfigMap possono essere referenziati in un volume di tipo configMap e quindi utilizzati dalle applicazioni containerizzate che vengono eseguite in un pod. È necessario fornire il nome del ConfigMap nel volume quando si fa riferimento a un ConfigMap. Kubernetes consente di personalizzare il percorso per una voce specifica nel ConfigMap.
Kubernetes fornisce diversi plug-in di storage che forniscono accesso ai dispositivi di storage distribuiti in un cluster Kubernetes. Questi sono implementati utilizzando l'oggetto StorageClass.
Alcuni dei principali plug-in attualmente supportati da Kubernetes sono GCEPersistentDisk, AWSElasticBlockStore, AzureDisk, Glusterfs, NFS e iSCSI. Per ulteriori dettagli su questi plug-in, consulta la documentazione StorageClass.
Esaminiamo due notevoli plugin di storage in modo più dettagliato.
Network File System (NFS) è un protocollo standard per il montaggio di dispositivi di archiviazione come unità locali. Kubernetes consente di montare un volume NFS come unità locale in un container. Poiché il codice legacy accede spesso ai dati tramite NFS, questo plugin è molto utile per migrare i carichi di lavoro legacy su Kubernetes.
Esistono due modi per accedere ai dati tramite NFS e Kubernetes:
La Container Storage Interface (CSI) è un'interfaccia standard che consente agli orchestratori di container di esporre i sistemi di storage ai container che gestiscono. CSI consente ai fornitori di storage di creare plugin che sono “out of tree”, il che significa che non devono essere archiviati nel repository di codice Kubernetes e non vengono forniti con Kubernetes.
Esistono molti plug-in out of tree basati su CSI che sono offerti direttamente dai fornitori di storage. L'avvento di CSI ha reso molto più facile per le tecnologie di storage supportare Kubernetes.
Contenuto correlato: Leggi la nostra guida a Container Storage Interface
Ci sono due passaggi coinvolti nella creazione di un volume e nel renderlo accessibile a un pod:
Questi passaggi vanno di pari passo. Quando si crea un volume, è necessario anche montarlo in un container e non è possibile montare un volume senza dichiararlo nel pod template.
Ecco un esempio che mostra sia la creazione che il montaggio di un volume in una configurazione YAML del template di pod:
spec: containers: —name: my-app image: nginx volumeMounts: —name: my-volume mountPath: /app/config volumes: —name: my-volume
In questo codice:
Per creare un volume Kubernetes, distribuisci uno o più pod che dichiarano il volume. Un modo comune per farlo è tramite un oggetto Deployment. Ecco un esempio di manifesto Deployment che fa quanto segue:
apiVersion: apps/v1 kind: Deployment metadata: name: pods-with-volumes spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: —name: my-container image: nginx:1.14.2 volumeMounts: —mountPath: / name: my-volume volumes: —name: my-volume emptyDir: {}
Si noti che il nome di questa Deployment è definito in pods-with-volumes—questo è il modo in cui ci si riferisce ad essa nell'ambiente Kubernetes.
Come abbiamo visto nella sezione precedente, questo oggetto Deployment esegue le due azioni necessarie per creare un volume:
Supponiamo che questo file YAML sia salvato con il nome my-deployment.yaml. Puoi creare il Deployment nel tuo cluster Kubernetes usando questo comando:
kubectl apply -f my-deployment.yaml
Per verificare che la Deployment sia in esecuzione correttamente con i volumi previsti, eseguire questo comando:
kubectl describe pods pods-with-volumes
Se tutto ha funzionato correttamente, l'output mostrerà che ogni pod ha un container chiamato my-container con il punto di montaggio richiesto:
Mounts: / da my-volume (rw)
L'output mostrerà anche il volume in esecuzione sotto ogni pod:
Volumi: my-volume: Tipo: EmptyDir (una directory temporanea che condivide la durata di un pod)
NetApp Cloud Volumes ONTAP, la soluzione leader nella gestione dello storage enterprise, fornisce servizi di gestione dello storage sicuri e comprovati su AWS, Azure e Google Cloud. La capacità di Cloud Volumes ONTAP può scalare nell'ordine dei petabyte e supporta vari casi d'utilizzo come file services, database, DevOps o qualsiasi altro carico di lavoro aziendale, con un solido set di funzionalità tra cui high availability, data protection, storage efficiencies, integrazione con Kubernetes e altro ancora.
In particolare, Cloud Volumes ONTAP supporta il provisioning e la gestione dei volumi persistenti di Kubernetes per i carichi di lavoro containerizzati.
Scopri di più su come Cloud Volumes ONTAP aiuta ad affrontare le sfide delle applicazioni containerizzate in questi Kubernetes Workloads with Cloud Volumes ONTAP Case Studies.