Kubernetes 1.20:Kubernetes卷快照移至GA

s:杨星,VMware和项向前,Google

Kubernetes v1.20中现已提供Kubernetes卷快照功能。它被介绍为 α 在Kubernetes v1.12中,然后是 第二个字母 Kubernetes v1.13中的重大更改,并升级到 贝塔 在Kubernetes 1.17中。这篇博客文章总结了从Beta到GA释放该功能的更改。

什么是卷快照?

许多存储系统(例如Google Cloud永久磁盘,Amazon Elastic Block Storage和许多本地存储系统)都可以创建持久卷的“快照”。快照表示卷的时间点副本。快照可用于重新充水新卷(预填充快照数据)或将现有卷恢复到先前状态(由快照表示)。

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

Kubernetes的目标是在分布式应用程序和基础群集之间创建一个抽象层,以便应用程序可以与它们所运行的群集的具体情况无关,并且应用程序部署不需要“特定于群集”的知识。

Kubernetes Storage SIG将快照操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能要在开始数据库操作之前为数据库的卷快照。

通过提供一种在Kubernetes中触发卷快照操作的标准方式,此功能允许Kubernetes用户以可移植的方式在任何Kubernetes环境中合并快照操作,而无需考虑基础存储。

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

自测试版以来有什么新变化?

随着将Volume Snapshot升级为GA,默认情况下在标准Kubernetes部署中启用了该功能,并且无法将其关闭。

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

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

  • 添加了快照验证Webhook,以对卷快照对象执行必要的验证。有关更多详细信息,请参见 卷快照验证Webhook Kubernetes增强建议.

  • 与验证Webhook一起,卷快照控制器将开始标记已经存在的无效快照对象。这使用户可以识别,删除任何无效对象并更正其工作流程。一旦将API切换为v1类型,这些无效对象将无法从系统中删除。

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

  • There are more end-to-end tests, running on GCP, that validate the feature in a real Kubernetes cluster. Stress tests (based on Google Persistent Disk 和 hostPath CSI Drivers) have been introduced to test the robustness of the system.

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

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

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

目前超过 50个CSI驱动程序 支持卷快照功能。的 GCE永久磁盘CSI驱动程序 从卷快照Beta升级到GA的测试已经完成。对其他CSI驱动程序的GA级别支持应尽快提供。

谁使用卷快照构建产品?

截至本博客发布之时, Kubernetes数据保护工作组 正在使用Kubernetes卷快照构建产品或已经构建产品。

如何部署卷快照?

卷快照功能包含以下组件:

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

警告: 快照验证Webhook是从v1beta1平稳过渡到v1 API的关键组件。如果不安装快照验证Webhook,则无法防止无效卷快照对象的创建/更新,这反过来又将阻止在即将进行的升级中删除无效卷快照对象。

如果您的群集未预装正确的组件,则可以手动安装它们。见 CSI快照者 有关详细信息的自述文件。

如何使用卷快照?

Assuming all the required components (including CSI driver) have been already deployed 和 running on your cluster, you can create volume snapshots using the VolumeSnapshot API object, or use an existing VolumeSnapshot to restore a PVC by specifying the VolumeSnapshot data source on it. For more details, see the 卷快照文档.

注意: Kubernetes Snapshot API不提供任何应用程序一致性保证。您必须手动或使用更高级别的API /控制器来获取数据一致性之前,必须准备好应用程序(暂停应用程序,冻结文件系统等)。

动态配置卷快照

To dynamically provision a volume snapshot, create a VolumeSnapshotClass API object first.

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

Then create a VolumeSnapshot API object from a PVC by specifying the volume snapshot class.

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

使用Kubernetes导入现有的卷快照

To import a pre-existing volume snapshot into Kubernetes, manually create a VolumeSnapshotContent object first.

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

Then create a VolumeSnapshot object pointing to the VolumeSnapshotContent object.

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

从快照补水

A bound 和 ready VolumeSnapshot object can be used to rehydrate a new volume with data pre-populated from snapshotted data as shown here:

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规格Kubernetes-CSI驱动程序开发人员指南 有关如何在CSI驱动程序中实现快照功能的更多详细信息。

有什么限制?

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

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

如何学习更多?

快照API和控制器的代码存储库位于: //github.com/kubernetes-csi/external-snapshotter

在此处查看有关快照功能的其他文档: http://k8s.io/docs/concepts/storage/volume-snapshots//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)。我们正在迅速发展,并随时欢迎新的贡献者。

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