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版还意味着:
Kubernetes卷快照要求
如上所述,随着卷快照升级到beta版,该功能现在在标准Kubernetes部署上默认启用,而不是选择性加入。
要使用Kubernetes卷快照功能,必须确保在Kubernetes群集上部署了以下组件:
哪些驱动程序支持Kubernetes卷快照?
Kubernetes支持三种类型的批量插件:in-tree、Flex和CSI。有关详细信息,请参阅KubernetesVolume Plugin FAQ。
仅CSI驱动程序支持快照(in-tree或Flex不支持)。要使用Kubernetes快照功能,请确保在集群上部署了实现快照的CSI驱动程序。
在发布此博客时,已更新以下CSI驱动程序以支持Beta版的卷快照:
其他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 {
metav1.TypeMeta
metav1.ObjectMeta
Spec VolumeSnapshotSpec
Status *VolumeSnapshotStatus
}
type VolumeSnapshotSpec struct {
Source VolumeSnapshotSource
VolumeSnapshotClassName *string
}
// Exactly one of its members MUST be specified
type VolumeSnapshotSource struct {
// +optional
PersistentVolumeClaimName *string
// +optional
VolumeSnapshotContentName *string
}
type VolumeSnapshotStatus struct {
BoundVolumeSnapshotContentName *string
CreationTime *metav1.Time
ReadyToUse *bool
RestoreSize *resource.Quantity
Error *VolumeSnapshotError
}
Beta版 KubernetesVolumeSnapshot 内容API对象:
type VolumeSnapshotContent struct {
metav1.TypeMeta
metav1.ObjectMeta
Spec VolumeSnapshotContentSpec
Status *VolumeSnapshotContentStatus
}
type VolumeSnapshotContentSpec struct {
VolumeSnapshotRef core_v1.ObjectReference
Source VolumeSnapshotContentSource
DeletionPolicy DeletionPolicy
Driver string
VolumeSnapshotClassName *string
}
type VolumeSnapshotContentSource struct {
// +optional
VolumeHandle *string
// +optional
SnapshotHandle *string
}
type VolumeSnapshotContentStatus struct {
CreationTime *int64
ReadyToUse *bool
RestoreSize *int64
Error *VolumeSnapshotError
SnapshotHandle *string
}
Beta版KubernetesVolumeSnapshot Class API对象:
type VolumeSnapshotClass struct {
metav1.TypeMeta
metav1.ObjectMeta
Driver string
Parameters map[string]string
DeletionPolicy DeletionPolicy
}
如何在Kubernetes集群上部署对卷快照的支持?
请注意,除了卷快照CRD之外,卷快照功能现在还依赖于新的通用卷快照控制器。卷快照控制器和CRD都独立于任何CSI驱动程序。无论集群上部署了多少CSI驱动程序,每个集群都只能运行一个卷快照控制器实例和一组卷快照 crd。
因此,强烈建议Kubernetes发行商捆绑和部署控制器和CRD,作为其Kubernetes集群管理过程的一部分(独立于任何CSI驱动程序)。
如果集群没有预装正确的组件,可以通过执行以下步骤手动安装这些组件。
安装Beta版 Snapshot CRDs
安装通用Snapshot控制器
安装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
kind:VolumeSnapshotClass
metadata:
name:test-snapclass
driver:testdriver.csi.k8s.io
deletionPolicy:Delete
parameters:
csi.storage.k8s.io/snapshotter-secret-name:mysecret
csi.storage.k8s.io/snapshotter-secret-namespace:mysecretnamespace
通用Snapshot控制器保留参数键csi.storage.k8s.io/snapshotter-secret-name和csi.storage.k8s.io/snapshotter-secret-namespace。如果指定,它将获取引用的Kubernetes密钥,并将其设置为卷快照内容对象上的注释。CSI外部snapshotter sidecar从内容注释中检索它,并将其在snapshot创建过程中传递给CSI驱动程序。
卷快照的创建由卷快照 API对象的创建触发。
卷快照对象必须指定以下源类型:persistent Volume Claim Name-快照的PVC名称。请注意,卷快照对象的源PVC、PV和Volume SnapshotClass必须指向同一CSI驱动程序。
例如,下面的卷快照使用上面的Volume Snapshot Class触发了一个名为test -PVC的PVC快照创建。
apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshot
metadata:
name:test-snapshot
spec:
volumeSnapshotClassName:test-snapclass
source:
persistentVolumeClaimName:test-pvc
调用卷快照创建时,通用快照控制器首先创建一个VolumeSnapshotContent对象,其中包含volumeSnapshotRef、source volumeHandle、volumeSnapshotClassName(如果指定)、驱动程序和删除策略。
然后,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
Namespace: default
Labels: <none>
Annotations: <none>
API Version: snapshot.storage.k8s.io/v1beta1
Kind: VolumeSnapshot
Metadata:
Creation Timestamp: 2019-11-16T00:36:04Z
Finalizers:
snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
Generation: 1
Resource Version: 1294
Self Link: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/new-snapshot-demo
UID: 32ceaa2a-3802-4edd-a808-58c4f1bd7869
Spec:
Source:
Persistent Volume Claim Name: test-pvc
Volume Snapshot Class Name: test-snapclass
Status:
Bound Volume Snapshot Content Name: snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
Creation Time: 2019-11-16T00:36:04Z
Ready To Use: true
Restore Size: 1Gi
提醒所有使用卷快照API构建控制器的开发人员:在使用VolumeSnapshot API对象之前,请验证卷快照与其绑定的卷快照内容之间的双向绑定,以确保绑定完整且正确(不这样做可能会导致安全问题)。
kubectl describe volumesnapshotcontent
Name: snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
Namespace:
Labels: <none>
Annotations: <none>
API Version: snapshot.storage.k8s.io/v1beta1
Kind: VolumeSnapshotContent
Metadata:
Creation Timestamp: 2019-11-16T00:36:04Z
Finalizers:
snapshot.storage.kubernetes.io/volumesnapshotcontent-bound-protection
Generation: 1
Resource Version: 1292
Self Link: /apis/snapshot.storage.k8s.io/v1beta1/volumesnapshotcontents/snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
UID: 7dfdf22e-0b0c-4b71-9ddf-2f1612ca2aed
Spec:
Deletion Policy: Delete
Driver: testdriver.csi.k8s.io
Source:
Volume Handle: d1b34a5f-0808-11ea-808a-0242ac110003
Volume Snapshot Class Name: test-snapclass
Volume Snapshot Ref:
API Version: snapshot.storage.k8s.io/v1beta1
Kind: VolumeSnapshot
Name: test-snapshot
Namespace: default
Resource Version: 1286
UID: 32ceaa2a-3802-4edd-a808-58c4f1bd7869
Status:
Creation Time: 1573864564608810101
Ready To Use: true
Restore Size: 1073741824
Snapshot Handle: 127c5798-0809-11ea-808a-0242ac110003
Events: <none>
用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
kind:VolumeSnapshotContent
metadata:
name:manually-created-snapshot-content
spec:
deletionPolicy:Delete
driver:testdriver.csi.k8s.io
source:
snapshotHandle:7bdd0de3-aaeb-11e8-9aae-0242ac110002
volumeSnapshotRef:
name:test-snapshot
namespace:default
创建卷快照内容对象后,用户可以创建指向卷快照内容对象的卷快照对象。卷快照对象的名称和命名空间必须与卷快照内容的volumeSnapshotRef中指定的名称/命名空间匹配。它指定以下字段:volumeSnapshotContentName-上面指定的卷快照内容的名称。此字段必填。volumeSnapshotClassName—卷快照类的名称。此字段是可选的。
apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshot
metadata:
name:manually-created-snapshot
spec:
source:
volumeSnapshotContentName:test-content
一旦创建了这两个对象,通用快照控制器将验证卷快照和卷快照内容对象之间的绑定是否正确,并将卷快照标记为就绪(如果CSI驱动程序支持卷快照调用,控制器也将验证所引用的快照是否存在)。如果调用了CSI中的 list snapshot方法,CSI外部快照sidecar将检查快照是否存在,否则假定快照已存在。在卷快照内容的状态字段中,外部快照sidecar将readyToUse设置为true。通用快照控制器会相应地将快照标记为就绪。
从快照创建卷
一旦有了绑定的就绪卷快照对象,就可以使用该对象设置一个新卷,新卷预先填充了快照中的数据。
要设置预填充快照数据的新卷,请使用PVC中的dataSource字段。它有三个参数:name-表示要用作源类型的快照的卷快照对象的名称-必须是卷快照 apiGroup-必须是snapshot.storage.k8s.io。
假定源卷快照对象的命名空间与PVC对象的命名空间相同。
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:pvc-restore
namespace:demo-namespace
spec:
storageClassName:testdriver.csi.k8s.io
dataSource:
name:manually-created-snapshot
kind:VolumeSnapshot
apiGroup:snapshot.storage.k8s.io
accessModes:
-ReadWriteOnce
resources:
requests:
storage:1Gi
当创建持久卷声明对象时,它将触发一个新卷的设置,该卷预先填充了来自指定快照的数据。作为存储供应商,如何将快照支持添加到CSI驱动程序中?要实现快照功能,CSI驱动程序必须添加对其他控制器功能的支持CREATE_DELETE_snapshot和LIST_snapshot,并实现其他控制器RPC: CreateSnapshot、DeleteSnapshot和ListSnapshots。有关详细信息,请参阅CSI规范和Kubernetes CSI驱动程序开发指南。
尽管Kubernetes对CSI卷驱动程序的打包和部署的规定尽可能少,但它为在Kubernetes上部署任意容器化CSI驱动程序提供了一种建议的机制,以简化与容器化CSI兼容的卷驱动程序的部署。
作为推荐部署过程的一部分,Kubernetes团队提供了许多sidecar(辅助)容器,包括外部快照sidecar容器。
外部快照程序监视KubernetesAPI服务器上的卷快照内容对象,并针对CSI终结点触发CreateSnapshot和DeleteSnapshot操作。CSI外部供应程序sidecar容器也已更新,以支持使用新的数据源 PVC字段从快照恢复卷。
为了支持快照特性,建议存储供应商除了部署外部供应程序外,还将外部快照sidecar容器及其CSI驱动程序部署到一个状态集中,如下图所示。
Beta版有什么限制?
Kubernetes卷快照的beta版实现有以下限制:
接下来做什么?
根据反馈和采用情况,Kubernetes团队计划在1.18或1.19版本中将CSI快照实现推送到GA。我们希望支持的某些特性包括一致性组、应用程序一致性快照、工作负载静止、就地恢复、卷备份等。
参考文档:
https://kubernetes.io/blog/page/2/
作者:XingYang (VMware)、Xiangqian Yu (Google)