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
目录
相关文章
|
存储 测试技术 API
OpenStack的文件系统存储(Manila)
【8月更文挑战第24天】
593 2
|
机器学习/深度学习 人工智能 Kubernetes
容器化AI模型部署实战:从训练到推理
在上一篇中,我们探讨了AI技术如何赋能容器化生态。本篇聚焦于AI模型的容器化部署,通过图像分类任务实例,详细介绍了从模型训练到推理服务的完整流程。使用PyTorch训练CNN模型,Docker打包镜像,并借助Kubernetes进行编排和部署,最终通过FastAPI提供推理服务。容器化技术极大提升了AI模型部署的便利性和管理效率,未来将成为主流趋势。
|
Kubernetes 应用服务中间件 API
kubernetes HPA-超详细中文官方文档
kubernetes HPA-超详细中文官方文档
|
存储 Kubernetes 对象存储
Velero 系列文章(一):基础
Velero 系列文章(一):基础
Velero 系列文章(一):基础
|
Kubernetes Go Docker
Kubernetes + CRI + Kata + Firecracker
在最近的AWS re:invent 2018上,AWS又发布了一系列新的产品,在这些产品中,最受关注的无疑就是面向serverless的Firecracker。Firecracker是针对目前现有的虚拟化技术在serverless应用场景中的各种不足,而专门为serverless量身打造的一项新的虚拟化技术。
11267 0
Kubernetes + CRI + Kata + Firecracker
|
搜索推荐 应用服务中间件 nginx
docker与containerd镜像获取及导出导入的区别与注意事项(报错信息:ctr: content digest sha256........ac47: not found)
docker与containerd镜像获取及导出导入的区别与注意事项(报错信息:ctr: content digest sha256........ac47: not found)
1692 2
|
存储 Kubernetes Unix
k8s教程(Volume篇)-CSI存储机制详解
k8s教程(Volume篇)-CSI存储机制详解
3212 0
k8s教程(Volume篇)-CSI存储机制详解
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
1957 0
|
存储 Prometheus Cloud Native
Grafana 系列文章(五):Grafana Explore 查询管理
Grafana 系列文章(五):Grafana Explore 查询管理
|
存储 Cloud Native 虚拟化
超融合产品集成 Kata 虚拟化容器技术的方案演进 | 龙蜥技术
识别云原生现有方案在超融合环境下技术缺陷。