Sfondo
Per loro natura, i pod sono temporanei. Ciò significa che GKE distrugge lo stato e il valore archiviati in un pod quando viene eliminato, rimosso o riprogrammato.
In qualità di operatore di applicazioni, potresti voler gestire i workload stateful. Alcuni esempi di questi workload includono applicazioni che elaborano articoli di WordPress, app di messaggistica e app che elaborano operazioni di machine learning.
Utilizzando Filestore su GKE, puoi eseguire le seguenti operazioni:
- Esegui il deployment di carichi di lavoro stateful scalabili.
- Consenti a più pod di avere
ReadWriteManycomeaccessMode, in modo che più pod possano leggere e scrivere contemporaneamente nello stesso spazio di archiviazione. - Configura GKE per montare i volumi in più pod contemporaneamente.
- Mantieni lo spazio di archiviazione quando i pod vengono rimossi.
- Consenti ai pod di condividere i dati e di scalare facilmente.
Configura l'archiviazione di file gestiti con Filestore utilizzando CSI
GKE offre un modo per eseguire automaticamente il deployment e la gestione del driver CSI Kubernetes Filestore nei cluster.
L'utilizzo di Filestore CSI consente di creare o eliminare dinamicamente istanze Filestore e utilizzarle nei carichi di lavoro Kubernetes con un StorageClass o un Deployment.
Puoi creare una nuova istanza Filestore creando una PVC che esegue il provisioning dinamico di un'istanza Filestore e del PV oppure accedere a istanze Filestore di cui è stato eseguito il provisioning preliminare nei carichi di lavoro Kubernetes.
Nuova istanza
Crea la classe di archiviazione
volumeBindingModeè impostato suImmediate, il che consente di iniziare immediatamente il provisioning del volume.tierè impostato sustandardper ridurre i tempi di creazione dell'istanza Filestore. Se hai bisogno di uno spazio di archiviazione NFS con maggiore disponibilità, snapshot per il backup dei dati, replica dei dati in più zone e altre funzionalità di livello aziendale, impostatiersuenterprise. Nota: sereclaimPolicyinStorageClassnon è impostato, il criterio di recupero per i PV creati dinamicamente viene impostato suDeleteper impostazione predefinita.
Crea la risorsa
StorageClass:kubectl create -f filestore-storageclass.yamlVerifica che la classe di archiviazione sia stata creata:
kubectl get scL'output è simile al seguente:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Istanza di cui è stato eseguito il provisioning preliminare
Crea la classe di archiviazione
Se volumeBindingMode è impostato su Immediate, consente di iniziare il provisioning del volume immediatamente.
Crea la risorsa
StorageClass:kubectl create -f preprov-storageclass.yamlVerifica che la classe di archiviazione sia stata creata:
kubectl get scL'output è simile al seguente:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Crea un Persistent Volume per l'istanza Filestore
Verifica che l'istanza Filestore preesistente sia pronta:
gcloud filestore instances listL'output è simile al seguente, in cui il valore
STATEèREADY:INSTANCE_NAME: stateful-filestore LOCATION: us-central1-a TIER: ENTERPRISE CAPACITY_GB: 1024 FILE_SHARE_NAME: statefulpath IP_ADDRESS: 10.109.38.98 STATE: READY CREATE_TIME: 2022-04-05T18:58:28Prendi nota di
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEeIP_ADDRESSdell'istanza Filestore.Compila le variabili della console dell'istanza Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESSSostituisci le variabili segnaposto con le variabili della console ottenute in precedenza nel file
preprov-pv.yaml:sed "s/<INSTANCE_NAME>/$INSTANCE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<LOCATION>/$LOCATION/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<FILE_SHARE_NAME>/$FILE_SHARE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<IP_ADDRESS>/$IP_ADDRESS/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yamlCrea il PV
kubectl apply -f preprov-pv.yamlVerifica che
STATUSdel PV sia impostato suBound:kubectl get pvL'output è simile al seguente:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
Usa un oggetto PersistentVolumeClaim per accedere al volume
Il seguente file manifest pvc.yaml fa riferimento al StorageClass del driver CSI Filestore denominato filestore-sc.
Per avere più pod del lettore e del writer nel volume,
accessMode è impostato su ReadWriteMany.
Esegui il deployment della PVC:
kubectl create -f pvc.yamlVerifica che il PVC sia stato creato:
kubectl get pvcL'output è simile al seguente:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92mVerifica che l'istanza Filestore appena creata sia pronta:
gcloud filestore instances listL'output è simile al seguente:
INSTANCE_NAME: pvc-5bc55493-9e58-4ca5-8cd2-0739e0a7b68c LOCATION: northamerica-northeast2-a TIER: STANDARD CAPACITY_GB: 1024 FILE_SHARE_NAME: vol1 IP_ADDRESS: 10.29.174.90 STATE: READY CREATE_TIME: 2022-06-24T18:29:19
Crea un pod del lettore e del writer
In questa sezione, creerai un pod del lettore e un pod del writer. Questo tutorial utilizza i deployment Kubernetes per creare i pod. Un deployment è un oggetto API Kubernetes che ti consente di eseguire più repliche di pod distribuite tra i nodi di un cluster.
Crea il pod del lettore
Il pod del lettore leggerà il file scritto dai pod del writer. I pod di lettore vedranno l'ora e la replica del pod di writer che ha scritto nel file.
Il pod del lettore leggerà dal percorso /usr/share/nginx/html condiviso tra tutti i pod.
Esegui il deployment del pod del lettore:
kubectl apply -f reader-fs.yamlVerifica che le repliche del lettore siano in esecuzione con una query sull'elenco dei pod:
kubectl get podsL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
Crea il pod del writer
Il pod writer scrive periodicamente in un file condiviso a cui possono accedere altri pod writer e reader. Il pod writer registra la sua presenza scrivendo il nome host nel file condiviso.
L'immagine utilizzata per il pod writer è un'immagine personalizzata di Alpine Linux, che viene utilizzata per le utilità e le applicazioni di produzione. Include uno
script indexInfo.html che recupera i metadati dell'ultimo autore
e tiene traccia di tutti gli autori unici e delle scritture totali.
Per questo tutorial, il pod writer scrive ogni 30 secondi nel percorso /html/index.html. Modifica il valore del numero sleep per avere una frequenza di scrittura diversa.
Esegui il deployment del pod del writer:
kubectl apply -f writer-fs.yamlVerifica che i pod di scrittura siano in esecuzione con una query sull'elenco dei pod:
kubectl get podsL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s writer-855565fbc6-8gh2k 1/1 Running 0 2m31s writer-855565fbc6-lls4r 1/1 Running 0 2m31s
Esporre il workload del lettore a un bilanciatore del carico del servizio e accedervi
Per esporre un carico di lavoro all'esterno del cluster, crea un servizio di tipo
LoadBalancer. Questo tipo di servizio crea un bilanciatore del carico esterno con un indirizzo IP raggiungibile tramite internet.
Crea un servizio di tipo
LoadBalancerdenominatoreader-lb:kubectl create -f loadbalancer.yamlGuarda il deployment per vedere che GKE assegna un
EXTERNAL-IPper il servizioreader-lb:kubectl get svc --watchQuando
Serviceè pronto, la colonnaEXTERNAL-IPmostra l'indirizzo IP pubblico del bilanciatore del carico:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.8.128.1 <none> 443/TCP 2d21h reader-lb LoadBalancer 10.8.131.79 34.71.232.122 80:32672/TCP 2d20hPremi Ctrl+C per terminare il processo di monitoraggio.
Utilizza un browser web per accedere a
EXTERNAL-IPassegnato al bilanciatore del carico. La pagina viene aggiornata ogni 30 secondi. Più sono i writer Pod e più breve è la frequenza, più voci verranno visualizzate.
Per visualizzare ulteriori dettagli sul servizio di bilanciamento del carico, consulta loadbalancer.yaml.
Fai lo scale up del writer
Poiché il PV accessMode è stato impostato su ReadWriteMany, GKE può aumentare il numero di pod in modo che più pod del writer possano scrivere in questo volume condiviso (o più lettori possano leggerli).
Aumenta lo scale up di
writera cinque repliche:kubectl scale deployment writer --replicas=5L'output è simile al seguente:
deployment.extensions/writer scaledVerifica il numero di repliche in esecuzione:
kubectl get podsL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 11m writer-855565fbc6-8dfkj 1/1 Running 0 4m writer-855565fbc6-8gh2k 1/1 Running 0 10m writer-855565fbc6-gv5rs 1/1 Running 0 4m writer-855565fbc6-lls4r 1/1 Running 0 10m writer-855565fbc6-tqwxc 1/1 Running 0 4mUtilizza un browser web per tornare a
EXTERNAL-IPassegnato al bilanciatore del carico.
A questo punto, hai configurato e scalato il cluster per supportare cinque pod writer stateful. Dove più pod di scrittura scrivono contemporaneamente nello stesso file. Anche i pod reader possono essere facilmente scalati.
(Facoltativo) Accedi ai dati dal pod Writer
Questa sezione mostra come utilizzare un'interfaccia a riga di comando per accedere a un pod di lettura o scrittura. Puoi vedere il componente condiviso in cui lo scrittore sta scrivendo e il lettore sta leggendo.
Ottieni il nome del pod del writer:
kubectl get podsL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dPrendi nota del nome host di un pod del writer (esempio:
writer-5465d65b46-7hxv4).Esegui questo comando per accedere al pod writer:
kubectl exec -it WRITER_HOSTNAME -- /bin/shVisualizza il componente condiviso nel file
indexData.html:cd /html cat indexData.htmlCancella il file
indexData.html:echo '' > indexData.htmlAggiorna il browser web che ospita l'indirizzo
EXTERNAL-IPper visualizzare la modifica.Esci dall'ambiente:
exit