本文档介绍了如何创建卷快照,然后使用快照恢复卷。此处的说明适用于使用 vSphere CSI 驱动程序的集群。
准备工作
验证集群是否具有一个名为 standard-rwo
的 StorageClass,以及是否已安装 vSphere CSI 驱动程序。
您的 vSphere 版本、ESXi 和 vCenter Server 必须为 7.0 Update 3 或更高版本。如需了解详情,请参阅排查存储问题。
步骤概述
以下是本文档中提供的练习的主要步骤:
- 创建 PersistentVolumeClaim。
- 创建一个请求
standard-rwo
存储类别的 PersitentVolumeClaim。然后,集群会动态预配 PersistentVolume 并将其与 PersistentVolumeClaim 关联。
- 创建 Deployment
- 创建包含一个 Pod 的 Deployment。Pod 会根据 PersistentVolumeClaim 指定卷。Pod 中的一个容器会将卷装载到
/hello/
。
- 将文件写入 Pod 卷。
- 在 Pod 卷中创建一个名为
hello.txt
的文件。该文件的内容为“Hello World!”。
- 创建 VolumeSnapshot。
- 创建一个捕获 Pod 卷状态的 VolumeSnapshot。
- 损坏此文件。
- 更改
hello.txt
文件,使其看起来像已损坏的文件。该文件的内容现在为“Hello W-corrupted-file--orld!”
- 使用快照恢复卷。
- 创建第二个将 VolumeSnapshot 用作其数据源的 PersistentVolumeClaim。修改 Deployment,使其卷与新 PersistentVolumeClaim 关联。然后,验证
hello.txt
文件是否已恢复。
创建一个 PersistentVolumeClaim
以下是 PersistentVolumeClaim 的清单:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo
在上述清单中,您可以看到 storageClassName
设置为 standard-rwo
。这是与 vSphere CSI 驱动程序关联的存储类别。
将此清单保存在名为 my-pvc.yaml
的文件中。创建并查看 PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc
在输出中,您可以看到 PersistentVolumeClaim 已绑定到动态预配的 PersistentVolume。例如,以下输出显示名为 my-pvc
的 PersistentVolumeClaim 已绑定到名为 pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5
的 PersistentVolume:
my-pvc Bound pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 … standard-rwo 100s
创建 Deployment
以下是 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
在本练习中,您需要了解上述 Deployment 清单的以下要点:
Pod 通过指定您之前创建的 PersistentVolumeClaim
my-pvc
来请求存储。Pod 具有一个容器,该容器会将卷装载到
/hello/
。
将此清单保存到名为 my-deployment.yaml
的文件中,然后创建 Deployment:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml
Deployment 具有一个 Pod。获取此 Pod 的名称:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
记下 Pod 名称。例如,在以下输出中,Pod 名称为 my-deployment-7575c4f5bf-r59nt
:
my-deployment-7575c4f5bf-r59nt 1/1 Running 0 65s
在 Pod 卷中创建一个文件,然后查看此文件。
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'
输出会显示文件 /hello/hello.txt
的内容:
Hello World!
创建快照
以下是 VolumeSnapshot 的清单:
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: csi-vsphere-snapshot-class source: persistentVolumeClaimName: my-pvc
将此清单保存到名为 my-snapshot.yaml
的文件中,然后创建 VolumeSnapshot:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml
损坏卷中的文件
更改 hello.txt
的内容,使其看起来已损坏:
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'
在输出中,您可以看到此文件已更改:
Hello W-corrupted-file-orld!
恢复
以下是第二个 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
在上述清单中,您可以看到新 PersistentVolumeClaim 的数据源是您之前创建的 VolumeSnapshot。
将此清单保存在名为 my-pvc-2.yaml
的文件中。创建并查看 PersistentVolumeClaim:
kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2
打开 Deployment 进行修改:
kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment
将 my-pvc
更改为 my-pvc-2
,然后关闭编辑器:
… volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc-2
Deployment 会删除 Pod,并创建使用新 PersistentVolumeClaim 的新 Pod。
等待几分钟,然后获取新 Pod 的名称:
kubectl --kubeconfig CLUSTER_KUBECONFIG get pods
验证 Pod 卷是否已恢复:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ exec NEW_POD_NAME \ -- sh -c 'cat /hello/hello.txt'
输出显示该卷已恢复:
Hello World!
问题排查
如需获取问题排查指导,请参阅排查存储问题。