乐趣区

Kubernetes对卷快照Alpha支持的现况

作者:Jing Xu(谷歌)、Xing Yang(华为)、Saad Ali(谷歌)
Kubernetes v1.12 引入了卷快照(volume snapshot)支持作为 alpha 功能。在 Kubernetes v1.13,它仍然是 alpha 功能,但增加了一些强化和一些重大更改。这篇文章总结了这些变化。
重大更改
CSI spec v1.0 对卷快照功能进行了一些重大更改。CSI 驱动程序维护者在升级其驱动程序以支持 v1.0 时,应该了解这些更改。
SnapshotStatus 替换为 Boolean ReadyToUse
在 CSI v0.3.0,CreateSnapshotResponse 中定义了 SnapshotStatus 枚举(enum),表示快照是 READY,UPLOADING,还是 ERROR_UPLOADING。在 CSI v1.0,SnapshotStatus 已从 CreateSnapshotResponse 中删除,并替换为布尔值(boolean)ReadyToUse。ReadyToUse 值为 true,表示完成后快照处理(post snapshot processing),例如上载,并且快照已准备好用作创建卷的源。
需要进行后快照处理的存储系统(例如在快照完成后上传),应该在快照完成后返回成功的 CreateSnapshotResponse,并将 ReadyToUse 字段设置为 false。这表示容器箱编排系统(Container Orchestration System,CO),可以恢复因为进行快照而停顿的任何工作负载。然后,CO 可以重复调用 CreateSnapshot,直到 ReadyToUse 字段设置为 true,或该调用返回一个错误,指示处理中出现问题。CSI ListSnapshot 调用可以与 snapshot_id 过滤一起使用,以确定快照是否可以使用,但不推荐使用这个方式,因为它无法在处理过程中检测错误(ReadyToUse 字段只是无限期地保持为 false)。
CSI 外部快照边车容器(external-snapshotter sidecar container)的 v1.x.x 版本,已通过调用 CreateSnapshot,而不是 ListSnapshots 来处理此更改,以检查快照是否可以使用。当升级驱动程序到 CSI 1.0 时,驱动程序维护者应使用相应的 1.0 兼容边车(sidecar)容器。
为了与 CSI 规范的更改保持一致,VolumeSnapshot API 对象中的 Ready 字段已重命名为 ReadyToUse。当执行 kubectl describe volumesnapshot 以查看快照的详细信息时,用户可以看到此更改。
时间戳数据类型
快照的创建时间作为 VolumeSnapshotContent API 对象的一部分可供 Kubernetes 管理员使用。该字段使用 CSI CreateSnapshotResponse 中的 creation_time 字段填充。在 CSI v1.0 中,此 creation_time 字段类型已更改为.google.protobuf.Timestamp,而不是 int64。将驱动程序升级到 CSI 1.0 时,驱动程序维护者必须相应地进行更改。CSI 外部快照程序边车容器的 v1.x.x 版本已更新以处理此更改。
弃用
以下 VolumeSnapshotClass 参数已被弃用(deprecated),将在以后的版本中删除。它们将替换为下面 Replacement“替换”部分中列出的参数。
弃用 csiSnapshotterSecretName,替换 csi.storage.k8s.io/snapshotter-secret-name
弃用 csiSnapshotterSecretNameSpace,替换 csi.storage.k8s.io/snapshotter-secret-namespace
新功能
SnapshotContent 删除 / 保留(Deletion/Retain)政策
如在宣布快照 alpha 的初始博客文章中所述,Kubernetes 快照 API 类似于 PV/PVC API:就像卷(volume),由绑定的 PVC 和 PV 对表示一样,快照由绑定的 VolumeSnapshot 和 VolumeSnapshotContent 对表示。
对于 PV/PVC 对,当用户完成使用卷时,他们可以删除 PVC。PV 上的回收政策决定 PV 之后的处理(是删除,还是保留)。
在最初的 alpha 版本中,快照不支持指定回收政策的功能。当删除快照对象时,它总是导致快照被删除。在 Kubernetes v1.13 中,添加了快照内容 DeletionPolicy。它使管理员,能够配置 VolumeSnapshotContent 在绑定的 VolumeSnapshot 对象被删除后的处理方式。卷快照的 DeletionPolicy 可以是 Retain(删除)或 Delete(保留)。如果未指定该值,则缺省值取决于 SnapshotContent 对象,是通过静态绑定,还是动态配置创建的。
Retain(保留)
Retain(保留)政策允许手动回收资源。如果是静态创建并绑定 VolumeSnapshotContent,则默认的 DeletionPolicy 为 Retain。删除 VolumeSnapshot 时,VolumeSnapshotContent 继续存在,VolumeSnapshotContent 被视为“已释放”(“released”)。但它不能用于绑定到其他 VolumeSnapshot 对象,因为它包含数据。由管理员决定如何处理剩余的 API 对象和资源清理。
Delete(删除)
Delete(删除)政策允许从 Kubernetes 自动删除绑定的 VolumeSnapshotContent 对象,以及外部基础结构中的关联存储资产(例如 AWS EBS 快照,或 GCE PD 快照等)。动态配置的快照会继承其 VolumeSnapshotClass 的删除政策,该政策默认为 Delete。
管理员应使用所需的保留政策配置 VolumeSnapshotClass。创建政策后,通过修补(patching)对象,可以更改单个 VolumeSnapshotContent 的政策。
以下示例演示如何检查动态调配的 VolumeSnapshotContent 的删除政策。
$ kubectl create -f ./examples/kubernetes/demo-defaultsnapshotclass.yaml
$ kubectl create -f ./examples/kubernetes/demo-snapshot.yaml
$ kubectl get volumesnapshots demo-snapshot-podpvc -o yaml
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
creationTimestamp: “2018-11-27T23:57:09Z”

