Ce document explique comment créer un instantané de volume, puis l'utiliser pour restaurer le volume. Les instructions fournies ici s'appliquent aux clusters qui utilisent le pilote CSI vSphere.
Avant de commencer
Consultez Utiliser le pilote Container Storage Interface (CSI) vSphere
Vérifiez que votre cluster dispose d'une StorageClass nommée standard-rwo et que le pilote CSI vSphere est installé.
Votre version de vSphere, ESXi et vCenter Server doivent être la version 7.0 Mise à jour 3 ou ultérieure. Pour en savoir plus, consultez Dépannage du stockage.
Vue d'ensemble de la procédure
Voici les principales étapes de l'exercice présenté dans ce document :
- Créer un objet PersistentVolumeClaim
- Créez un PersistentVolumeClaim qui demande la classe de stockage
standard-rwo. Le cluster provisionne ensuite de manière dynamique un objet PersistentVolume et l'associe à votre objet PersistentVolumeClaim.
- Créez un déploiement.
- Créez un objet Déploiement comportant un pod. Le pod spécifie un volume basé sur votre objet PersistentVolumeClaim. Le seul conteneur du pod installe le volume sur
/hello/.
- Écrivez un fichier sur le volume du pod.
- Créez un fichier nommé
hello.txtdans le volume du pod. Le contenu du fichier est "Hello World!".
- Créez un objet VolumeSnapshot.
- Créez un objet VolumeSnapshot qui capture l'état du volume du pod.
- Provoquez la corruption du fichier.
- Modifiez le fichier
hello.txtpour qu'il ressemble à un fichier corrompu. Le contenu du fichier est désormais "Hello W-corrupted-file-orld!"
- Utilisez l'instantané pour restaurer le volume.
- Créez un deuxième objet PersistentVolumeClaim qui utilise votre objet VolumeSnapshot comme source de données. Modifiez votre objet Déploiement afin que son volume soit associé au nouvel objet PersistentVolumeClaim. Vérifiez ensuite que le fichier
hello.txta été restauré.
Créer un objet PersistentVolumeClaim
Voici le fichier manifeste d'un objet PersistentVolumeClaim :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard-rwo
Dans le fichier manifeste précédent, vous pouvez voir que storageClassName est défini sur standard-rwo. Il s'agit de la classe de stockage associée au pilote vSphere CSI.
Enregistrez le fichier manifeste dans un fichier nommé my-pvc.yaml : Créez et affichez l'objet PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
Dans le résultat, vous pouvez voir que l'objet PersistentVolumeClaim est lié à un objet PersistentVolume provisionnée de manière dynamique. Par exemple, le résultat suivant montre que PersistentVolumeClaim nommé my-pvc est lié à un PersistentVolume nommé pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 :
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
Créer un déploiement
Voici le fichier manifeste d'un déploiement :
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: google/cloud-sdk:slim
args: [ "sleep", "3600" ]
volumeMounts:
- name: my-volume
mountPath: /hello/
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
Dans le contexte de cet exercice, voici les points importants à comprendre à propos du fichier manifeste de déploiement précédent:
Le pod demande un espace de stockage en spécifiant la PersistentVolumeClaim,
my-pvc, que vous avez créée précédemment.Le pod comporte un conteneur, et celui-ci installe le volume sur
/hello/.
Enregistrez le fichier manifeste dans un fichier nommé my-deployment.yaml et créez l'objet Déploiement :
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
L'objet Déploiement comporte un pod. Récupérez le nom du pod :
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Notez le nom du pod. Par exemple, dans le résultat suivant, le nom du pod est my-deployment-7575c4f5bf-r59nt :
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
Créez un fichier dans le volume du pod et affichez-le.
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello World!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
Le résultat affiche le contenu du fichier /hello/hello.txt :
Hello World!
Créer un instantané
Voici le fichier manifeste d'un objet VolumeSnapshot :
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-vsphere-snapshot-class
source:
persistentVolumeClaimName: my-pvc
Enregistrez le fichier manifeste dans un fichier nommé my-snapshot.yaml et créez l'objet VolumeSnapshot :
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
Corrompre le fichier dans le volume
Modifiez le contenu de hello.txt pour qu'il semble corrompu :
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'
kubectl --kubeconfig CLUSTER_KUBECONFIG \
exec POD_NAME \
-- sh -c 'cat /hello/hello.txt'
Dans le résultat, vous pouvez voir que le fichier a été modifié :
Hello W-corrupted-file-orld!
Restaurer
Voici le fichier manifeste d'un second objet VolumeSnapshot :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc-2
spec:
storageClassName: standard-rwo
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
Dans le fichier manifeste précédent, vous pouvez voir que la source de données de la nouvelle demande PersistentVolume est l'objet VolumeSnapshot que vous avez créé précédemment.
Enregistrez le fichier manifeste suivant dans un fichier nommé my-pvc-2.yaml : Créez et affichez l'objet PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
Ouvrez l'objet Déploiement pour le modifier :
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
Remplacez my-pvc par my-pvc-2, puis fermez l'éditeur :
…
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc-2
L'objet Déploiement supprime le pod et en crée un nouveau qui utilise le nouvel objet PersistentVolumeClaim.
Attendez quelques minutes, puis récupérez le nom du nouveau pod :
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Vérifiez que le volume du pod a été restauré :
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
Le résultat indique que le volume a été restauré :
Hello World!
Dépannage
Pour obtenir des conseils de dépannage, consultez Dépannage du stockage.