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

为 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 的名称。重要的是要注意,从用户的角度来看,克隆只是另一个 PersistentVolume 和 PersistentVolumeClaim,唯一的区别在于 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)。我们正在快速发展,并始终欢迎新的贡献者。