干货解析 |为什么要将快照引入Kubernetes?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/k8scaptain/article/details/83022824

Kubernetes v1.12引入了对volume snapshotting alpha的支持。此功能允许创建/删除卷快照,以及使用Kubernetes API本机创建新卷的功能。

    

1 什么是快照?


许多存储系统(如Google Cloud Persistent Disks、Amazon Elastic Block Storage和许多内部部署存储系统)都能够创建持久卷的“快照”。快照表示卷的时间点副本。快照可用于配置新卷(预先填充快照数据)或将现有卷还原到先前状态(由快照表示)。

 

2 为什么要将快照引入到Kubernetes?

 

Kubernetes卷插件系统已经提供了一个强大的抽象功能,可以自动化块和文件存储的配置、挂载和安装。


支持所有这些功能的是Kubernetes工作负载可移植性的目标:Kubernetes旨在在分布式系统应用程序和底层集群之间创建一个抽象层,以便应用程序可以与运行的集群的细节无关,并且应用程序部署不需要“特定于集群”的知识。

Kubernetes Storage SIG将快照操作定为许多有状态工作负载的关键功能。例如,数据库管理员可能希望在开始数据库操作之前对数据库卷进行快照。

 

通过提供在Kubernetes API中触发快照操作的标准方法,Kubernetes用户现在可以处理这样的用例,而无需绕过Kubernetes API(并手动执行特定于存储系统的操作)。

相反,Kubernetes用户现在有权将集群无关的快照操作合并到他们的工具和策略中,并且知道无论底层存储如何,它都可以对任意Kubernetes集群起作用。

此外,这些Kubernetes快照原语充当了基本构建块,可以为Kubernetes开发高级企业级存储管理功能:例如数据保护、数据复制和数据迁移。

 

3 哪个卷插件支持Kubernetes Snapshots?

 

 

Kubernetes支持三种类型的卷插件:in-tree、Flex和CSI。有关详细信息,请参阅Kubernetes Volume Plugin FAQ。

仅CSI驱动程序支持快照(不适用于in-tree或Flex)。要使用Kubernetes快照功能,请确保在集群上部署实现快照的CSI驱动程序。

目前,以下CSI驱动程序支持快照:GCE Persistent Disk CSI Driver、OpenSDS CSI Driver、Ceph RBD CSI Driver、Portworx CSI Driver。

其他驱动程序的快照支持工作正在进行,应该很快就可以使用。阅读“Kubernetes Goes Beta的容器存储接口(CSI)”博客文章,了解有关CSI以及如何部署CSI驱动程序的更多信息。

 

4 Kubernetes Snapshots API

 

与管理Kubernetes Persistent Volumes的API类似,Kubernetes Volume Snapshots引入了三个用于管理快照的新API对象:
 

  • VolumeSnapshot——由Kubernetes用户创建,以请求为指定卷创建快照。它包含有关快照操作的信息,例如拍摄快照时的时间戳以及快照是否可以使用;与PersistentVolumeClaim对象类似,此对象的创建和删除表示用户创建或删除集群资源(快照)的愿望。

 

  • VolumeSnapshotContent——成功创建快照后,由CSI卷驱动程序创建。它包含有关快照的信息,包括快照ID;与PersistentVolume对象类似,此对象表示集群上的已配置资源(快照);与PersistentVolumeClaim和PersistentVolume对象一样,创建快照后,VolumeSnapshotContent对象将绑定到为其创建的VolumeSnapshot(使用一对一映射)。

   

  •  VolumeSnapshotClass——由集群管理员创建,以描述应如何创建快照。包括驱动程序信息、访问快照的秘密等。


值得注意的是,与核心Kubernetes Persistent Volume对象不同,这些Snapshot对象被定义为CustomResourceDefinitions(CRD)。Kubernetes项目正逐渐远离拥有API服务器中预定义的资源类型,并且正朝着API服务器独立于API对象的模型发展。这允许API服务器可以重用于Kubernetes以外的项目,而使用者(如Kubernetes)可以简单地安装它们作为CRD所需的资源类型。

 

