Kubernetes snapshots 快照是什么以及如何使用快照

简介: Kubernetes snapshots 快照是什么以及如何使用快照

随着 Kubernetes 中快照控制器的引入,现在可以为支持此功能的 CSI 驱动程序和云提供商创建快照。

API 是通用的且独立于供应商,这对于 Kubernetes 来说是典型的,因此我们可以探索它而无需深入了解特定实现的细节。让我们仔细看看快照,看看它们如何使 Kubernetes 用户受益。

介绍

首先,让我们澄清什么是快照。快照是文件系统在特定时间点的状态。您可以保存它并在以后使用它来恢复该特定状态。创建快照的过程几乎是瞬时的。创建快照后,对原始文件系统的所有更改都将写入不同的块。

由于快照数据与原始数据存储在同一位置,因此快照不能替代备份。同时,基于快照而不是实时数据的备份更加一致。这是因为在创建快照时保证所有数据都是最新的。

必须安装 snapshot-controller (所有 CSI driver 的通用组件),并且必须在 Kubernetes 集群中定义以下 CRD 才能使用快照功能:

  • VolumeSnapshotClass – 相当于快照的 StorageClass
  • VolumeSnapshotContent – 相当于快照的 PV
  • VolumeSnapshot – 相当于快照的 PVC

最重要的是,CSI 驱动程序必须支持快照创建并具有相关的 csi-snapshotter controller。

快照在 Kubernetes 中是如何工作的?

他们运作背后的逻辑很简单。有几个实体;VolumeSnapshotClass 描述快照创建的参数,例如 CSI driver。您还可以在那里指定其他设置,例如,快照是否应该是增量的以及它们应该存储在哪里。

创建 VolumeSnapshot 时,您必须指定将为其创建快照的 PersistentVolumeClaim

拍摄快照时,CSI 驱动程序会在集群中创建一个 VolumeSnapshotContent 资源并设置其参数(通常是资源 ID)。

接下来,快照控制器绑定 VolumeSnapshotVolumeSnapshotContent(就像 PV 和 PVC 一样)。

创建新的 PersistentVolume 时,您可以将先前创建的 VolumeSnapshot 设置为  dataSource 以使用其数据。

配置

VolumeSnapshotClass 允许您指定各种 VolumeSnapshot 属性,例如 CSI 驱动程序名称和其他云提供商/数据存储相关参数。下面提供了几个 VolumeSnapshotClass 资源定义示例的链接 :

  • OpenStack
  • vSphere
  • AWS
  • Azure
  • LINSTOR
  • GCP
  • CephFS
  • Ceph RBD

创建 VolumeSnapshotClass 后 ,您就可以开始拍摄快照了。让我们来看看一些典型的用例。

案例一:PVC templates

假设我们想要一些包含数据的 PVC 模板,并在需要时克隆它。在以下情况下这可能会派上用场:

  • 使用数据快速创建开发环境;
  • 在不同节点上使用多个 Pod 同时处理数据。

这背后的魔力是创建一个标准 PVC,用你想要的数据填充它,然后创建另一个 PVC 以原始集作为其源:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-worker1
spec:
  storageClassName: linstor-ssd-lvmthin-r2
  dataSource:
    name: pvc-template
    kind: PersistentVolumeClaim
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
    storage: 10Gi

您将获得包含所有数据的原始 PVC 的完整克隆,您可以立即使用。快照机制在这里是完全透明的,所以我们甚至不必使用上述任何资源。

案例二:用于测试的快照

此案例展示了如何在不干扰生产的情况下安全地对实时数据进行数据库迁移建模。

我们必须克隆我们的应用程序使用的现有 PVC(就像在上面的示例中一样)以及具有克隆 PVC 的新应用程序版本来测试升级。如果遇到问题,您可以创建一个新的克隆并重试。

测试完成后,可以将新版本的应用程序部署到生产环境中。但首先,创建一个 mypvc-before-upgrade 快照,这样您就可以随时恢复到升级前的状态。快照是使用 VolumeSnapshots 资源创建的。在其中指定创建快照的目标 PVC:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mypvc-before-upgrade
spec:
  volumeSnapshotClassName: linstor
  source:
    persistentVolumeClaimName: mypvc

mypvc-before-upgrade 切换到新版本后,您始终可以通过将快照指定为 PVC 源来恢复到升级前的状态:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  storageClassName: linstor-ssd-lvmthin-r2
  dataSource:
    name: mypvc-before-upgrade
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
    storage: 10Gi

案例三:使用快照做一致性备份

快照对于在运行环境中创建一致的备份是不可或缺的。没有它们,就没有办法在不先暂停应用程序的情况下进行 PVC 备份。

