Ce document explique comment utiliser le clonage de volume Kubernetes pour cloner des volumes persistants dans vos clusters Google Kubernetes Engine (GKE).
Présentation
Un clone est un nouveau volume indépendant, qui est un double d'un volume Kubernetes existant. Un clone est semblable à un instantané de volume dans la mesure où il s'agit d'une copie d'un volume à un moment précis. Toutefois, au lieu de créer un objet instantané à partir du volume source, le clonage de volume provisionne le clone avec toutes les données du volume source.
Exigences
Pour utiliser le clonage de volume sur GKE, vous devez répondre aux exigences suivantes :
- L'objet PersistentVolumeClaim source doit se trouver dans le même espace de noms que l'objet PersistentVolumeClaim de destination.
- Utilisez un pilote CSI compatible avec le clonage de volume. Le pilote de disque persistant "in-tree" n'est pas compatible avec le clonage de volume.
- Le pilote CSI de disque persistant Compute Engine version 1.4.0 ou ultérieure est compatible avec le clonage de volume, et est installé par défaut sur les nouveaux clusters Linux exécutant la version 1.22 ou ultérieure de GKE. Vous pouvez également activer le pilote CSI de disque persistant Compute Engine sur un cluster existant.
Pour vérifier la version du pilote CSI de disque persistant Compute Engine, exécutez la commande suivante dans gcloud CLI :
kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"
Si le résultat affiche une version antérieure à 1.4.0
, mettez à niveau manuellement votre plan de contrôle pour obtenir la dernière version.
Limites
- Les deux volumes doivent utiliser le même mode de volume. Par défaut, GKE définit le paramètre VolumeMode sur
ext4
. - Toutes les restrictions relatives à la création de clones de disque à partir d'un disque existant sur Compute Engine s'appliquent également à GKE.
- Vous pouvez créer un clone de disque régional à partir d'un disque zonal, mais vous devez tenir compte des restrictions de cette approche.
- Le clonage doit être effectué dans une zone compatible. Utilisez allowedTopologies pour limiter la topologie des volumes provisionnés à des zones spécifiques. Une autre possibilité est d'utiliser nodeSelectors ou Affinité et anti-affinité pour forcer un pod à s'exécuter sur un nœud spécifique exécuté dans une zone compatible.
- Pour le clonage zonal, la zone du clone doit correspondre à celle du disque source.
- Pour le clonage zonal vers régional, l'une des zones répliquées du clone doit correspondre à la zone du disque source.
Utiliser le clonage de volume
Pour provisionner un clone de volume, vous devez ajouter une référence à un objet PersistentVolumeClaim existant situé dans le même espace de noms dans le champ dataSource
d'un nouvel objet PersistentVolumeClaim. L'exercice suivant montre comment provisionner un volume source avec des données, créer un clone de volume et l'utiliser.
Créer un volume source
Pour créer un volume source, suivez les instructions de l'article Utiliser le pilote CSI de disque persistant Compute Engine pour les clusters Linux pour créer des ressources StorageClass et PersistentVolumeClaim ainsi qu'un pod afin de consommer le nouveau volume. Vous allez utiliser l'objet PersistentVolumeClaim que vous créez en tant que source pour le clone de volume.
Ajouter un fichier de test au volume source
Ajoutez un fichier de test au volume source. Vous pouvez rechercher ce fichier de test dans le clone du volume pour vérifier que le clonage a bien été effectué.
Créez un fichier de test dans un pod :
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
Remplacez
POD_NAME
par le nom d'un pod qui consomme le volume source. Par exemple, si vous avez suivi les instructions de la section Utiliser le pilote CSI de disque persistant Compute Engine pour les clusters Linux, remplacezPOD_NAME
parweb-server
.Vérifiez la présence du fichier.
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
Le résultat ressemble à ce qui suit :
Hello World!
Cloner le volume source
Enregistrez le manifeste suivant sous le nom
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
Remplacez les éléments suivants :
PVC_NAME
: nom de l'objet PersistentVolumeClaim source que vous avez créé dans la section Créer un volume source.STORAGE_CLASS_NAME
: nom de l'objet StorageClass à utiliser, qui doit être identique à celui de l'objet PersistentVolumeClaim source.STORAGE
: capacité de stockage à demander, qui doit être au moins égale à la taille de l'objet PersistentVolumeClaim source.
Appliquer le fichier manifeste :
kubectl apply -f podpvc-clone.yaml
Créer un pod qui consomme le volume cloné
L'exemple suivant crée un pod qui consomme le clone de volume que vous avez créé.
Enregistrez le manifeste suivant sous le nom
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
Appliquer le fichier manifeste :
kubectl apply -f web-server-clone.yaml
Vérifiez que le fichier de test existe :
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
Le résultat ressemble à ce qui suit :
Hello World!
Effectuer un nettoyage
Pour éviter que les ressources utilisées sur cette page soient facturées sur votre compte Google Cloud, suivez les étapes ci-dessous :
Supprimer les objets
Pod
:kubectl delete pod POD_NAME web-server-clone
Supprimer les objets
PersistentVolumeClaim
:kubectl delete pvc podpvc podpvc-clone