spec:
snapshotClassName: default-snapshot-class
snapshotContentName: snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002
source:
apiGroup: null
kind: PersistentVolumeClaim
name: podpvc
status:

$ kubectl get volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -o yaml
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshotContent

spec:
csiVolumeSnapshotSource:
creationTime: 1546469777852000000
driver: pd.csi.storage.gke.io
restoreSize: 6442450944
snapshotHandle: projects/jing-k8s-dev/global/snapshots/snapshot-26cd0db3-f2a0-11e8-8be6-42010a800002
deletionPolicy: Delete
persistentVolumeRef:
apiVersion: v1
kind: PersistentVolume
name: pvc-853622a4-f28b-11e8-8be6-42010a800002
resourceVersion: “21117”
uid: ae400e9f-f28b-11e8-8be6-42010a800002
snapshotClassName: default-snapshot-class
volumeSnapshotRef:
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
name: demo-snapshot-podpvc
namespace: default
resourceVersion: “6948065”
uid: 26cd0db3-f2a0-11e8-8be6-42010a800002

用户可以使用补丁(patch)更改删除政策:
$ kubectl patch volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -p ‘{“spec”:{“deletionPolicy”:”Retain”}}’ –type=merge

$ kubectl get volumesnapshotcontent snapcontent-26cd0db3-f2a0-11e8-8be6-42010a800002 -o yaml
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshotContent

spec:
csiVolumeSnapshotSource:

deletionPolicy: Retain
persistentVolumeRef:
apiVersion: v1
kind: PersistentVolume
name: pvc-853622a4-f28b-11e8-8be6-42010a800002

保护使用中的快照对象
“保护使用中的快照对象”(Snapshot Object in Use Protection)功能的目的,是确保不会从系统中删除正在使用的快照 API 对象(因为这可能会导致数据丢失)。有两种情况需要“使用中”(“in-use”)保护:

如果卷快照正在被 PVC 作为创建卷的源。
如果 VolumeSnapshotContent API 对象绑定到 VolumeSnapshot API 对象,会认为该内容对象正在使用中。

