背景

许多存储系统提供了创建存储卷“快照”(snapshot)的能力,以防止数据丢失。快照可以替代传统的备份系统来备份和还原主要数据和关键数据。快照能够快速备份数据(例如,创建GCE PD快照仅需要几分之一秒), 并提供快速恢复时间目标(RTO)和恢复点目标(RPO)。快照还可用于数据复制、分发和迁移。

早在kubernetes 1.8版本中,卷快照系统原型已经发布,其实现位于external-storage(https://github.com/kubernetes-incubator/external-storage)库中。该原型基于CRD实现,提供了外部controller和provisioner两个二进制,支持GCE PD,AWS EBS,OpenStack Cinder,GlusterFS和Kubernetes hostPath等存储卷。

Kubernetes的社区存储趋势是采用CSI实现存储插件,本文添加对CSI存储插件的快照支持。Kubernetes的趋势是保持核心API尽可能小,因此我们采用CRD实现,并添加一个外部快照控制器来处理卷快照,external provisioner也会升级以支持从快照创建volume,CSI snapshot规范详情可以在https://github.com/container-storage-interface/spec/pull/224查看。

目标

对于Kubernetes中的第一个快照支持版本,我们仅支持CSI卷插件按需创建快照。

目标1:实现标准化的快照操作,支持创建,列出和删除快照等REST API。目前,API将使用CRD(CustomResourceDefinitions)实现。

目标2:实现CSI卷快照支持。external-snapshotter将与CSI卷插件的其他外部组件(例如,external-attacher, external-provisioner)一起部署。

目标3:提供一种从快照创建新存储卷和还原现有卷的便捷方法。

以下目标本阶段将不会实现,但将在稍后阶段考虑。

目标4:通过提供pre/post快照钩子来冻结/解冻应用程序和/或卸载/挂载文件系统,从而提供应用程序一致性快照。

目标5:提供更高级别的管理,例如备份和还原pod和statefulSet,以及创建一致性的快照组。

详细设计

在此提案中,卷快照被视为Kubernetes管理的另一种存储资源。 因此,快照API和控制器遵循现有卷管理的设计模式。

VolumeSnapshot

VolumeSnapshotContent

VolumeSnapshotClass

三个API,它们与PersistentVolumeClaim和PersistentVolume以及storageClass的结构类似。外部快照控制器的功能类似于in-tree的PV控制器。同时建议在PersistentVolumeClaim(PVC)API中添加新的数据源结构,以支持从快照还原数据卷。 以下部分将详细介绍API和控制器设计。

Snapshot API设计

 

VolumeSnapshot和VolumeSnapshotContent API是在PersistentVolumeClaim和PersistentVolume之后建模设计的。 在第一个版本中,VolumeSnapshot生命周期完全独立于其来源(PVC)。 删除PVC / PV时,相应的VolumeSnapshot和VolumeSnapshotContent对象将继续存在。 但是,对于某些卷插件,快照依赖于其存储卷。 在未来的版本中,我们计划进行完整的生命周期管理,以便更好地处理快照与其卷之间的关系。(例如,添加finalizer,当有快照依赖于存储卷时,可防止存储卷被删除)。

VolumeSnapshot对象

 

VolumeSnapshotContent对象

 

VolumeSnapshotClass对象

 

我们将添加新的API对象VolumeSnapshotClass,而不是复用现有的StorageClass,以避免在snapshot和volume之间混合参数。每个CSI卷插件都可以拥有自己的默认VolumeSnapshotClass。如果未提供VolumeSnapshotClass,则将使用默认值。VolumeSnapshotClass将为快照添加新的参数。

Snapshot Controller  设计要点

如下图所示,CSI快照控制器体系结构由external-snapshotter(外部快照器)组成,external-snapshotter通过套接字与out-of-tree CSI卷插件进行通信(默认情况下为/ run / csi / socket,可由-csi-address配置)。external-snapshotter是Kubernetes实现容器存储接口(CSI)的一部分。 它是一个外部控制器,用于监视VolumeSnapshot和VolumeSnapshotContent对象并创建/删除快照。

    • 通常external-snapshotter使用ControllerGetCapabilities来验证CSI驱动程序是否支持CREATE_DELETE_SNAPSHOT调用。

    • external-snapshotter负责创建/删除快照及绑定VolumeSnapshot和VolumeSnapshotContent对象。它遵循kubernetes控制器模式并使用informer来监视VolumeSnapshot和VolumeSnapshotContent创建/更新/删除事件。通过Snapshotter == <CSI卷插件名字>过滤掉不符合的VolumeSnapshot实例,并使用具有指数退避的工作队列处理这些事件。

    • 对于动态创建的快照,它应该关联某个VolumeSnapshotClass。用户可以在VolumeSnapshot API对象中显式指定VolumeSnapshotClass。如果用户未指定VolumeSnapshotClass,则将使用admin创建的默认VolumeSnapshotClass。这和使用默认的StorageClass来配置PersistentVolumeClaim相似。

    • 对于静态绑定快照,user/admin必须为VolumeSnapshot和VolumeSnapshotContent正确指定双向指针,以便控制器知道如何绑定它们。否则,如果VolumeSnapshot指向不存在的VolumeSnapshotContent,或者是VolumeSnapshotContent并未指向VolumeSnapshot,则将VolumeSnapshot设置为错误状态。

    • 针对每一个CSI卷插件,external-snapshotter、external-attacher和external-provisioner运行在同一个sidecar中。

    • 在当前设计中,当存储系统无法创建快照时,将不会在控制器中执行重试。这是因为当快照创建的时间很重要时,用户可能不想在获取一致性快照或计划快照时重试。在将来的版本中,将添加maxRetries标志或重试终止时间戳,以允许用户控制是否需要重试。

K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(上)的更多相关文章

  1. K8S 1.12大特性最快最深度解析:Kubernetes CSI Snapshot(下)

    ​Kubernetes CSI Snapshot(下篇) 目标目前在Kuberentes中,卷插件仅支持配置空的存储卷.随着新的存储功能(包括卷快照和卷克隆)的提出,因此需要支持配置卷时数据填充以.例 ...

  2. HTML5在移动端开发的12大特性

    1.离线缓存为HTML5开发移动应用提供了基础 HTML5 Web Storage API可以看做是加强版的cookie,不受数据大小限制,有更好的弹性以及架构,可以将数据写入到本机的ROM中,还可以 ...

  3. 有了这 4 大特性,CDN 好用到飞起

    随着 CDN 市场的快速发展和网络新技术的不断涌现,目前的 CDN 已不仅仅是当初简单的内容分发,同时也是新特性研发.新技术推广及实践的平台.这些新技术.新特性,或者能够保障 CDN 安全性,或是提升 ...

  4. 前端开发者不得不知的es6十大特性(转)

    转载自AlloyTeam:http://www.alloyteam.com/2016/03/es6-front-end-developers-will-have-to-know-the-top-ten ...

  5. 不得不知的ES6十大特性

    ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率. 本文主要针对ES6做一个简要介绍. 主 ...

  6. jdk8十大特性并代码demo(转)

    一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 5.引入重复注解 6.类型注解 7.最新的Da ...

  7. ES6十大特性

    本文主要针对ES6做一个简要介绍. 主要译自:  http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...

  8. AngularJS-chapter1-2-四大特性

    4大特性 MVC MVC实例  数据模型,控制器,视图 HelloAngular_MVC.html 图中的 ng-controller="HelloAngular"  定义了Hel ...

  9. UFT\QTP 12 新特性

    UFT\QTP 12 新特性 http://blog.csdn.net/testing_is_believing/article/details/22310297

随机推荐

  1. LODOP打印table不切行TableRowThickNess

    不切行的调整方法有三种:1.简单表格,不嵌套合并等,可以用ADD_PRINT_TABLE输出,该 语句不切行,相关博文:LODOP设置超文本不自动分页的方法.2.进入打印设计,调整打印项到合适的高度, ...

  2. Flutter状态管理之provide和provider的使用区别

    说道状态管理不得不说谷歌的亲自开发的两款状态管理Widget:第一个是provide,第二个是provider. 这两个的区别就是一个出来的早,现在好像没整么更新了.第二个是2019才出来的目前的版本 ...

  3. 【OpenGL开发】关于GLEW扩展库

    GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口.使用OpenGL的朋友都知道,window目前只支持OpenGL1.1的涵数,但 OpenGL现在都发展到2.0以上了,要使用这些Open ...

  4. pv回收

    学习cloudman中的k8s 152课,创建pod时,需要在k8s-host2 中挂着到在k8s-master 中/nfs中创建的挂载目录,结果提示没有/nfs/pv1 root@k8s-maste ...

  5. servlet02

    内容  1servlet   2HTTP协议  3Request servlet继承的体系结构   抽象类 | GenericServlet:将servlet接口中其他方法默认空实现,只将servic ...

  6. ASP.NET请求过程-视图如何返回客户端

    本文主要讲控制器返回ActionResult后怎么变成html到客户端的. 控制器返回的各种类型 返回所有类型的基类ActionResult // // 摘要: // 表示操作方法的结果. publi ...

  7. Prometheus入门到放弃(1)之Prometheus安装部署

    规划: IP 角色 版本 10.10.0.13 prometheus-server 2.10 10.10.0.11 node_exporter 0.18.1 10.10.0.12 node_expor ...

  8. Python类和实例调用

    self指向的是实例对象,作为第一个参数,使用时不需要传入此参数. class Student(object): #定义一个Student类, def __init__(self, name, sco ...

  9. 打开python 交互式模式

    pip install jupyter jupyter notebook --ip=127.0.0.1 --port=8888

  10. python离线安装外部库(第三方库)

    在官网下好外部库,解压后,点击解压后的文件夹,按住shift 右击在命令行中执行 输入 python setup.py install