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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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

结论

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
存储 Kubernetes 安全
Kubernetes 中如何对 etcd 进行备份和还原
Kubernetes 中如何对 etcd 进行备份和还原
|
3月前
|
Kubernetes 容器
Kubernetes(K8S) 镜像拉取策略 imagePullPolicy
Kubernetes(K8S) 镜像拉取策略 imagePullPolicy
95 0
|
3月前
|
Kubernetes Java Shell
Kubernetes(K8S) Deployment 升级和回滚
Kubernetes(K8S) Deployment 升级和回滚
119 0
|
存储 Kubernetes 文件存储
Kubernetes跨StorageClass迁移,切换Rainbond默认SC
在原生的 Kubernetes 集群中,通过 StorageClass 创建的 PVC 是无法修改存储后端的,需要将 PV、PVC 删除后通过新的 StorageClass 创建新的 PVC,然后再将数据迁移,再重新挂载 PVC。当有很多个 PVC 时,需要多次重复的操作。 而 Rainbond 虽然也是通过 StorageClass 创建的 PVC,但相比原生 Kubernetes 省去了创建 PV、PVC 和重新挂载的步骤,以及重复性的操作。在 Rainbond 中只需要将底层存储类更换,然后迁移 Rainbond 所创建的一整个目录,最后重新在页面中修改挂载即可完成迁移。
Kubernetes跨StorageClass迁移,切换Rainbond默认SC
|
6月前
|
存储 Kubernetes 对象存储
Velero 系列文章(一):基础
Velero 系列文章(一):基础
Velero 系列文章(一):基础
|
6月前
|
存储 Kubernetes 容灾
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
Velero 系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
|
存储 Kubernetes 安全
kubernetes集群备份与恢复
k8s集群服务所有组件都是无状态服务,所有数据都存储在etcd集群当中,所以为保证k8s集群的安全可以直接备份etcd集群数据,备份etcd的数据相当于直接备份k8s整个集群。
1519 1
|
存储 Kubernetes API
使用Velero备份部署在kubernetes集群中Harbor的数据
使用Velero备份部署在kubernetes集群中Harbor的数据
331 0
|
Prometheus Kubernetes 监控
Kubernetes 各组件日志清理
今天看到k8s的nodeexport pod failed,看到是磁盘空间压力过高。
609 0
|
Kubernetes 负载均衡 应用服务中间件
Kubernetes: Pod 升级、回滚
Kubernetes: Pod 升级、回滚
340 0
Kubernetes: Pod 升级、回滚