如果您尝试在应用程序运行时复制整个卷,则很可能会覆盖其中的某些部分。为避免这种情况,您可以拍摄快照并将其用于备份。

有多种工具可用于在 Kubernetes 中进行备份,这些工具尊重应用程序的逻辑且/或使用快照机制。其中一个工具 Velero 允许您自动使用快照,安排额外的挂钩将数据重置到磁盘,并暂停/恢复应用程序以获得更好的备份一致性。

同时,一些供应商提供了内置的备份功能。例如,LINSTOR 允许您自动将快照上传到远程 S3 服务器,并支持完整和增量备份。

为了从此功能中受益,您需要创建一个专用的 VolumeSnapshotClass 包含访问远程 S3 服务器所需的所有参数:

---
kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
metadata:
  name: linstor-minio
driver: linstor.csi.linbit.com
deletionPolicy: Retain
parameters:
  snap.linstor.csi.linbit.com/type: S3
  snap.linstor.csi.linbit.com/remote-name: minio
  snap.linstor.csi.linbit.com/allow-incremental: "false"
  snap.linstor.csi.linbit.com/s3-bucket: foo
  snap.linstor.csi.linbit.com/s3-endpoint: XX.XXX.XX.XXX.nip.io
  snap.linstor.csi.linbit.com/s3-signing-region: minio
  snap.linstor.csi.linbit.com/s3-use-path-style: "true"
  csi.storage.k8s.io/snapshotter-secret-name: linstor-minio
  csi.storage.k8s.io/snapshotter-secret-namespace: minio
---
kind: Secret
apiVersion: v1
metadata:
  name: linstor-minio
  namespace: minio
immutable: true
type: linstor.csi.linbit.com/s3-credentials.v1
stringData:
  access-key: minio
  secret-key: minio123

新创建的快照现在将被推送到远程 S3 服务器:

---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mydb-backup1
spec:
  volumeSnapshotClassName: linstor-minio
  source:
    persistentVolumeClaimName: db-data

有趣的是,您可以在不同的 Kubernetes 集群中使用它们。为此,除了 VolumeSnapshotClass 之外,您还必须定义 VolumeSnapshotContentVolumeSnapshot

---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: example-backup-from-s3
spec:
  deletionPolicy: Delete
  driver: linstor.csi.linbit.com
  source:
    snapshotHandle: snapshot-0a829b3f-9e4a-4c4e-849b-2a22c4a3449a
  volumeSnapshotClassName: linstor-minio
  volumeSnapshotRef:
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    name: example-backup-from-s3
    namespace: new-cluster
---
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: example-backup-from-s3
spec:
  source:
    volumeSnapshotContentName: example-backup-from-s3
  volumeSnapshotClassName: linstor-minio

请注意,您必须在 VolumeSnapshotContent 中通过 snapshotHandle 参数指定存储系统的快照 ID。

现在您可以使用备份快照作为数据源来创建新的 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: restored-data
  namespace: new-cluster
spec:
  storageClassName: linstor-ssd-lvmthin-r2
  dataSource:
    name: example-backup-from-s3
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
    storage: 10Gi

结论

借助快照,您可以通过创建一致的备份和克隆卷来更有效地利用您的存储解决方案。它们还允许您避免在不必要时复制数据。这是快照,让您的生活更轻松、更美好!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes Linux API
[没接触过kubevirt?]15分钟快速入门kubevirt
什么是kubevirt? kubevirt是一个容器方式运行虚拟机的项目。`kubevirt`是附加`kubernetes`集群上的,它是通过 `CustomResourceDefinition(CRD)`部署到`Kubernetes API`变成资源对象。使用方式类似创建`deploy、pod`......这些资源清单。
5319 0
[没接触过kubevirt?]15分钟快速入门kubevirt
|
存储 Kubernetes 数据可视化
|
JSON Kubernetes Unix
Kubernetes crictl管理命令详解
Kubernetes crictl管理命令详解
|
Kubernetes 容器 Perl
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
【kubernetes】解决: kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = faile...
16517 0
|
人工智能 Kubernetes Cloud Native
Kube Queue:Kubernetes 任务排队的利器
Kube Queue:Kubernetes 任务排队的利器
222062 104
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
420 7
|
JSON Kubernetes Linux
k8s备份恢复实践--velero
使用Velero备份k8资源到minio,阿里云oss,七牛云Kodo
606 8
|
存储 Kubernetes Unix
k8s教程(Volume篇)-CSI存储机制详解
k8s教程(Volume篇)-CSI存储机制详解
2547 0
k8s教程(Volume篇)-CSI存储机制详解
|
存储 Kubernetes 对象存储
Velero 系列文章(一):基础
Velero 系列文章(一):基础
Velero 系列文章(一):基础
|
存储 Kubernetes 网络协议
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数
8145 3
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件