作者:John Griffith(红帽)
Kubernetes v1.15引入了对卷克隆的alpha支持。该特性允许使用Kubernetes API使用用户命名空间中现有卷的内容创建新卷。
什么是克隆?
许多存储系统提供创建卷的“克隆”功能。克隆是一个现有卷的副本,它是系统上自己惟一的卷,但是源上的数据被复制到目标(克隆)。克隆类似于快照,因为它是卷的一个时间点副本,但是我们不是从卷创建一个新的快照对象,而是创建一个新的独立卷,有时被认为是预填充新创建的卷。
为什么要把克隆技术加到Kubernetes
Kubernetes卷插件系统已经提供了一个强大的抽象,可以自动提供、附加和挂载块和文件存储。
所有这些特性的目标是支持Kubernetes工作负载的可移植性:Kubernetes的目标是在分布式系统应用程序和底层集群之间创建一个抽象层,这样应用程序就可以不知道它们所运行的集群的具体情况,并且应用程序部署不需要特定的存储设备知识。
Kubernetes存储SIG将克隆操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能希望复制数据库卷,并创建现有数据库的另一个实例。
https://github.com/kubernetes/community/tree/master/sig-storage
通过在Kubernetes API中提供触发克隆操作的标准方法,Kubernetes用户现在可以处理这样的用例,而无需环绕Kubernetes API(以及手动执行存储系统特定的操作)。虽然克隆在行为上类似于创建卷快照,然后从快照创建卷,但是克隆操作更精简,对于许多后端设备更有效。
Kubernetes用户现在可以以一种集群无关的方式,将克隆操作合并到他们的工具和政策中,并且可以放心地知道,无论底层存储是什么,克隆操作都可以针对任意的Kubernetes集群工作。
Kubernetes API和克隆
Kubernetes中的克隆特性是通过PersistentVolumeClaim.DataSource字段启用的。在v1.15之前,惟一允许作为数据源(dataSource)使用的有效对象类型是VolumeSnapshot。克隆特性扩展了允许的PersistentVolumeclaim.DataSource.Kind字段不仅允许VolumeSnapshot,还允许PersistentVolumeClaim。现有行为不会更改。
没有引入新的对象来启用克隆。而是对PersistentVolumeClaim对象中的现有数据源字段进行了扩展,以便能够接受同一命名空间中现有的PersistentVolumeClaim的名称。重要的是要注意,从用户的角度来看,克隆只是另一个PersistentVolume和PersistentVolumeClaim,惟一的区别是这个PersistentVolume是在创建时用另一个PersistentVolume的内容填充的。创建之后,它的行为与任何其他Kubernetes PersistentVolume完全相同,并遵循相同的行为和规则。
哪些卷插件支持Kubernetes克隆?
Kubernetes支持三种类型的卷插件:in-tree、Flex和容器存储接口(Container Storage Interface ,CSI)。有关详细信息,请参阅Kubernetes Volume Plugin FAQ。
https://github.com/container-storage-interface/spec/blob/master/spec.md
https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md
克隆只支持CSI驱动程序(不支持in-tree或Flex)。要使用Kubernetes克隆特性,请确保在集群上部署了实现克隆的CSI驱动程序。有关当前支持克隆的CSI驱动程序列表,请参阅CSI驱动程序文档。
https://kubernetes-csi.github.io/docs/drivers.html
Kubernetes克隆需求
在使用Kubernetes卷克隆之前,你必须:
在Kubernetes创建一个克隆
要使用现有Kubernetes卷中的数据预先填充新的卷,请使用PersistentVolumeClaim中的dataSource字段。有三个参数:
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对象时,它将触发一个新的卷的供应,该卷预先填充了来自指定数据源卷的数据。实现卷的克隆是CSI插件的责任。
作为存储供应商,我如何将对克隆的支持添加到我的CSI驱动程序中?
有关如何在CSI插件中实现克隆的更多信息,请参考CSI文档中给Kubernetes开发CSI驱动程序的部分。
https://kubernetes-csi.github.io/docs/developing.html
alpha的局限性是什么?
克隆Kubernetes的alpha实现有以下限制:
未来
根据反馈和采用情况,Kubernetes团队计划将CSI克隆实现在1.16版本推进到beta。
关于克隆,用户经常遇到的一个问题是“跨命名空间克隆怎么样?”。如前所述,当前版本要求源和目标位于同一个命名空间中。不过,目前正在努力提出命名空间传输API,Kubernetes的未来版本可能提供将卷资源从一个命名空间传输到另一个命名空间的能力。这个特性还在讨论和设计中,可能在将来的版本中可用,也可能不可用。
我怎样才能学到更多?
你可以在存储概念文档和CSI文档中找到关于克隆特性的附加文档。
https://k8s.io/docs/concepts/storage/volume-pvc-datasource.md
https://kubernetes-csi.github.io/docs/volume-cloning.html
我如何参与其中?
和所有Kubernetes一样,这个项目也是来自不同背景的贡献者共同努力的结果。
我们非常感谢Kubernetes存储SIG和CSI社区的所有贡献者,他们帮助审查了项目的设计和实施,包括但不限于以下内容:
Saad Ali(saadali)
Tim Hockin(thockin)
Jan Šafránek(jsafrane)
Michelle Au(msau42)
Xing Yang(xing-yang)
如果你有兴趣参与CSI或Kubernetes存储系统的任何部分的设计和开发,请加入Kubernetes存储特殊兴趣小组(SIG)。我们正在快速成长,并且一直欢迎新的贡献者。
https://github.com/kubernetes/community/tree/master/sig-storage