支持快照的CSI驱动程序将自动安装所需的CRD。Kubernetes最终用户只需要验证支持快照的CSI驱动程序是否部署在其Kubernetes集群上。

除了这些新对象之外,还在PersistentVolumeClaim对象中添加了一个新的DataSource字段:


 

type PersistentVolumeClaimSpec struct {     AccessModes []PersistentVolumeAccessMode     Selector *metav1.LabelSelector     Resources ResourceRequirements     VolumeName string     StorageClassName *string     VolumeMode *PersistentVolumeMode     DataSource *TypedLocalObjectReference }

 

此新的alpha字段可以创建新卷,并使用现有快照中的数据自动预填充。

 

5 Kubernetes快照要求

 

在使用Kubernetes Volume Snapshotting之前,你必须:

 

  • 确保在Kubernetes集群上部署并运行实施快照的CSI驱动程序。

  • 通过新的Kubernetes功能gate启用Kubernetes Volume Snapshotting功能(默认情况下禁用alpha)

  • 在API服务器二进制文件上设置以下标志: -  feature-gates = VolumeSnapshotDataSource = true

 

在创建快照之前,还需要通过创建VolumeSnapshotClass对象并将snapshotter字段设置为指向CSI驱动程序来为快照指定CSI驱动程序信息。在下面的VolumeSnapshotClass示例中,CSI驱动程序是com.example.csi-driver。每个快照配置程序至少需要一个VolumeSnapshotClass对象。你还可以通过在类定义中放置注释snapshot.storage.kubernetes.io/is-default-class:“true”来为每个单独的CSI驱动程序设置默认的VolumeSnapshotClass。

 

apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata:  name: default-snapclass  annotations:    snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata:  name: csi-snapclass snapshotter: com.example.csi-driver parameters:  fakeSnapshotOption: foo  csiSnapshotterSecretName: csi-secret  csiSnapshotterSecretNamespace: csi-namespace

 

你必须根据CSI驱动程序的文档设置任何所需的不透明参数。如上面的示例所示,参数fakeSnapshotOption:foo和任何引用的秘密将在快照创建和删除期间传递给CSI驱动程序。默认CSI外部快照程序保留参数秘密csiSnapshotterSecretName和csiSnapshotterSecretNamespace。如果指定,它将获取秘密并在创建和删除快照时将其传递给CSI驱动程序。

最后,在创建快照之前,你必须使用CSI驱动程序配置卷,并使用你想要快照的一些数据填充它(请参阅有关如何创建和使用CSI卷的CSI博客文章)。

 

6 使用Kubernetes创建新快照

 

定义VolumeSnapshotClass对象并且你有要快照的卷后,可以通过创建VolumeSnapshot对象来创建新快照。

快照源指定要从中创建快照的卷。它有两个参数:
   

  •  kind ——必须是PersistentVolumeClaim

  •  name —— PVC API对象名称



     

假定卷的快照命名空间与VolumeSnapshot对象的命名空间相同。

 

apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata:  name: new-snapshot-demo  namespace: demo-namespace spec:  snapshotClassName: csi-snapclass  source:    name: mypvc    kind: PersistentVolumeClaim

 

在VolumeSnapshot规范中,用户可以指定VolumeSnapshotClass,其中包含有关应使用哪个CSI驱动程序创建快照的信息。创建VolumeSnapshot对象时,VolumeSnapshotClass中的参数fakeSnapshotOption:foo和任何引用的秘密将通过CreateSnapshot调用传递给CSI插件com.example.csi-driver。

作为响应,CSI驱动程序触发卷的快照,然后自动创建VolumeSnapshotContent对象以表示新快照,并将新的VolumeSnapshotContent对象绑定到VolumeSnapshot,使其可以使用。如果CSI驱动程序无法创建快照并返回错误,则快照控制器将报告VolumeSnapshot对象状态中的错误,并且不会重试(这与Kubernetes中的其他控制器不同,并且是为了防止意外在错误的时间拍摄快照)。

如果未指定快照类,外部快照程序将尝试查找并为快照设置默认快照类。由默认快照类中的snapshotter指定的CSI驱动程序必须与PVC存储类中的配置程序指定的CSI驱动程序匹配。

