本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

Kubernetes 1.20:Kubernetes 卷快照迁移到 GA

Kubernetes v1.20 中 Kubernetes 卷快照功能现已正式发布 (GA)。它在 Kubernetes v1.12 中作为 alpha 引入,然后在 Kubernetes v1.13 中进行了带有重大更改的第二次 alpha,并在 Kubernetes 1.17 中晋升为 beta。此博文总结了将该功能从 beta 版本发布到 GA 的更改。

什么是卷快照?

许多存储系统(如 Google Cloud Persistent Disks、Amazon Elastic Block Storage 和许多本地存储系统)都提供创建持久卷“快照”的功能。快照代表卷的时间点副本。快照可用于重新填充新卷(预先填充快照数据)或将现有卷还原到先前的状态(由快照表示)。

为什么要将卷快照添加到 Kubernetes?

Kubernetes 旨在在分布式应用程序和底层集群之间创建一个抽象层,以便应用程序可以忽略它们运行的集群的具体细节,并且应用程序部署不需要“特定于集群”的知识。

Kubernetes Storage SIG 认为快照操作是许多有状态工作负载的关键功能。例如,数据库管理员可能希望在启动数据库操作之前对数据库的卷进行快照。

通过提供在 Kubernetes 中触发卷快照操作的标准方法,此功能允许 Kubernetes 用户以可移植的方式在任何 Kubernetes 环境中加入快照操作,而不管底层存储如何。

此外,这些 Kubernetes 快照原语充当基本构建块,可解锁为 Kubernetes 开发高级企业级存储管理功能的能力,包括应用程序或集群级备份解决方案。

自 beta 版本以来有哪些新变化?

随着卷快照升级到 GA,该功能在标准 Kubernetes 部署中默认启用,且无法关闭。

为了提高此功能的质量并使其达到生产级别,已进行了许多增强。

  • 卷快照 API 和客户端库已移至单独的 Go 模块。

  • 添加了一个快照验证 Webhook,以对卷快照对象执行必要的验证。更多详细信息可以在卷快照验证 Webhook Kubernetes 增强提案中找到。

  • 除了验证 Webhook 之外,卷快照控制器还将开始标记已存在的无效快照对象。这允许用户识别、删除任何无效对象并更正其工作流程。一旦 API 切换到 v1 类型,这些无效对象将无法从系统中删除。

  • 为了更好地了解快照功能的性能,已向卷快照控制器添加了一组初始操作指标。

  • 在 GCP 上运行了更多端到端测试,以在真实的 Kubernetes 集群中验证该功能。已引入压力测试(基于 Google Persistent Disk 和 hostPath CSI 驱动程序)以测试系统的稳健性。

除了引入更严格的验证之外,v1beta1 和 v1 Kubernetes 卷快照 API 之间没有区别。在此版本(Kubernetes 1.20)中,将同时提供 v1 和 v1beta1,而存储的 API 版本仍为 v1beta1。未来版本会将存储版本切换到 v1 并逐渐删除 v1beta1 支持。

哪些 CSI 驱动程序支持卷快照?

快照仅支持 CSI 驱动程序,不支持内部或 FlexVolume 驱动程序。确保集群上部署的 CSI 驱动程序已实现快照接口。有关更多信息,请参阅 Kubernetes GA 的容器存储接口 (CSI)

目前,超过 50 个 CSI 驱动程序支持卷快照功能。GCE Persistent Disk CSI 驱动程序已通过从卷快照 beta 版本升级到 GA 的测试。其他 CSI 驱动程序的 GA 级别支持应该很快可用。

谁使用卷快照构建产品?

截至此博客发布时,来自 Kubernetes 数据保护工作组 的以下参与者正在构建产品或已使用 Kubernetes 卷快照构建了产品。

如何部署卷快照?

卷快照功能包含以下组件

强烈建议 Kubernetes 发行版捆绑并部署卷快照控制器、CRD 和验证 Webhook 作为其 Kubernetes 集群管理过程的一部分(独立于任何 CSI 驱动程序)。

