本文发布已超过一年。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已失效。
Kubernetes Volume Snapshot Alpha 的更新
卷快照支持作为 Alpha 特性在 Kubernetes v1.12 中引入。在 Kubernetes v1.13 中,它仍然是 Alpha 特性,但增加了一些增强功能并进行了一些破坏性更改。本文总结了这些更改。
破坏性更改
CSI spec v1.0 对卷快照功能引入了一些破坏性更改。CSI 驱动程序维护者在升级驱动程序以支持 v1.0 时应注意这些更改。
SnapshotStatus 被布尔型 ReadyToUse 替代
CSI v0.3.0 在 CreateSnapshotResponse
中定义了一个 SnapshotStatus
枚举,用于指示快照是否为 READY
、UPLOADING
或 ERROR_UPLOADING
。在 CSI v1.0 中,SnapshotStatus
已从 CreateSnapshotResponse
中移除,并替换为布尔型 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
查看快照详细信息时,可以看到此更改。
Timestamp 数据类型
快照的创建时间作为 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
对象是通过静态绑定还是动态 Provisioning 创建的。
保留
Retain
策略允许手动回收资源。如果 VolumeSnapshotContent
是静态创建并绑定的,则默认的 DeletionPolicy
是 Retain
。当 VolumeSnapshot
被删除时,VolumeSnapshotContent
会继续存在,并且 VolumeSnapshotContent
被认为是“已释放”。但由于它包含数据,因此无法绑定到其他 VolumeSnapshot
对象。管理员需要决定如何处理剩余的 API 对象和资源清理。
删除
Delete
策略允许自动从 Kubernetes 中删除绑定的 VolumeSnapshotContent
对象以及外部基础设施中关联的存储资产(例如 AWS EBS 快照或 GCE PD 快照等)。动态 Provisioning 的快照继承其VolumeSnapshotClass
的删除策略,其默认值为 Delete
。管理员应使用所需的保留策略配置 VolumeSnapshotClass
。策略可以在创建单个 VolumeSnapshotContent
后通过修补对象进行更改。
以下示例演示了如何检查动态 Provisioning 的 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
...
使用中的快照对象保护
使用中的快照对象保护功能的目的是确保正在使用的快照 API 对象不会从系统中移除(因为这可能导致数据丢失)。需要“使用中”保护的情况有两种:
- 如果卷快照作为创建卷的源,正在被持久卷声明 (PVC) 积极使用。
- 如果
VolumeSnapshotContent
API 对象绑定到VolumeSnapshot
API 对象,则该内容对象被视为正在使用中。
如果用户删除了正被 PVC 积极使用的 VolumeSnapshot
API 对象,该 VolumeSnapshot
对象不会立即被移除。相反,VolumeSnapshot
对象的移除将被推迟,直到该 VolumeSnapshot
不再被任何 PVC 积极使用。类似地,如果管理员删除了绑定到 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
- DigitalOcean CSI Driver
- Ember CSI Driver
- Cinder CSI Driver
- Datera CSI Driver
- NexentaStor CSI Driver
对其他驱动程序的快照支持正在进行中,应该很快就会推出。阅读“Kubernetes Container Storage Interface (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 Storage Special Interest Group (SIG)。我们正在快速发展,并随时欢迎新的贡献者。
我们还定期举行SIG-Storage Snapshot 工作组会议。欢迎新成员加入设计和开发讨论。