背景

许多存储系统提供了创建存储卷“快照”(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. MySQL之忘记root重置方法

    参考:https://help.aliyun.com/knowledge_detail/42520.html MySQL忘记了root登录密码需要重置 1,修改配置文件 一般配置文件路径为/etc/m ...

  2. APP排查内存泄漏最简单和直观的方法

        内存泄漏无疑会严重影响用户体验,一些本应该废弃的资源和对象无法被释放,导致手机内存的浪费,app使用的卡顿,那么如何排查内存泄漏呢? 当然,首先我们有google的官方文档可以参考,大部分博客 ...

  3. stochastic noise and deterministic noise

    在机器学习中,导致overfitting的原因之一是noise,这个noise可以分为两种,即stochastic noise,随机噪声来自数据产生过程,比如测量误差等,和deterministic ...

  4. Linux 缺少 mime.types 文件 mailcap

    问题描述: 一个项目当中使用的是 ossfs 挂载的一个 oss,在系统上传附件时,比如图片或视频时, 它的头信息为,application/octet-stream,上传后直接为二进制文件,访问的话 ...

  5. LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22

    171. Excel表列序号 171. Excel Sheet Column Number 题目描述 给定一个 Excel 表格中的列名称,返回其相应的列序号. 每日一算法2019/5/25Day 2 ...

  6. springMVC设置不拦截静态资源的方法

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...

  7. Word 查找替换高级玩法系列之 -- 通配符大全A篇

    1. 通配符大全一览 序号 特殊字符(不使用通配符) 代码(不使用通配符) 特殊字符(使用通配符) 代码(使用通配符) 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^### 任意数字(单个 ...

  8. Django 在admin中自定义app名

    前提条件,注册时是: 完整的注册,不是直接用app名进行注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'dj ...

  9. PAT(B) 1094 谷歌的招聘(Java)

    题目链接:1094 谷歌的招聘 (20 point(s)) 题目描述 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com ...

  10. drbd+nfs+keepalived

    写的很详细 理论知识: https://www.cnblogs.com/kevingrace/p/5740940.html 写的很详细 负载: https://www.cnblogs.com/kevi ...