请注意,Kubernetes Snapshot的alpha版本不提供任何一致性保证。在拍摄快照以确保数据一致性之前,你必须准备应用程序(暂停应用程序,冻结文件系统等)。

你可以通过运行kubectl describe volumesnapshot验证是否已创建VolumeSnapshot对象并使用VolumeSnapshotContent绑定:
 

  •  应在Status下将Ready设置为true,以指示此卷快照已准备就绪。

  •  “Creation Time”字段指示实际创建(剪切)快照的时间。

  •  “Restore Size”字段表示从快照还原卷时的最小卷大小。

  •  规范中的“Snapshot Content Name”字段指向为此快照创建的VolumeSnapshotContent对象。

 

7 使用Kubernetes导入现有快照

 

你始终可以通过手动创建VolumeSnapshotContent对象来将现有快照导入Kubernetes,以表示现有快照。由于VolumeSnapshotContent是非命名空间API对象,因此只有系统管理员才有权创建它。创建VolumeSnapshotContent对象后,用户可以创建指向VolumeSnapshotContent对象的VolumeSnapshot对象。在验证快照存在且VolumeSnapshot和VolumeSnapshotContent对象之间的绑定正确后,外部快照控制器会将快照标记为就绪。绑定后,快照就可以在Kubernetes中使用了。

应使用以下字段创建VolumeSnapshotContent对象,以表示预配置的快照:
 

  • csiVolumeSnapshotSource —— 快照标识信息。

  • snapshotHandle —— 快照的名称/标识符。这是必需字段。

  • 驱动程序 ——用于处理此卷的CSI驱动程序。这是必需字段。它必须与快照控制器中的快照程序名称匹配。 

  •  creationTime和restoreSize——预配置卷不需要这些字段。外部快照控制器将在创建后自动更新它们。

  •  volumeSnapshotRef——指向此对象应绑定到的VolumeSnapshot对象的指针。name和namespace ——它指定内容绑定到的VolumeSnapshot对象的名称和命名空间。

  •  UID  - 预配置卷不需要这些字段。外部快照控制器将在绑定后自动更新字段。如果用户指定UID字段,则他/她必须确保它与绑定快照的UID匹配。如果指定的UID与绑定快照的UID不匹配,则该内容将被视为孤立对象,控制器将删除该对象及其关联的快照。

 

  • snapshotClassName——此字段是可选的。外部快照控制器将在绑定后自动更新字段。



     

apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent metadata:  name: static-snapshot-content spec:  csiVolumeSnapshotSource:    driver: com.example.csi-driver    snapshotHandle: snapshotcontent-example-id  volumeSnapshotRef:    kind: VolumeSnapshot    name: static-snapshot-demo    namespace: demo-namespace

 

应创建VolumeSnapshot对象以允许用户使用快照:
 

  • snapshotClassName——卷快照类的名称。该字段是可选的。 如果设置,则快照类中的快照程序字段必须与快照控制器的快照程序名称匹配。如果未设置,快照控制器将尝试查找默认快照类。

  • snapshotContentName——卷快照内容的名称。预配置卷需要此字段。



     

apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata:  name: static-snapshot-demo  namespace: demo-namespace spec:  snapshotClassName: csi-snapclass  snapshotContentName: static-snapshot-content

 

创建这些对象后,快照控制器将它们绑定在一起,并将字段Ready(在Status下)设置为True以指示快照已准备就绪。

 

8 使用Kubernetes从快照配置新卷


要配置预先填充了来自快照对象的数据的新卷,请使用PersistentVolumeClaim中的新dataSource字段。 它有三个参数:

     name——表示要用作源的快照的VolumeSnapshot对象的名称
     kind —— 必须是VolumeSnapshot
     apiGroup —— 必须是snapshot.storage.k8s.io

假定源VolumeSnapshot对象的命名空间与PersistentVolumeClaim对象的命名空间相同。

 

apiVersion: v1 kind: PersistentVolumeClaim metadata:  name: pvc-restore  Namespace: demo-namespace spec:  storageClassName: csi-storageclass  dataSource:    name: new-snapshot-demo    kind: VolumeSnapshot    apiGroup: snapshot.storage.k8s.io  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi

 

