Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版
|
Kubernetes 卷快照功能现在Kubernetes v1.17中处于beta版。它在Kubernetes v1.12中作为Alpha引入,在Kubernetes v1.13中是作为第二个Alpha版,并作了很大的改动。本文总结了beta版本中的变化。
什么是卷快照?
许多存储系统(如GoogleCloud持久磁盘、Amazon弹性块存储和许多本地存储系统)提供了创建持久卷的“快照”的能力。快照,即卷的时间点副本,可用于提供新卷(预填充快照数据)或将现有卷还原到先前状态(由快照数据还原)。
为什么要将卷快照添加到Kubernetes?
Kubernetes卷插件系统已经提供了强大的抽象功能,可以自动配置,附加和安装块和文件存储。
所有这些特性都是为了支持Kubernetes的工作负载可移植性目标:Kubernetes旨在在分布式系统应用程序和基础集群之间创建一个抽象层,以便应用程序可以与它们所运行的集群的具体情况隔离,并且应用程序部署不需要“特定于集群”的知识。
Kubernetes Storage SIG将快照操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能希望在数据库操作之前对数据库卷进行快照。
通过提供一种在KubernetesAPI中触发快照操作的标准方式,Kubernetes用户现在可以处理这样的用例,而不必使用Kubernetes API(并手动执行存储系统特定的操作)。
Kubernetes用户现在可以使用与群集无关的方式,将快照操作合并到他们的工具和策略中,并轻松知道它将在任意Kubernetes群集生效,而与基础存储无关。
此外,这些Kubernetes快照作为基本的构建块,可释放为Kubernetes开发高级企业级存储管理功能的能力:包括应用程序或集群级备份解决方案。
Beta版有什么新功能?
随着卷快照升级到beta版,该功能现在在标准Kubernetes部署上默认启用,而不是选择性启用。
将Kubernetes卷快照功能移至beta版还意味着: 改进卷快照API。 CSI外部快照sidecar分为两个控制器,一个通用快照控制器和一个CSI外部快照sidecar控制器。 删除密钥将作为注释添加到卷快照内容。 将新的终结器添加到卷快照 API对象,以防止在将其绑定到卷快照内容API对象时将其删除。
Kubernetes卷快照要求
如上所述,随着卷快照升级到beta版,该功能现在在标准Kubernetes部署上默认启用,而不是选择性加入。
要使用Kubernetes卷快照功能,必须确保在Kubernetes群集上部署了以下组件: Kubernetes 卷快照 CRDs 卷快照控制器 支持Kubernetes卷快照 beta的CSI驱动程序
哪些驱动程序支持Kubernetes卷快照?
Kubernetes支持三种类型的批量插件:in-tree、Flex和CSI。有关详细信息,请参阅KubernetesVolume Plugin FAQ。
仅CSI驱动程序支持快照(in-tree或Flex不支持)。要使用Kubernetes快照功能,请确保在集群上部署了实现快照的CSI驱动程序。
在发布此博客时,已更新以下CSI驱动程序以支持Beta版的卷快照: GCE永久磁盘CSI驱动程序 Portworx CSI驱动程序 NetApp Trident CSI驱动程序
其他CSI驱动程序的Beta级别卷快照支持正在挂起,应该很快就会提供。
Kubernetes 卷快照 Beta API
alpha 到 beta 这个阶段对Kubernetes卷快照 API 进行了许多更改。这些更改不向后兼容。更改的目的是使API定义清晰且易于使用。
进行了以下更改:
DeletionPolicy--是VolumeSnapshotClass和VolumeSnapshotContent中的必选字段。这样,用户就必须明确地指定它,不会留下混淆的空间。
VolumeSnapshotSpec-有一个新的必填Source字段。源可以是PersistentVolumeClaimName(如果动态设置快照)或VolumeSnapshotContentName(如果预设置快照)。
VolumeSnapshotContentSpec-还有一个新的必填Source字段。此源可以是VolumeHandle(如果动态设置快照)或SnapshotHandle(如果预设置卷快照)。
VolumeSnapshotStatus-现在包含BoundVolumeSnapshotContentName,以指示VolumeSnapshot对象已绑定到VolumeSnapshotContent。
VolumeSnapshotContentnow-包含一个Status,用于指示内容的当前状态。它有一个字段SnapshotHandle,指示VolumeSnapshotContent表示存储系统上的快照。
Beta版 Kubernetes VolumeSnapshot API对象:
type VolumeSnapshot struct {
Spec VolumeSnapshotSpec Beta版 KubernetesVolumeSnapshot 内容API对象:
type VolumeSnapshotContent struct {
Spec VolumeSnapshotContentSpec
type VolumeSnapshotClass struct {
Driver string
请注意,除了卷快照CRD之外,卷快照功能现在还依赖于新的通用卷快照控制器。卷快照控制器和CRD都独立于任何CSI驱动程序。无论集群上部署了多少CSI驱动程序,每个集群都只能运行一个卷快照控制器实例和一组卷快照 crd。
因此,强烈建议Kubernetes发行商捆绑和部署控制器和CRD,作为其Kubernetes集群管理过程的一部分(独立于任何CSI驱动程序)。
如果集群没有预装正确的组件,可以通过执行以下步骤手动安装这些组件。
安装Beta版 Snapshot CRDs kubectlcreate -f config/crd https://github.com/kubernetes-csi/external-snapshotter/tree/master/config/crd 每个集群执行一次
安装通用Snapshot控制器 kubectlcreate -f deploy/kubernetes/snapshot-controller 每个集群执行一次
安装CSI驱动程序 遵循CSI驱动程序供应商提供的说明。
如何使用Kubernetes卷快照?
假设所有必需的组件(包括CSI驱动程序)都已部署并在集群上运行,则可以使用卷快照 API对象创建卷快照,并通过在PVC上指定卷快照数据源来还原它们。
使用Kubernetes创建新的卷快照
通过创建指向支持卷快照的CSI驱动程序的卷快照Class API对象,可以在Kubernetes集群中启用卷快照的创建/删除。
例如,下面的卷快照Class告诉Kubernetes集群,CSI驱动程序testdriver.csi.k8s.io可以处理卷快照,创建这些Snapshot时,策略应该是删除。
apiVersion:snapshot.storage.k8s.io/v1beta1
卷快照的创建由卷快照 API对象的创建触发。
卷快照对象必须指定以下源类型:persistent Volume Claim Name-快照的PVC名称。请注意,卷快照对象的源PVC、PV和Volume SnapshotClass必须指向同一CSI驱动程序。
例如,下面的卷快照使用上面的Volume Snapshot Class触发了一个名为test -PVC的PVC快照创建。
apiVersion:snapshot.storage.k8s.io/v1beta1
然后,CSI外部快照sidecar工具通过CSI Create Snapshot调用将VolumeSnapshotClass参数、源卷ID和任何引用的密钥传递给CSI驱动程序(在本例中为testdriver.CSI.k8s.io)。作为响应,CSI驱动程序为指定卷创建一个新快照,并返回该快照的ID。之后,CSI外部快照管理器sidecar会更新代表新快照的Volume Snapshot Content对象的状态字段中的snapshotHandle、creationTime、restoreSize和readyToUse。对于在快照被剪切后需要上载快照的存储系统,CSI外部快照管理器sidecar将继续调用CSI Create Snapshot以检查状态,直到上载完成且readyToUse为真。
如果未指定VolumeSnapshotClassName,则会自动选择一个,如下所示:从源卷的PVC或PV获取StorageClass。如果可用,将获取默认的VolumeSnapshotClass。默认的VolumeSnapshotClass是管理员使用snapshot.storage.kubernetes.io/is-default-class注释创建的快照类。如果默认卷快照类的驱动程序字段与StorageClass中的Provisioner字段相同,则使用默认Volume Snapshot Class。如果快照没有默认的一个或多个VolumeSnapshotClass,则将返回错误。
请注意,Kubernetes快照API不提供任何一致性保证。您必须先准备好应用程序(暂停应用程序、冻结文件系统等),然后再手动或使用其他一些更高级别的API/控制器获取快照以保持数据一致性。
你可以通过运行kubectldescribe volumenapshot来验证是否已创建VolumeSnapshot对象,并与VolumeSnapshotContent绑定。
Bound VolumeSnapshot Content Name -状态中的字段指示该卷已绑定到指定的卷快照内容。 Ready To Use -状态中的字段指示此卷快照已准备好使用。Creation Time -状态中的字段指示实际创建(剪切)快照的时间。Restore Size -状态中的字段指示从该快照还原卷时所需的最小卷大小。
Name: test-snapshot
kubectl describe volumesnapshotcontent 用Kubernetes导入现有卷快照
你可以通过手动创建一个卷快照内容对象来表示现有的卷快照,从而在Kubernetes中暴露一个预先存在的卷快照。因为卷快照内容是一个非命名空间API对象,所以只有集群管理员才有权创建它。通过指定volumeSnapshotRef,集群管理员可以确切指定哪些用户可以使用快照。
例如,以下卷快照内容公开了一个名为7bdd0de3-aaeb-11e8-9aae-0242ac110002的卷快照,该卷快照属于名为testdriver.CSI.k8s.io的CSI驱动程序。
集群管理员应该使用以下字段创建卷快照内容对象,表示现有快照:
driver-用于处理该卷的CSI驱动程序。此字段为必填。 source-快照标识信息 snapshotHandle—快照名称/标识符。此字段为必填。 volumeSnapshotRef-指向此内容应绑定到的卷快照对象的指针。 name and namespace-指定内容绑定到的卷快照对象的名称和命名空间。 deletionPolicy-有效值为“删除”和“保留”。如果删除策略为“删除”,则基础存储快照将与卷快照内容对象一起删除。如果删除策略为“保留”,则基础快照和卷快照内容都将保留。
apiVersion:snapshot.storage.k8s.io/v1beta1
apiVersion:snapshot.storage.k8s.io/v1beta1
从快照创建卷
一旦有了绑定的就绪卷快照对象,就可以使用该对象设置一个新卷,新卷预先填充了快照中的数据。
要设置预填充快照数据的新卷,请使用PVC中的dataSource字段。它有三个参数:name-表示要用作源类型的快照的卷快照对象的名称-必须是卷快照 apiGroup-必须是snapshot.storage.k8s.io。
假定源卷快照对象的命名空间与PVC对象的命名空间相同。
apiVersion:v1
尽管Kubernetes对CSI卷驱动程序的打包和部署的规定尽可能少,但它为在Kubernetes上部署任意容器化CSI驱动程序提供了一种建议的机制,以简化与容器化CSI兼容的卷驱动程序的部署。
作为推荐部署过程的一部分,Kubernetes团队提供了许多sidecar(辅助)容器,包括外部快照sidecar容器。
外部快照程序监视KubernetesAPI服务器上的卷快照内容对象,并针对CSI终结点触发CreateSnapshot和DeleteSnapshot操作。CSI外部供应程序sidecar容器也已更新,以支持使用新的数据源 PVC字段从快照恢复卷。
为了支持快照特性,建议存储供应商除了部署外部供应程序外,还将外部快照sidecar容器及其CSI驱动程序部署到一个状态集中,如下图所示。
Beta版有什么限制?
Kubernetes卷快照的beta版实现有以下限制: 不支持将现有卷还原为快照所表示的较早状态(Beta只支持从快照提供新卷)。 快照一致性保证不能超出存储系统提供的任何保证(例如崩溃一致性)。这些是高级API /控制器的职责。
接下来做什么?
根据反馈和采用情况,Kubernetes团队计划在1.18或1.19版本中将CSI快照实现推送到GA。我们希望支持的某些特性包括一致性组、应用程序一致性快照、工作负载静止、就地恢复、卷备份等。
参考文档: https://kubernetes.io/blog/page/2/ 作者:XingYang (VMware)、Xiangqian Yu (Google)
|



有话要说