Questo documento mostra come utilizzare la clonazione dei volumi Kubernetes per clonare volumi permanenti nei cluster Google Kubernetes Engine (GKE).
Panoramica
Un clone è un nuovo volume indipendente che è una copia di un volume Kubernetes esistente. Un clone è simile a uno snapshot del volume, in quanto è una copia di un volume in un momento specifico. Tuttavia, anziché creare un oggetto snapshot dal volume di origine, la clonazione del volume esegue il provisioning del clone con tutti i dati del volume di origine.
Requisiti
Per utilizzare la clonazione dei volumi su GKE, devi soddisfare i seguenti requisiti:
- Il PersistentVolumeClaim di origine deve trovarsi nello stesso spazio dei nomi del PersistentVolumeClaim di destinazione.
- Utilizza un driver CSI che supporti la clonazione dei volumi. Il driver del disco permanente in-tree
non supporta la clonazione del volume.
- Il driver CSI del disco permanente di Compute Engine versione 1.4.0 e successive supporta la clonazione dei volumi ed è installato per impostazione predefinita sui nuovi cluster Linux che eseguono GKE versione 1.22 o successive. Puoi anche abilitare il driver CSI per il disco permanente di Compute Engine su un cluster esistente.
Per verificare la versione del driver CSI per il disco permanente di Compute Engine, esegui questo comando in gcloud CLI:
kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"
Se l'output mostra una versione precedente a 1.4.0
,
esegui manualmente l'upgrade del control plane
per ottenere l'ultima versione.
Limitazioni
- Entrambi i volumi devono utilizzare la stessa modalità di volume. Per impostazione predefinita, GKE imposta VolumeMode su
ext4
. - Tutte le limitazioni per la creazione di un clone di un disco da un disco esistente su Compute Engine si applicano anche a GKE.
- Puoi creare un clone del disco regionale da un disco zonale, ma devi essere consapevole delle limitazioni di questo approccio.
- La clonazione deve essere eseguita in una zona compatibile. Utilizza allowedTopologies per limitare la topologia dei volumi di cui è stato eseguito il provisioning a zone specifiche. In alternativa, è possibile utilizzare nodeSelectors o affinità e anti-affinità per vincolare un pod in modo che possa essere eseguito solo su un particolare nodo in esecuzione in una zona compatibile.
- Per la clonazione da zona a zona, la zona di clonazione deve corrispondere alla zona del disco di origine.
- Per la clonazione da zona a regione, una delle zone di replica del clone deve corrispondere alla zona del disco di origine.
Utilizzo della clonazione del volume
Per eseguire il provisioning di un clone del volume, aggiungi un riferimento a un PersistentVolumeClaim esistente nello stesso spazio dei nomi al campo dataSource
di un nuovo PersistentVolumeClaim. Il seguente esercizio mostra come eseguire il provisioning
di un volume di origine con i dati, creare un clone del volume e utilizzarlo.
Crea un volume di origine
Per creare un volume di origine, segui le istruzioni riportate in Utilizzo del driver CSI per il disco permanente di Compute Engine per i cluster Linux per creare una StorageClass, un PersistentVolumeClaim e un pod per utilizzare il nuovo volume. Utilizzerai l'oggetto PersistentVolumeClaim che crei come origine per il clone del volume.
Aggiungere un file di test al volume di origine
Aggiungi un file di test al volume di origine. Puoi cercare questo file di test nel clone del volume per verificare che la clonazione sia riuscita.
Creare un file di test in un pod:
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
Sostituisci
POD_NAME
con il nome di un pod che utilizza il volume di origine. Ad esempio, se hai seguito le istruzioni riportate in Utilizzo del driver CSI per il disco permanente di Compute Engine per i cluster Linux, sostituisciPOD_NAME
conweb-server
.Verifica che il file esista:
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
L'output è simile al seguente:
Hello World!
Clona il volume di origine
Salva il seguente manifest come
podpvc-clone.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc-clone spec: dataSource: name: PVC_NAME kind: PersistentVolumeClaim accessModes: - ReadWriteOnce storageClassName: STORAGE_CLASS_NAME resources: requests: storage: STORAGE
Sostituisci quanto segue:
PVC_NAME
: il nome di PersistentVolumeClaim di origine che hai creato in Crea un volume di origine.STORAGE_CLASS_NAME
: il nome dell'oggetto StorageClass da utilizzare, che deve essere lo stesso dell'oggetto StorageClass di PersistentVolumeClaim di origine.STORAGE
: la quantità di spazio di archiviazione da richiedere, che deve essere almeno pari alle dimensioni di PersistentVolumeClaim di origine.
Applica il manifest:
kubectl apply -f podpvc-clone.yaml
Crea un pod che utilizza il volume clonato
L'esempio seguente crea un pod che utilizza il clone del volume che hai creato.
Salva il seguente manifest come
web-server-clone.yaml
:apiVersion: v1 kind: Pod metadata: name: web-server-clone spec: containers: - name: web-server-clone image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc-clone readOnly: false
Applica il manifest:
kubectl apply -f web-server-clone.yaml
Verifica che il file di test esista:
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
L'output è simile al seguente:
Hello World!
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, segui questi passaggi.
Elimina gli oggetti
Pod
:kubectl delete pod POD_NAME web-server-clone
Elimina gli oggetti
PersistentVolumeClaim
:kubectl delete pvc podpvc podpvc-clone