作者 | Xing Yang, VMware & Xiangqian Yu, Google
翻译 | 乔克
原文 | https://kubernetes.io/blog/2020/12/10/kubernetes-1.20-volume-snapshot-moves-to-ga/
Kubernetes卷快照功能在Kubernetes v1.20已升至GA。它在Kubernetes v1.12版本中作为Alpha引入,在v1.13版本中升级为Alpha2,在Kubernetes 1.17中提升为Beta版。这篇博客文章总结了其从Beta到GA所做的更改。
许多存储系统(例如Google Cloud Persistent Disks,Amazon Elastic Block Storage和许多本地存储系统)都可以创建持久卷的“快照”。卷快照是卷在某个时间点的副本,快照可用于填充新的Volume(预填充快照数据)或将现有卷恢复到先前状态(由快照表示)。
Kubernetes的目标是在分布式应用程序和基础群集之间创建一个抽象层,以便应用程序可以与它们所运行集群的具体情况无关,并且应用程序部署不需要“特定集群”。
Kubernetes Storage SIG将快照操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能要在开始数据库操作之前对数据库的卷进行快照。
在Kubernetes中通过提供一种触发卷快照操作的标准方法,此功能允许Kubernetes用户以可移植的方式在任何Kubernetes环境中合并快照操作,而无需考虑基础存储。
此外,Kubernetes快照作为基本组件,可便于为Kubernetes提供开发高级企业级存储管理功能的能力,包括应用程序或集群级备份解决方案。
随着将Volume Snapshot升级为GA,在Kubernetes中默认启用了该功能,并且无法将其关闭。
为了提高此功能的质量并使其达到生产级,已进行了许多增强。
hostPath
引入了压力测试(基于Google Persistent Disk和hostPath CSI驱动)来测试系统的稳定性。除了引入严格的验证之外,v1beta1和v1的Kubernetes卷快照API之间没有区别。在此版本(使用Kubernetes 1.20)中,同时提供了v1和v1beta1,而存储的API版本仍为v1beta1。将来的发行版会将存储的版本切换到v1,并逐渐删除对v1beta1的支持。
仅CSI驱动程序支持快照,in-tree或FlexVolume驱动程序不支持快照。确保群集上已部署的CSI驱动程序已实现快照接口,有关更多信息,请参见 Container Storage Interface (CSI) for Kubernetes GA。
当前,有50多个CSI驱动程序支持卷快照功能。在GCE Persistent Disk CSI Driver已通过了升级的测试时间里从卷快照公测GA。对其他CSI驱动程序的GA级别支持应尽快提供。
卷快照功能包含以下组件:
强烈建议Kubernetes发行商捆绑并部署卷快照控制器,CRD和验证Webhook,作为其Kubernetes集群管理过程的一部分(与任何CSI驱动程序无关)。
**警告:**快照验证Webhook是从v1beta1平稳过渡到v1 API的关键组件。如果不安装快照验证Webhook,则无法防止无效卷快照对象的创建/更新,这反过来又将阻止在即将进行的升级中删除无效卷快照对象。
如果您的群集未预装正确的组件,则可以手动安装它们。有关详细信息,请参见CSI Snapshotter。
假设所有必需的组件(包括CSI驱动程序)已经在集群上部署并运行,则可以使用VolumeSnapshot
API对象创建卷快照,或者VolumeSnapshot
通过在其上指定VolumeSnapshot数据源使用现有的卷恢复PVC。有关更多详细信息,请参见卷快照文档。
注意: Kubernetes Snapshot API不提供任何应用程序一致性保证。您必须手动或使用更高级别的API /控制器来获取数据一致性之前,必须准备好应用程序(暂停应用程序,冻结文件系统等)。
要动态配置卷快照,请首先创建一个VolumeSnapshotClass
API对象。
apiVersion: snapshot.storage.k8s.io/v1
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
然后VolumeSnapshot
通过指定卷快照类从PVC创建API对象。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: test-snapshot
namespace: ns1
spec:
volumeSnapshotClassName: test-snapclass
source:
persistentVolumeClaimName: test-pvc
要将预先存在的卷快照导入Kubernetes,请首先手动创建一个VolumeSnapshotContent
对象。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
name: test-content
spec:
deletionPolicy: Delete
driver: testdriver.csi.k8s.io
source:
snapshotHandle: 7bdd0de3-xxx
volumeSnapshotRef:
name: test-snapshot
namespace: default
然后创建一个VolumeSnapshot
指向该VolumeSnapshotContent
对象的对象。
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: test-snapshot
spec:
source:
volumeSnapshotContentName: test-content
绑定就绪VolumeSnapshot
对象可以用于重新快照新的卷,其中包含从快照数据中预先填充的数据,如下所示:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-restore
namespace: demo-namespace
spec:
storageClassName: test-storageclass
dataSource:
name: test-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Kubernetes的卷快照的GA实现具有以下限制:
快照API和控制器的代码存储库位于:https : //github.com/kubernetes-csi/external-snapshotter
在此处查看有关快照功能的其他文档:http : //k8s.io/docs/concepts/storage/volume-snapshots和https://kubernetes-csi.github.io/docs/