为Kubernetes引入批量克隆Alpha

作者:约翰·格里菲斯(Red Hat)

Kubernetes v1.15引入了对卷克隆的Alpha支持。此功能允许您使用Kubernetes API使用用户名称空间中现有卷的内容来创建新卷。

什么是克隆?

许多存储系统都提供了创建卷的“克隆”功能。克隆是现有卷的副本,它是系统上自己的唯一卷,但是源上的数据被复制到目标(克隆)。克隆类似于快照,因为它是卷的时间点副本,但是我们不是从卷中创建新的快照对象,而是创建一个新的独立卷,有时被认为是预先填充了新的卷。创建的体积。

为什么要向Kubernetes添加克隆

Kubernetes卷插件系统已经提供了强大的抽象功能,可以自动配置,附加和安装块和文件存储。

所有这些功能的基础是Kubernetes的工作负载可移植性目标:Kubernetes旨在在分布式系统应用程序和基础群集之间创建一个抽象层,以便应用程序可以与它们所运行的群集的具体情况无关,并且应用程序部署不需要特定的存储设备知识。

Kubernetes存储SIG 将克隆操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能要复制数据库卷并创建现有数据库的另一个实例。

通过提供一种在Kubernetes API中触发克隆操作的标准方式,Kubernetes用户现在可以处理这样的用例,而不必使用Kubernetes API(并手动执行存储系统特定的操作)。尽管克隆的行为类似于创建卷的快照,然后从快照创建卷,但是克隆操作更加简化,并且对于许多后端设备而言效率更高。

现在,Kubernetes用户可以轻松地将克隆操作以集群不可知的方式合并到他们的工具和策略中,并知道无论基础存储如何,克隆操作都可以对任意Kubernetes集群起作用。

Kubernetes API和克隆

的 cloning feature in Kubernetes is enabled via the PersistentVolumeClaim.DataSource field. Prior to v1.15 the only valid object type permitted for use as a dataSource was a VolumeSnapshot. 的 cloning feature extends the allowed PersistentVolumeclaim.DataSource.Kind field to not only allow VolumeSnapshot but also PersistentVolumeClaim. 的 existing behavior is not changed.

没有引入任何新对象来启用克隆。而是,将PersistentVolumeClaim对象中的现有dataSource字段扩展为能够接受同一名称空间中现有PersistentVolumeClaim的名称。重要的是要注意,从用户的角度来看,克隆只是另一个PersistentVolume和PersistentVolumeClaim,唯一的区别是,在创建时,PersistentVolume正在填充另一个PersistentVolume的内容。创建后,它的行为与任何其他Kubernetes PersistentVolume完全一样,并遵循相同的行为和规则。

哪些批量插件支持Kubernetes克隆?

Kubernetes支持三种类型的批量插件:in-tree,Flex和 集装箱存放接口 (CSI)。看到 Kubernetes批量插件常见问题解答 有关详细信息。

仅CSI驱动程序支持克隆(树内或Flex不支持)。要使用Kubernetes克隆功能,请确保在群集上部署了实现克隆的CSI驱动程序。 有关当前支持克隆的CSI驱动程序列表,请参见 CSI驱动程序文档.

Kubernetes克隆要求

在使用Kubernetes卷克隆之前,您必须:

  • 确保在Kubernetes集群上部署并运行了实现克隆的CSI驱动程序。
  • 通过新的Kubernetes功能门启用Kubernetes卷克隆功能(默认情况下,对于alpha禁用):
    • 在API服务器二进制文件上设置以下标志: --feature-gates=VolumePVCDataSource=true
  • 源声明和目标声明必须在相同的名称空间中。

用Kubernetes创建一个克隆

To provision a new volume pre-populated with data from an existing Kubernetes Volume, use the dataSource field in the PersistentVolumeClaim. 的 re are three parameters:

  • name - name of the PersistentVolumeClaim object to use as source
  • 善良-必须 PersistentVolumeClaim
  • apiGroup-必须是 ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-clone
  Namespace: demo-namespace
spec:
  storageClassName: csi-storageclass
  dataSource:
    name: src-pvc
    kind: PersistentVolumeClaim 
    apiGroup: ""
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi # NOTE this capacity must be specified and must be >= the capacity of the source volume

When the PersistentVolumeClaim object is created, it will trigger provisioning of a new volume that is pre-populated with data from the specified dataSource volume. It is the sole responsbility of the CSI Plugin to implement the cloning of volumes.

作为存储供应商,如何为CSI驱动程序添加对克隆的支持?

有关如何在CSI插件中实施克隆的更多信息,请参考 为Kubernetes开发CSI驱动程序 CSI文档部分。

alpha的局限性是什么?

Kubernetes的alpha克隆实现具有以下限制:

  • 不支持跨不同名称空间的克隆卷
  • 不支持跨不同存储类(后端)克隆卷

未来

根据反馈和采用情况,Kubernetes团队计划将CSI克隆实现在1.16中推进到beta。

用户关于克隆的一个常见问题是“关于交叉命名空间的克隆”。如前所述,当前版本要求源和目标位于同一名称空间中。但是,正在努力提出一种命名空间传输API,Kubernetes的未来版本可能提供将卷资源从一个命名空间传输到另一个命名空间的能力。此功能仍在讨论和设计中,将来的版本中可能会或可能不会提供。

我该如何学习?

您可以在以下网页中找到有关克隆功能的其他文档: 存储概念文档 还有 CSI文档.

我该如何参与?

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

我们非常感谢Kubernetes存储SIG和CSI社区中的所有贡献者,他们帮助审查了项目的设计和实施,包括但不限于以下内容:

如果您有兴趣参与CSI或Kubernetes Storage System的任何部分的设计和开发,请加入 Kubernetes存储特别兴趣小组 (SIG)。我们正在迅速发展,并随时欢迎新的贡献者。