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

介绍 Kubernetes 的存储卷克隆 Alpha 功能

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

什么是克隆?

许多存储系统提供了创建存储卷“克隆”的功能。克隆是现有存储卷的副本,它在系统上拥有自己独立的存储卷实体,但源存储卷上的数据会被复制到目标(克隆)存储卷。克隆与快照类似,都是存储卷的时间点副本,但不同之处在于,克隆是创建一个新的独立存储卷,而不是从现有存储卷创建一个新的快照对象,有时可以理解为预填充新创建的存储卷。

为什么要在 Kubernetes 中添加克隆功能

Kubernetes 存储卷插件系统已经提供了强大的抽象,可以自动化块存储和文件存储的供应、绑定和挂载。

所有这些功能的基石是 Kubernetes 关于工作负载可移植性的目标:Kubernetes 旨在在分布式系统应用和底层集群之间创建一个抽象层,以便应用无需感知其运行集群的具体细节,并且应用部署无需了解特定的存储设备。

Kubernetes 存储特别兴趣小组 (SIG Storage) 认为克隆操作对于许多有状态工作负载至关重要。例如,数据库管理员可能希望复制一个数据库存储卷并创建现有数据库的另一个实例。

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

Kubernetes 用户现在可以在其工具和策略中以集群无关的方式整合克隆操作,并且知道无论底层存储如何,它都将适用于任何 Kubernetes 集群。

Kubernetes API 与克隆

Kubernetes 中的克隆功能通过 PersistentVolumeClaim.DataSource 字段启用。在 v1.15 之前,允许用作 dataSource 的唯一有效对象类型是 VolumeSnapshot。克隆功能扩展了允许的 PersistentVolumeclaim.DataSource.Kind 字段,使其不仅允许 VolumeSnapshot,还允许 PersistentVolumeClaim。现有行为不变。

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

哪些存储卷插件支持 Kubernetes 克隆?

Kubernetes 支持三种类型的存储卷插件:in-tree、Flex 和 容器存储接口 (CSI)。详情请参见Kubernetes 存储卷插件 FAQ

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

Kubernetes 克隆要求

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

  • 确保在您的 Kubernetes 集群上部署并运行了实现克隆功能的 CSI 驱动程序。
  • 通过新的 Kubernetes 功能门启用 Kubernetes 存储卷克隆功能(Alpha 阶段默认禁用)
    • 在 API server 二进制文件上设置以下标志:--feature-gates=VolumePVCDataSource=true
  • 源和目标声明必须在同一命名空间中。

使用 Kubernetes 创建克隆

要供应一个用现有 Kubernetes 存储卷中的数据预填充的新存储卷,请使用 PersistentVolumeClaim 中的 dataSource 字段。有三个参数:

  • name - 用作源的 PersistentVolumeClaim 对象的名称
  • kind - 必须是 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

PersistentVolumeClaim 对象被创建时,它将触发新存储卷的供应,该存储卷将用指定的 dataSource 存储卷中的数据预填充。存储卷的克隆实现是 CSI Plugin 的唯一责任。

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

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

Alpha 阶段有哪些限制?

Kubernetes 克隆功能的 Alpha 实现有以下限制:

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

未来展望

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

用户关于克隆的一个常见问题是“跨命名空间克隆怎么办”。正如我们所提到的,当前版本要求源和目标在同一命名空间中。然而,目前正在努力提出一个命名空间转移 API,未来版本的 Kubernetes 可能会提供将存储卷资源从一个命名空间转移到另一个命名空间的能力。此功能仍在讨论和设计中,不确定是否会在未来的版本中提供。

如何了解更多?

您可以在存储概念文档以及CSI 文档中找到有关克隆功能的更多文档。

如何参与贡献?

这个项目,像所有 Kubernetes 项目一样,是来自不同背景的众多贡献者共同努力的结果。

我们非常感谢 Kubernetes Storage SIG 和 CSI 社区中所有帮助评审项目设计和实现的贡献者,包括但不限于以下人员:

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