In diesem Dokument wird beschrieben, wie Sie einen Volume-Snapshot erstellen und dann zum Wiederherstellen des Volumes verwenden. Die Anleitung hier gilt für Cluster, die den vSphere-CSI-Treiber verwenden.
Vorbereitung
Lesen Sie Mit dem vSphere-CSI-Treiber (Container Storage Interface) arbeiten.
Prüfen Sie, ob Ihr Cluster eine StorageClass namens standard-rwo hat und ob der vSphere CSI-Treiber installiert ist.
Ihre vSphere-Version, ESXi und vCenter Server müssen Version 7.0 Update 3 oder höher sein. Weitere Informationen finden Sie unter Fehlerbehebung bei Speicherproblemen.
Die einzelnen Schritte im Überblick
Dies sind die wichtigsten Schritte der Übung in diesem Dokument:
- PersistentVolumeClaim erstellen.
- Erstellen Sie einen PersistentVolumeClaim, der die StorageClass
standard-rwoanfordert. Der Cluster stellt dann dynamisch ein PersistentVolume bereit und verknüpft es mit Ihrem PersistentVolumeClaim.
- Deployment erstellen.
- Erstellen Sie ein Deployment mit einem Pod. Der Pod gibt ein Volume basierend auf Ihrem PersistentVolumeClaim an. Der eine Container im Pod stellt das Volume unter
/hello/bereit.
- Schreiben Sie eine Datei in das Pod-Volume.
- Erstellen Sie im Pod-Volume eine Datei mit dem Namen
hello.txt. Der Inhalt der Datei ist „Hello World!“.
- VolumeSnapshot erstellen.
- Einen VolumeSnapshot erstellen, der den Status des Pod-Volumes erfasst.
- Beschädigen Sie die Datei.
- Ändern Sie die Datei
hello.txtso, dass sie wie eine beschädigte Datei aussieht. Der Inhalt der Datei lautet jetzt „Hello W-corrupted-file-orld!“.
- Verwenden Sie den Snapshot, um das Volume wiederherzustellen.
- Erstellen Sie einen zweiten PersistentVolumeClaim, der Ihren VolumeSnapshot als Datenquelle verwendet. Bearbeiten Sie die Bereitstellung so, dass ihr Volume dem neuen PersistentVolumeClaim zugeordnet wird. Prüfen Sie dann, ob die Datei
hello.txtwiederhergestellt wurde.
PersistentVolumeClaim erstellen
Hier ist ein Manifest für einen PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard-rwo
Im vorherigen Manifest sehen Sie, dass storageClassName auf standard-rwo festgelegt ist. Dies ist die Speicherklasse, die dem vSphere CSI-Treiber zugeordnet ist.
Speichern Sie das Manifest in einer Datei mit dem Namen my-pvc.yaml: PersistentVolumeClaim erstellen und ansehen:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
In der Ausgabe sehen Sie, dass der PersistentVolumeClaim an ein dynamisch bereitgestelltes PersistentVolume gebunden ist. Die folgende Ausgabe zeigt beispielsweise, dass der PersistentVolumeClaim mit dem Namen my-pvc an ein PersistentVolume mit dem Namen pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 gebunden ist:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
Deployment erstellen
Hier ist ein Manifest für ein Deployment:
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
Im Zusammenhang mit dieser Übung sind dies die wichtigsten Punkte zum Verständnis des vorherigen Deployment-Manifests:
Der Pod fordert Speicher an, indem er den zuvor erstellten PersistentVolumeClaim
my-pvcangibt.Der Pod hat einen Container und der Container stellt das Volume unter
/hello/bereit.
Speichern Sie das Manifest in einer Datei mit dem Namen my-deployment.yaml und erstellen Sie die Bereitstellung:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
Die Bereitstellung hat einen Pod. Rufen Sie den Namen des Pods ab:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Notieren Sie sich den Pod-Namen. In der folgenden Ausgabe lautet der Pod-Name beispielsweise my-deployment-7575c4f5bf-r59nt:
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
Erstellen Sie eine Datei im Pod-Volume und sehen Sie sich die Datei an.
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'
Die Ausgabe zeigt den Inhalt der Datei /hello/hello.txt:
Hello World!
Snapshot erstellen
Hier ist ein Manifest für einen VolumeSnapshot:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
volumeSnapshotClassName: csi-vsphere-snapshot-class
source:
persistentVolumeClaimName: my-pvc
Speichern Sie das Manifest in einer Datei mit dem Namen my-snapshot.yaml und erstellen Sie den VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
Datei im Volume beschädigen
Ändern Sie den Inhalt von hello.txt so, dass er beschädigt aussieht:
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'
In der Ausgabe sehen Sie, dass die Datei geändert wurde:
Hello W-corrupted-file-orld!
Wiederherstellen
Dies ist ein Manifest für einen zweiten PersistentVolumeClaim:
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
Im vorherigen Manifest sehen Sie, dass die Datenquelle für den neuen PersistentVolumeClaim der VolumeSnapshot ist, den Sie zuvor erstellt haben.
Speichern Sie das Manifest in einer Datei mit dem Namen my-pvc-2.yaml: PersistentVolumeClaim erstellen und ansehen:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
Öffnen Sie die Bereitstellung zum Bearbeiten:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
Ändern Sie my-pvc in my-pvc-2 und schließen Sie den Editor:
…
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc-2
Die Bereitstellung löscht den Pod und erstellt einen neuen Pod, der den neuen PersistentVolumeClaim verwendet.
Warten Sie einige Minuten und rufen Sie dann den neuen Pod-Namen ab:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
Prüfen Sie, ob das Pod-Volume wiederhergestellt wurde:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
Die Ausgabe zeigt, dass das Volume wiederhergestellt wurde:
Hello World!
Fehlerbehebung
Eine Anleitung zur Fehlerbehebung finden Sie unter Fehlerbehebung bei Speicherproblemen.