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

指针流沙
• 阅读 1815

随着 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 资源定义示例的链接 :

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

案例一:PVC templates

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

假设我们想要一些包含数据的 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 的完整克隆,您可以立即使用。快照机制在这里是完全透明的,所以我们甚至不必使用上述任何资源。

案例二:用于测试的快照

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

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

我们必须克隆我们的应用程序使用的现有 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

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

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

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

结论

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
2019 年 CNCF 中国云原生调查报告
!头图.jpg(https://ucc.alicdn.com/pic/developerecology/6db0c465111b4d9a96eb1ffe85c00e7a.jpg)中国72%的受访者生产中使用Kubernetes在CNCF,为更好地了解开源和云原生技术的使用,我们定期调查社区。这是第三次中国云原生调查,以中文进行
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这