创建PersistentVolumeClaim对象时,它将触发预先填充了来自指定快照的数据的新卷的配置。

 

9 作为存储供应商,如何向CSI驱动程序添加对快照的支持?

 

要实现快照功能,CSI驱动程序必须添加对其他控制器功能CREATE_DELETE_SNAPSHOT和LIST_SNAPSHOTS的支持,并实现其他控制器RPC:CreateSnapshot、DeleteSnapshot和ListSnapshots。有关详细信息,请参阅CSI规范。

尽管Kubernetes尽可能在CSI卷驱动程序的打包和部署方面具有最低限度的规定,但它提供了在Kubernetes上部署任意容器化CSI驱动程序的建议机制,以简化容器化CSI兼容卷驱动程序的部署。

作为推荐部署过程的一部分,Kubernetes团队提供了许多边车(辅助)容器,包括一个新的外部快照边车容器。

external-snapshotter监视Kubernetes API服务器以查找VolumeSnapshot和VolumeSnapshotContent对象,并针对CSI端点触发CreateSnapshot和DeleteSnapshot操作。 CSI外部供应商边车容器也已更新,以支持使用新的dataSource PVC字段从快照恢复卷。

为了支持快照功能,建议存储供应商除了外部配置器、外部挂载器以及它们的CSI驱动器之外,还要部署外部快照器边车容器,如下图所示。

 

在此示例中,部署yaml文件、两个边车容器、外部配置器和外部快照器以及CSI驱动程序与statefulset pod中的hostpath CSI插件一起部署。 Hostpath CSI插件是一个示例插件,不适用于生产。

 

10 alpha有什么限制?

 

 

Kubernetes快照的alpha实现具有以下限制:
 

  • 不支持将现有卷还原到快照表示的早期状态(alpha仅支持从快照配置新卷)。

  • 不支持从快照中对现有PersistentVolumeClaim进行“就地恢复”:即从快照配置新卷,但更新现有PersistentVolumeClaim以指向新卷并有效地使PVC看起来恢复到早期状态( alpha仅支持使用通过新PV / PVC从快照配置的新卷。

  • 没有快照一致性保证超出存储系统提供的任何保证(例如崩溃一致性)。

 

11 下一步是什么?


根据反馈和采用情况,Kubernetes团队计划将CSI Snapshot实施推向1.13或1.14中的beta。

 

12 怎样才能了解更多?

 

请查看有关快照功能的其他文档:http://k8s.io/docs/concepts/storage/volume-snapshots和https://kubernetes-csi.github.io/docs/

 

13 如何参与?

 

像所有Kubernetes项目一样,这个项目是许多来自不同背景的贡献者共同努力的结果。


除了一直致力于快照功能的贡献者:Xing Yang(xing-yang)、Jing Xu(jingxu97)、Huamin Chen(rootfs)、Tomas Smetana(tsmetana)、Shiwei Xu(wackxu)之外,我们非常感谢Kubernetes Storage SIG和CSI社区的所有贡献者,他们帮助审核了项目的设计和实施,包括但不限于:Saad Ali (saadali)、Tim Hockin (thockin)、Jan Šafránek (jsafrane)、Luis Pabon (lpabon)、Jordan Liggitt (liggitt)、David Zhu (davidz627)、Garth Bushell (garthy)、Ardalan Kangarlou (kangarlou)、Seungcheol Ko (sngchlko)、Michelle Au (msau42)、Humble Devassy Chirammal (humblec)、Vladimir Vivien (vladimirvivien)、John Griffith (j-griffith)、Bradley Childs (childsb)、Ben Swartzlander (bswartz)、Michelle Au(msau42)、Humble Devassy Chirammal(humblec)、Vladimir Vivien(vladimirvivien)、John Griffith (j-griffith)、Bradley Childs (childsb)、Ben Swartzlander (bswartz)。

如果你有兴趣参与CSI或Kubernetes存储系统的任何部分的设计和开发,请加入Kubernetes存储特别兴趣小组(SIG)。我们正在快速成长,并始终欢迎新的贡献者

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试