k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

背景

  

许多存储系统提供了创建存储卷“快照”(快照)的能力,以防止数据丢失。快照可以替代传统的备份系统来备份和还原主要数据和关键数据。快照能够快速备份数据(例如,创建GCE PD快照仅需要几分之一秒),并提供快速恢复时间目标(RTO)和恢复点目标(RPO)。快照还可用于数据复制,分发和迁移。

  

早在kubernetes 1.8版本中,卷快照系统原型已经发布,其实现位于外部存储器(https://github.com/kubernetes-incubator/external-storage)库中。该原型基于CRD实现,提供了外部来自供应者控制器和两个二进制,支持GCE PD, AWS EBS, OpenStack煤渣,从而和kubernetes hostPath等存储卷。

  

Kubernetes的社区存储趋势是采用CSI实现存储插件,本文添加对CSI存储插件的快照支持.Kubernetes的趋势是保持核心API尽可能小,因此我们采用CRD实现,并添加一个外部快照控制器来处理卷快照,外部供应者也会升级以支持从快照创建体积,CSI快照规范详情可以在https://github.com/container-storage-interface/spec/pull/224查看。

  

目标

  

对于Kubernetes中的第一个快照支持版本,我们仅支持CSI卷插件按需创建快照。

  

目标1:实现标准化的快照操作,支持创建,列出和删除快照等REST API。目前,API将使用CRD (CustomResourceDefinitions)实现。

  

目标2:实现CSI卷快照支持.external-snapshotter将与CSI卷插件的其他外部组件(例如,external-attacher, external-provisioner)一起部署。

  

目标3:提供一种从快照创建新存储卷和还原现有卷的便捷方法。

  

以下目标本阶段将不会实现,但将在稍后阶段考虑。

  

目标4:通过提供前/后快照钩子来冻结/解冻应用程序和/或卸载/挂载文件系统,从而提供应用程序一致性快照。

  

目标5:提供更高级别的管理,例如备份和还原pod和statefulSet,以及创建一致性的快照组。

  

<强>详细设计

  

在此提案中,卷快照被视为Kubernetes管理的另一种存储资源,因此,快照API和控制器遵循现有卷管理的设计模式。

  

VolumeSnapshot   

VolumeSnapshotContent   

VolumeSnapshotClass   

三个API,它们与PersistentVolumeClaim和PersistentVolume以及storageClass的结构类似。外部快照控制器的功能类似于在树的PV控制器,同时建议在PersistentVolumeClaim (PVC) API中添加新的数据源结构,以支持从快照还原数据卷。以下部分将详细介绍API和控制器设计。

  

<强>快照API设计

  

VolumeSnapshot和VolumeSnapshotContent API是在PersistentVolumeClaim和PersistentVolume之后建模设计的。在第一个版本中,VolumeSnapshot生命周期完全独立于其来源(PVC)。删除PVC/PV时,相应的VolumeSnapshot和VolumeSnapshotContent对象将继续存在。但是,对于某些卷插件,快照依赖于其存储卷。在未来的版本中,我们计划进行完整的生命周期管理,以便更好地处理快照与其卷之间的关系。(例如,添加终结器,当有快照依赖于存储卷时,可防止存储卷被删除)。

  

<强> VolumeSnapshot对象

  

 k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

 k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

VolumeSnapshotContent对象   

 k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

 k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

<强> VolumeSnapshotClass对象

  

我们将添加新API的对象VolumeSnapshotClass,而不是复用现有的StorageClass,以避免在快照和卷之间混合参数。每个CSI卷插件都可以拥有自己的默认VolumeSnapshotClass。如果未提供VolumeSnapshotClass,则将使用默认值.VolumeSnapshotClass将为快照添加新的参数。

  

 k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)

  

<强>快照控制器设计要点

  

如下图所示,CSI快照控制器体系结构由external-snapshotter(外部快照器)组成,external-snapshotter通过套接字与树上的CSI卷插件进行通信(默认情况下为/运行/CSI/插座,可由-csi-address配置).external-snapshotter是Kubernetes实现容器存储接口(CSI)的一部分。它是一个外部控制器,用于监视VolumeSnapshot和VolumeSnapshotContent对象并创建/删除快照。

k8 1.12大特性最快最深度解析:Kubernetes CSI快照(上)