截取 PersistentVolume 快照
您可以将 Kubernetes 卷快照功能用于 GKE 集群中的永久性卷和动态预配。
通过卷快照,您可以在特定时间点创建卷的副本。您可以使用此副本将卷恢复到之前的状态或预配替换卷。
您可以使用以下组件预配和附加卷快照:
使用要求
如需在 GKE on Azure 上使用卷快照,您必须具有以下各项:
使用支持快照的容器存储接口 (CSI) 驱动程序的卷。GKE on Azure 默认使用的 Azure 磁盘和 Azure 文件驱动程序支持快照。
如需查看支持快照的所有 CSI 驱动程序列表,请参阅 Kubernetes 文档驱动程序中的“其他功能”列。
已有要用于快照的
PersistentVolumeClaim
。用于快照来源的PersistentVolume
必须由 CSI 驱动程序管理。您可以通过检查PersistentVolume
规范的csi
部分是否包含driver: disk.csi.azure.com
或file.csi.azure.com
来验证是否使用了 CSI 驱动程序。如果您的集群由 CSI 驱动程序动态预配 PersistentVolume(如以下部分所述),则它由 CSI 驱动程序管理。
准备工作
创建和使用卷快照
本文档中的示例展示了如何执行以下操作:
如需使用卷快照,您必须完成以下步骤:
- 创建
VolumeSnapshot
对象以请求现有 PersistentVolumeClaim 的快照。 - 在
PersistentVolumeClaim
中引用VolumeSnapshot
以将卷恢复到该快照,或者使用该快照创建新卷。
创建示例 PersistentVolumeClaim
和 Pod
如需创建
PersistentVolumeClaim
对象,请将以下清单保存为example-pvc.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
对于
spec.storageClassName
,您可以指定使用受支持的 CSI 驱动程序的任何存储类别。此示例使用默认的standard-rwo
存储类别。应用清单:
kubectl apply -f example-pvc.yaml
创建将当前日期和时间写入卷的 Pod。如需创建 pod,请将以下清单保存为
snapshot-shell.yaml
:apiVersion: v1 kind: Pod metadata: name: snapshot-shell spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "echo $(date -u) >> /data/out.txt"] volumeMounts: - name: snapshot-volume mountPath: /data restartPolicy: Never volumes: - name: snapshot-volume persistentVolumeClaim: claimName: example-pvc
应用清单:
kubectl apply -f snapshot-shell.yaml
检查 Pod 的状态:
kubectl get pod snapshot-shell
Pod 可能需要一些时间才能运行和完成。您可以运行上述命令,直到看到类似如下所示的输出:
NAME READY STATUS RESTARTS AGE snapshot-shell 0/1 Completed 0 24s
创建 VolumeSnapshot
VolumeSnapshot
对象是对现有 PersistentVolumeClaim
对象的快照的请求。当您创建 VolumeSnapshot
对象时,您的集群会自动创建它并将它与 VolumeSnapshotContent
对象绑定在一起(该对象是集群中的资源,例如 PersistentVolume
对象)。
将以下清单保存为
volumesnapshot.yaml
。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: example-snapshot spec: source: persistentVolumeClaimName: example-pvc
应用清单:
kubectl apply -f volumesnapshot.yaml
创建卷快照后,您的集群将创建相应的
VolumeSnapshotContent
对象。此对象用于存储VolumeSnapshot
对象的快照和绑定。您不会直接与VolumeSnapshotContents
对象进行交互:确认您的集群创建了
VolumeSnapshotContents
对象:kubectl get volumesnapshotcontents
输出内容类似如下:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
确认卷快照已准备就绪
创建卷快照内容后,您在 VolumeSnapshotClass
中指定的 CSI 驱动程序会在相应存储系统上创建快照。集群在存储系统上创建快照并将其绑定到 VolumeSnapshot
对象后,该快照即可供使用。您可以通过运行以下命令来检查状态:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
如果快照可供使用,则输出类似于以下内容:
NAME READY
example-snapshot true
恢复卷快照
您可以在 PersistentVolumeClaim
中引用 VolumeSnapshot
,以使用现有卷中的数据预配新卷,或者将卷恢复到您在快照中捕获的状态。
如需在 PersistentVolumeClaim
中引用 VolumeSnapshot
,请将 dataSource
字段添加到 PersistentVolumeClaim
。
在此示例中,您引用在新的 PersistentVolumeClaim
中创建的 VolumeSnapshot
,并创建装载 PersistentVolumeClaim
的 Pod。
将以下清单保存为
pvc-restore.yaml
:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: example-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
应用清单:
kubectl apply -f pvc-restore.yaml
启动将 PVC 装载到 Pod 的临时 Pod,并将
out.txt
的内容输出到日志。将以下清单保存为
restore-log.yaml
:apiVersion: v1 kind: Pod metadata: name: restore-verify spec: volumes: - name: restore-data persistentVolumeClaim: claimName: pvc-restore containers: - name: shell-container image: ubuntu:bionic volumeMounts: - mountPath: "/data" name: restore-data command: [ "/bin/sh" ] args: ["-c", "cat /data/out.txt", "exit", "1"] restartPolicy: Never
应用清单:
kubectl apply -f restore-log.yaml
检查快照是否已成功恢复
您在上一步中创建的 pod 会从快照读取数据。如需查看快照中的数据,请使用 kubectl logs
命令。
kubectl logs restore-verify
输出应包含快照中的时间戳。
清理
为避免因本页中使用的资源产生费用,请按照以下步骤操作。
删除
VolumeSnapshot
:kubectl delete volumesnapshot example-snapshot
删除临时 Pod:
kubectl delete -f restore-log.yaml
删除 Pod:
kubectl delete -f snapshot-shell.yaml
删除
PersistentVolumeClaim
对象:kubectl delete pvc example-pvc pvc-restore
后续步骤
- 阅读 Kubernetes 卷快照文档。
- 安装其他 CSI 驱动程序。