如果用户删除 PVC 正在使用的 VolumeSnapshot API 对象,VolumeSnapshot 对象不会被立即删除。删除 VolumeSnapshot 对象被推迟,直到任何 PVC 不再使用 VolumeSnapshot。同样,如果管理员删除了绑定到 VolumeSnapshot 的 VolumeSnapshotContent,VolumeSnapshotContent 不会被立即删除。删除 VolumeSnapshotContent 被推迟,直到 VolumeSnapshotContent 没有绑定到 VolumeSnapshot 对象。
哪些卷插件支持 Kubernetes 快照?
快照仅在 CSI 驱动程序支持(不适用于树内“in-tree”或 Flexvolume)。要使用 Kubernetes 快照功能,请确保在群集上部署实现快照的 CSI 驱动程序。
截至本博文发布时,以下 CSI 驱动程序支持快照:

GCE Persistent Disk CSI Driver
OpenSDS CSI Driver
Ceph RBD CSI Driver
Portworx CSI Driver
GlusterFS CSI Driver
Digital Ocean CSI Driver
Ember CSI Driver
Cinder CSI Driver
Datera CSI Driver
NexentaStor CSI Driver

其他驱动程序的快照支持正在等待阶段,应该很快就可以使用。阅读“Kubernetes 的容器存储接口(CSI)GA 了”博客文章,了解有关 CSI 以及如何部署 CSI 驱动程序的更多信息。
下一步?
根据反馈和采用情况,Kubernetes 团队计划将 CSI Snapshot 实施在 1.15 或 1.16 版本推向 beta。我们感兴趣的一些功能包括一致性组(consistency group)、应用程序一致性快照、工作负载停顿、就地恢复等。
怎样才能了解更多?
快照 API 和控制器的代码存储库位于:https://github.com/kubernetes…
在此处查看有关快照功能的其他文档:http://k8s.io/docs/concepts/s…://kubernetes-csi.github.io/docs/
怎样参与?
像所有 Kubernetes 一样,这个项目是许多来自不同背景的贡献者共同努力的结果。
特别感谢所有帮助增加 CSI v1.0 支持,并改进此版本快照功能的贡献者,包括 Saad Ali(saadali)、Michelle Au(msau42)、Deep Debroy(ddebroy)、James DeFelice(jdef)、John Griffith(j-griffith)、Julian Hjortshoj(julian-hj)、Tim Hockin(thockin)、Patrick Ohly(pohly)、Luis Pabon(lpabon)、Cheng Xing(verult)、Jing Xu(jingxu97)、Shiwei Xu(wackxu)、Xing Yang(xing-yang)、Jie Yu(jieyu)、David Zhu(davidz627)。
有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发的人士,请加入 Kubernetes 存储特别兴趣小组(SIG)。我们正在快速成长,一直欢迎新的贡献者。
我们还定期召开 SIG-Storage Snapshot 工作组会议。欢迎新的参与者加入设计和开发的讨论。

2019 年 KubeCon + CloudNativeCon 中国论坛提案征集(CFP)现已开放
KubeCon + CloudNativeCon 论坛让用户、开发人员、从业人员汇聚一堂,面对面进行交流合作。与会人员有 Kubernetes、Prometheus 及其他云原生计算基金会 (CNCF) 主办项目的领导,和我们一同探讨云原生生态系统发展方向。
2019 年中国开源峰会提案征集(CFP)现已开放
在中国开源峰会上,与会者将共同合作及共享信息,了解最新和最有趣的开源技术,包括 Linux、容器、云技术、网络、微服务等;并获得如何在开源社区中导向和引领的信息。
大会日期:

提案征集截止日期:太平洋标准时间 2 月 15 日,星期五,晚上 11:59
提案征集通知日期:2019 年 4 月 1 日
会议日程通告日期:2019 年 4 月 3 日
幻灯片提交截止日期:6 月 17 日,星期一
会议活动举办日期:2019 年 6 月 24 至 26 日

2019 年 KubeCon + CloudNativeCon + Open Source Summit China 赞助方案出炉啦

退出移动版