本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 卷快照 Alpha 版的更新
Kubernetes v1.12 版本引入了卷快照支持,作为 Alpha 功能。在 Kubernetes v1.13 版本中,它仍然是 Alpha 功能,但添加了一些增强功能,并进行了一些重大更改。本文总结了这些更改。
重大更改
CSI 规范 v1.0 对卷快照功能引入了一些重大更改。CSI 驱动程序维护者在升级驱动程序以支持 v1.0 时应注意这些更改。
SnapshotStatus 被布尔值 ReadyToUse 替换
CSI v0.3.0 在 CreateSnapshotResponse
中定义了一个 SnapshotStatus
枚举,用于指示快照是 READY
、UPLOADING
还是 ERROR_UPLOADING
。在 CSI v1.0 中,SnapshotStatus
已从 CreateSnapshotResponse
中删除,并替换为 boolean ReadyToUse
。ReadyToUse
值为 true
表示快照后处理(例如上传)已完成,并且快照已准备好用作创建卷的源。
需要进行快照后处理(例如在快照创建后上传)的存储系统应在快照创建后立即返回成功的 CreateSnapshotResponse
,并将 ReadyToUse
字段设置为 false
。这表示容器编排系统 (CO) 可以恢复为创建快照而静止的任何工作负载。然后,CO 可以重复调用 CreateSnapshot
,直到 ReadyToUse
字段设置为 true
或调用返回错误,指示处理中存在问题。CSI ListSnapshot
调用可以与 snapshot_id
过滤一起使用,以确定快照是否准备好使用,但不建议这样做,因为它无法检测处理过程中的错误(ReadyToUse
字段只会无限期地保持 false
)。
CSI external-snapshotter sidecar 容器的 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 external-snapshotter sidecar 容器的 v1.x.x 版本已更新以处理此更改。
弃用
以下 VolumeSnapshotClass
参数已弃用,将在未来的版本中删除。它们将被下面“替换”部分中列出的参数替换。
已弃用 替换 csiSnapshotterSecretName csi.storage.k8s.io/snapshotter-secret-name csiSnapshotterSecretNameSpace csi.storage.k8s.io/snapshotter-secret-namespace
新功能
SnapshotContent 删除/保留策略
如宣布快照 Alpha 的初始博客文章中所述,Kubernetes 快照 API 与 PV/PVC API 类似:就像卷由绑定的 PVC 和 PV 对表示一样,快照由绑定的 VolumeSnapshot
和 VolumeSnapshotContent
对表示。
使用 PV/PVC 对,当用户完成使用卷时,他们可以删除 PVC。而 PV 上的回收策略决定了 PV 的处理方式(是也被删除还是保留)。
在初始的 Alpha 版本中,快照不支持指定回收策略的功能。相反,当删除快照对象时,总是会导致快照被删除。在 Kubernetes v1.13 中,添加了快照内容 DeletionPolicy
。它使管理员能够配置在删除其绑定的 VolumeSnapshot
对象后,VolumeSnapshotContent
的处理方式。卷快照的 DeletionPolicy
可以是 Retain
或 Delete
。如果未指定值,则默认值取决于 SnapshotContent
对象是通过静态绑定还是动态配置创建的。
保留
Retain
策略允许手动回收资源。如果静态创建和绑定 VolumeSnapshotContent
,则默认的 DeletionPolicy
为 Retain
。删除 VolumeSnapshot
时,VolumeSnapshotContent
继续存在,并且 VolumeSnapshotContent
被视为“已释放”。但是,它不可用于绑定到其他 VolumeSnapshot
对象,因为它包含数据。由管理员决定如何处理剩余的 API 对象和资源清理。
删除
Delete
策略允许自动从 Kubernetes 中删除绑定的 VolumeSnapshotContent
对象以及外部基础结构中的相关存储资产(例如 AWS EBS 快照或 GCE PD 快照等)。动态配置的快照会继承其 VolumeSnapshotClass
的删除策略,该策略默认为 Delete
。管理员应使用所需的保留策略配置 VolumeSnapshotClass
。可以在创建后通过修补对象来更改单个 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
用户可以使用补丁更改删除策略
$ 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
...
使用中快照对象保护
使用中快照对象保护功能的目的是确保不会从系统中删除正在使用的快照 API 对象(因为这可能会导致数据丢失)。有两种情况需要“使用中”保护
- 如果持久卷声明正在积极使用卷快照作为创建卷的源。
- 如果
VolumeSnapshotContent
API 对象绑定到 VolumeSnapshot API 对象,则该内容对象被视为正在使用。
如果用户删除 PVC 正在积极使用的 VolumeSnapshot
API 对象,则不会立即删除 VolumeSnapshot
对象。相反,VolumeSnapshot
对象的删除会延迟到 VolumeSnapshot
不再被任何 PVC 积极使用为止。同样,如果管理员删除绑定到 VolumeSnapshot
的 VolumeSnapshotContent
,则不会立即删除 VolumeSnapshotContent
。相反,VolumeSnapshotContent
的删除会延迟到 VolumeSnapshotContent
未绑定到 VolumeSnapshot
对象为止。
哪些卷插件支持 Kubernetes 快照?
快照仅支持 CSI 驱动程序(不支持内置或 FlexVolume)。要使用 Kubernetes 快照功能,请确保在您的集群上部署了实现快照的 CSI 驱动程序。
在发布此博客文章时,以下 CSI 驱动程序支持快照
- GCE 持久磁盘 CSI 驱动程序
- OpenSDS CSI 驱动程序
- Ceph RBD CSI 驱动程序
- Portworx CSI 驱动程序
- GlusterFS CSI 驱动程序
- DigitalOcean CSI 驱动程序
- Ember CSI 驱动程序
- Cinder CSI 驱动程序
- Datera CSI 驱动程序
- NexentaStor CSI 驱动程序
其他 驱动程序 的快照支持正在等待中,应该很快就会推出。请阅读“Kubernetes 的容器存储接口 (CSI) GA”博客文章,以了解有关 CSI 以及如何部署 CSI 驱动程序的更多信息。
接下来是什么?
根据反馈和采用情况,Kubernetes 团队计划在 1.15 或 1.16 中将 CSI 快照实现推向 Beta 版。我们有兴趣支持的一些功能包括一致性组、应用程序一致性快照、工作负载静止、就地还原等。
如何了解更多?
快照 API 和控制器的代码库在此处:https://github.com/kubernetes-csi/external-snapshotter
在此处查看有关快照功能的其他文档:http://k8s.io/docs/concepts/storage/volume-snapshots 和 https://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-存储快照工作组会议。欢迎新参会者加入设计和开发讨论。