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

为 Kubernetes 引入卷克隆 Alpha

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

什么是克隆?

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

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

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

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

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

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

Kubernetes 用户现在能够以与集群无关的方式将克隆操作集成到他们的工具和策略中,并且可以放心地知道,无论底层存储如何,它都将适用于任意 Kubernetes 集群。

Kubernetes API 和克隆

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

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

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

Kubernetes 支持三种类型的存储卷插件:in-tree、Flex 和 容器存储接口 (CSI)。有关详细信息,请参阅 Kubernetes 存储卷插件常见问题解答

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

Kubernetes 克隆要求

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

  • 确保在您的 Kubernetes 集群上部署并运行了实现克隆的 CSI 驱动程序。
  • 通过新的 Kubernetes 功能门启用 Kubernetes 存储卷克隆功能(Alpha 版本默认禁用)
    • 在 API 服务器二进制文件上设置以下标志:--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 插件的唯一职责。

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

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

Alpha 版本的局限性是什么?

Kubernetes 克隆的 Alpha 实现具有以下局限性:

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

未来展望

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

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

我如何了解更多信息?

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

我如何参与?

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

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

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