如果您的集群没有预先安装正确的组件,您可以手动安装它们。有关详细信息,请参阅 CSI 快照自述文件。

如何使用卷快照?

假设所有必需的组件(包括 CSI 驱动程序)都已部署并在您的集群上运行,您可以使用 VolumeSnapshot API 对象创建卷快照,或者通过指定其上的 VolumeSnapshot 数据源来使用现有的 VolumeSnapshot 来还原 PVC。有关更多详细信息,请参阅卷快照文档

动态配置卷快照

要动态配置卷快照,请首先创建 VolumeSnapshotClass API 对象。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: test-snapclass
driver: testdriver.csi.k8s.io
deletionPolicy: Delete
parameters:
  csi.storage.k8s.io/snapshotter-secret-name: mysecret
  csi.storage.k8s.io/snapshotter-secret-namespace: mysecretnamespace

然后通过指定卷快照类从 PVC 创建 VolumeSnapshot API 对象。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: test-snapshot
  namespace: ns1
spec:
  volumeSnapshotClassName: test-snapclass
  source:
    persistentVolumeClaimName: test-pvc

使用 Kubernetes 导入现有卷快照

要将预先存在的卷快照导入 Kubernetes,请首先手动创建 VolumeSnapshotContent 对象。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: test-content
spec:
  deletionPolicy: Delete
  driver: testdriver.csi.k8s.io
  source:
    snapshotHandle: 7bdd0de3-xxx
  volumeSnapshotRef:
    name: test-snapshot
    namespace: default

然后创建一个指向 VolumeSnapshotContent 对象的 VolumeSnapshot 对象。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: test-snapshot
spec:
  source:
        volumeSnapshotContentName: test-content

从快照重新填充卷

绑定并准备就绪的 VolumeSnapshot 对象可用于使用来自快照的数据预先填充的新卷,如下所示

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-restore
  namespace: demo-namespace
spec:
  storageClassName: test-storageclass
  dataSource:
    name: test-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

如何在 CSI 驱动程序中添加对快照的支持?

有关如何在 CSI 驱动程序中实现快照功能的更多详细信息,请参阅 CSI 规范Kubernetes-CSI 驱动程序开发人员指南

有哪些限制?

Kubernetes 中卷快照的 GA 实现具有以下限制:

  • 不支持将现有的 PVC 恢复到由快照表示的早期状态(仅支持从快照配置新卷)。

如何了解更多?

快照 API 和控制器的代码库在这里:https://github.com/kubernetes-csi/external-snapshotter

请查看以下关于快照功能的其他文档:http://k8s.io/docs/concepts/storage/volume-snapshotshttps://kubernetes-csi.github.io/docs/

如何参与?

与所有 Kubernetes 项目一样,该项目是许多来自不同背景的贡献者共同努力的成果。

我们非常感谢过去几个季度挺身而出帮助项目达到 GA 的贡献者。我们要感谢 Saad Ali、Michelle Au、Tim Hockin 和 Jordan Liggitt 对设计的富有见解的评论和周全的考虑,感谢 Andi Li 在添加快照验证 webhook 支持方面的工作,感谢 Grant Griffiths 在快照控制器中实现指标支持以及处理验证 webhook 中的密码轮换,感谢 Chris Henzie、Raunak Shah 和 Manohar Reddy 编写关键的 e2e 测试以满足毕业的可扩展性和稳定性要求,感谢 Kartik Sharma 将快照 API 和客户端库移动到单独的 go 模块,并感谢 Raunak Shah 和 Prafull Ladha 在从 beta 到 GA 的升级测试中提供的帮助。

还有更多人帮助将快照功能从 beta 阶段推进到 GA 阶段。我们想感谢每一位为此付出努力的人。

对于那些有兴趣参与 CSI 或 Kubernetes 存储系统的任何部分的设计和开发的人,请加入 Kubernetes 存储特别兴趣小组 (SIG)。我们正在快速发展,并始终欢迎新的贡献者。

我们还定期举行 数据保护工作组会议。欢迎新参与者加入讨论。