截取 PersistentVolume 快照

您可以将 Kubernetes 卷快照功能用于 GKE 集群中的永久性卷和动态预配

通过卷快照,您可以在特定时间点创建卷的副本。您可以使用此副本将卷恢复到之前的状态或预配替换卷。

您可以使用以下组件预配和附加卷快照:

使用要求

如需在 GKE on Azure 上使用卷快照,您必须具有以下各项:

  • 使用支持快照的容器存储接口 (CSI) 驱动程序的卷。GKE on Azure 默认使用的 Azure 磁盘和 Azure 文件驱动程序支持快照。

    如需查看支持快照的所有 CSI 驱动程序列表,请参阅 Kubernetes 文档驱动程序中的“其他功能”列。

  • 已有要用于快照的 PersistentVolumeClaim。用于快照来源的 PersistentVolume 必须由 CSI 驱动程序管理。您可以通过检查 PersistentVolume 规范的 csi 部分是否包含 driver: disk.csi.azure.comfile.csi.azure.com 来验证是否使用了 CSI 驱动程序。如果您的集群由 CSI 驱动程序动态预配 PersistentVolume(如以下部分所述),则它由 CSI 驱动程序管理。

准备工作

创建和使用卷快照

本文档中的示例展示了如何执行以下操作:

  1. 创建示例 PersistentVolumeClaimPod
  2. 创建 VolumeSnapshot
  3. 恢复卷快照
  4. 验证恢复是否有效

如需使用卷快照,您必须完成以下步骤:

  1. 创建 VolumeSnapshot 对象以请求现有 PersistentVolumeClaim 的快照。
  2. PersistentVolumeClaim 中引用 VolumeSnapshot 以将卷恢复到该快照,或者使用该快照创建新卷。

创建示例 PersistentVolumeClaimPod

  1. 如需创建 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 存储类别。

  2. 应用清单:

    kubectl apply -f example-pvc.yaml
    
  3. 创建将当前日期和时间写入卷的 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
    
  4. 应用清单:

    kubectl apply -f snapshot-shell.yaml
    
  5. 检查 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 对象)。

  1. 将以下清单保存为 volumesnapshot.yaml

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. 应用清单:

    kubectl apply -f volumesnapshot.yaml
    

    创建卷快照后,您的集群将创建相应的 VolumeSnapshotContent 对象。此对象用于存储 VolumeSnapshot 对象的快照和绑定。您不会直接与 VolumeSnapshotContents 对象进行交互:

  3. 确认您的集群创建了 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。

  1. 将以下清单保存为 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
    
  2. 应用清单:

    kubectl apply -f pvc-restore.yaml
    
  3. 启动将 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
    
  4. 应用清单:

    kubectl apply -f restore-log.yaml
    

检查快照是否已成功恢复

您在上一步中创建的 pod 会从快照读取数据。如需查看快照中的数据,请使用 kubectl logs 命令。

kubectl logs restore-verify

输出应包含快照中的时间戳。

清理

为避免因本页中使用的资源产生费用,请按照以下步骤操作。

  1. 删除 VolumeSnapshot

    kubectl delete volumesnapshot example-snapshot
    

  2. 删除临时 Pod:

    kubectl delete -f restore-log.yaml
    
  3. 删除 Pod:

    kubectl delete -f snapshot-shell.yaml
    
  4. 删除 PersistentVolumeClaim 对象:

    kubectl delete pvc example-pvc pvc-restore
    

后续步骤