原文地址:http://blog.fleeto.us/translation/dynamic-provisioning-and-storage-classes-kubernetes-0?utm_source=tuicool&utm_medium=referral

有状态容器的工作过程中,存储是一个关键问题,Kubernetes 对存储的管理提供了有力的支持。Kubernetes 独有的动态卷供给特性,实现了存储卷的按需创建。在这一特性面世之前,集群管理员首先要给云供应商或者存储供应商致电,来申请新的存储卷,然后创建持久卷(PersistentVolue),使其在 Kubernetes 中可见。而动态卷供给功能则实现了这两个步骤的自动化,让管理员无需再进行存储卷预分配。存储资源会依照 StorageClass 定义的方式进行供给。StorageClass 是对底层存储资源的抽象,包含了存储相关的参数,例如磁盘类型(标准类型和 SSD)。

StorageClass 的多种供给者(Previsioner),为 Kubernetes 提供了针对特定物理存储或云存储的访问能力。目前提供了多种开箱即用的存储支持,另外还有一些在 Kubernetes 孵化器中提供的其他存储支持。

在 Kubernetes 1.6 中,动态卷供给提升为稳定版(1.4 开始进入 Beta 版)。这在 Kubernetes 的存储自动化过程中是很重要的一步,让管理员能够控制资源的供给方式,让用户能够更专注于自己的应用。在上面提到的益处之外,在升级到 Kubernetes 1.6 之前,还需要了解一下这里涉及到的针对用户方面的变更。

Storage Class,定义和用法

StorageClass 是动态存储供给的基础,让集群管理员能够对底层存储进行抽象描述。而用户在 PVC (PersisitantVolumeClaim 持久卷申请)中指需要使用 "storageClassName" 参数就可以指定所需引用的 StorageClass。

下面的例子中,PVC 使用了一个名为 'gold' 的存储类。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: testns
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
storageClassName: gold

管理员可以制定一个缺省的 StorageClass,有了缺省存储类的定义,用户就可以无需指定 storageClassName 直接创建 PVC,这样同时也减少了用户对底层存储进行理解的需要。在使用缺省 StorageClass 时,对 PVC 的操作有些细节需要注意。这些细节对于复用现有 PV (持久卷)是非常重要的。

  • 在升级 1.6 的时候,已经处于 Bound 状态的 PV 状态不变

    • 如果用户没有指定存储类,他也不会有关联的存储类。
    • 如果 PV 转为 "Available" 状态(例如删除了关联的 PVC 导致 PV 回收),则会按照下面的规则进行处理。
  • 如果没有给 PVC 指定 storageClassName,会使用缺省的 StorageClass。
    • 现有的没有指定缺省 Storage Class 标签 "Available" 状态的 PV,不会分配给 PVC。
  • 如果 PVC 中给 storageClassName 赋值为空字符串(""),就不会使用 Storage Class(就是说,动态卷供给功能无效)
    • 现有的 “Available” PV(没有指定 storageClassName)会被判定为可以帮到到这个 PVC。
  • 如果把 storageClassName 设置为一个特定的值,就会使用对应的存储类。
    • 已有的 “Available” 的属于该 storageClassName 的 PV 会被判定可以用于该 PVC。
    • 如果不存在对应的 Storage Class,则会导致该 PVC 的失败。

null 和 '' 的区别吧。

为了降低设置缺省 StorageClass 的负担,从 1.6 开始 Kubernetes 会使用 add-on manager 自动安装多个云提供商对应的 Storage Class,用户无需对其进行指派就可以在 PVC 中进行使用。

下表描述了不同云供应商所对应的缺省安装的 Storage Class。

云供应商 缺省的 StorageClass 名称 缺省的存储供给
Amazon Web Services gp2 aws-ebs
Microsoft Azure standard azure-disk
Google Cloud Platform standard gce-pd
OpenStack standard cinder
VMware vSphere thin vsphere-volume

上表描述的内容是符合多数用户的需要的。 另外还可以指定自己的缺省存储类: https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class

动态卷供给的回收策略

所有的 PV 都有各自的回收策略,这些策略决定了一个 PV 在被释放的时候的行为。因为动态卷供给功能的目的是自动化完成存储资源的整个生命周期,动态供给卷缺省的回收策略就是删除。这一位置,当一个 PVC 释放的时候,对应的动态供给卷就会从存储供应者这里进行删除。如果这不符合我们的需要,用户必须在卷供给之后定义该 PV 的回收策略。

如何变更动态供给卷的的回收策略

可以编辑 PV 对象的 persistentVolumeReclaimPolicy 字段,来对回收策略进行变更。

参考:https://kubernetes.io/docs/user-guide/persistent-volumes/#reclaim-policy

FAQ

如何使用缺省的 StorageClass

如果你的集群有符合需要的 StorageClass,然后你只需要使用 PVC,其他的工作就可以交给卷供给功能。这里不需要指定 storageClassName。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: testns
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi

我能添加自己的 Storage Class 么?

是的,要创建自己的 Storage Class,首先要决定的是在集群中使用何种存储。接下来,创建一个 StorageClass 对象,调整参数使之适应具体需求。对大多数用户来说,创建这一对象的最简单方式就是编写一个 yaml 文件,然后使用 kubectl create -f。接下来的例子是 Google Cloud Platform 里创建一个名为 "gold" 的类型为 "pd-ssd" 的 Storage Class。因为系统中存在多个 Storage Class,管理员希望多数工作负载使用缺省的 Storage Class("pd-standard")。“gold” 可以用于对性能要求较高的工作负载。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gold
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd

我怎么检查缺省安装的 StorageClass ?

可以利用 kubectl 来完成这一任务。在下面的例子中会看到,有 "gold" 和 "standard" 两个 Storage Class。"gold" 是自定义的,"standard" 是由 Kubernetes 安装并设为缺省的。

$ kubectl get sc
NAME TYPE
gold kubernetes.io/gce-pd
standard (default) kubernetes.io/gce-pd
$ kubectl describe storageclass standard
Name: standard
IsDefaultClass: Yes
Annotations: storageclass.beta.kubernetes.io/is-default-class=true
Provisioner: kubernetes.io/gce-pd
Parameters: type=pd-standard

我能删除/关闭缺省的 Storage Class 么?

缺省的 Storage Class 是无法删除的。这些 Storage Class 是作为集群 Addons 安装的,如果被删除,他们会自动创建。

然而可以通过移除一个注解,来禁用“缺省”行为:storageclass.beta.kubernetes.io/is-default-class

如果所有的 StorageClass 对象都没有被注解为缺省,那么没有指定 StorageClass 的 PVC 就无法触发自动供给,只能降级使用旧式的 PV 对象。

我能把现有的 PV 指定为某种 StorageClass 么?

是的,可以用编辑对象的方式,,给现存 PV 添加一个 storageClassName 字段,来为其指派 StorageClass。

删除一个 PVC 会发生什么?

如果一个卷是动态供给的,缺省的回收策略就是 “delete”,也就是删除。这就意味着缺省情况下,PVC 如果被删除,下面关联的 PV 和存储也会被删除。如果想要保留卷上的数据,必须在 PV 供给之后把回收策略从 "delete" 改为 "retain"。

Kubernetes (1.6) 中的存储类及其动态供给的更多相关文章

  1. or1200中载入存储类指令说明

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的载入存储类指令有8条,每条指令的作用与说明如表9.1所看到的. watermark/2/text/aHR0cDo ...

  2. C Primer Plus之存储类、链接和内存管理

    存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个 ...

  3. C中存储类、链接和内存管理

    在C语言中,有5种不同的存储类型,即存储类.在介绍存储类之前,需要首先简单介绍几个术语.如下: 作用域:描述程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用 ...

  4. union 中可以存储的是不带构造函数的类对象

    union 中可以存储的是不带构造函数的类对象 否则不符合逻辑 为什么不符合逻辑?

  5. 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式

    一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...

  6. Android中数据存储(一)

    国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...

  7. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

  8. [转]mvc3 使用session来存储类来存储用户登陆信息

    mvc3 使用session来存储类来存储用户登陆信息 2013-08-26 09:48:56|  分类: NET开发 |举报 |字号 订阅   项目之前的登陆机制是这样的:用户登陆后初始化一个类,类 ...

  9. 【C语言学习笔记】存储类、链接和内存管理

    因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容.在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把 ...

随机推荐

  1. 快速开发基于 HTML5 网络拓扑图应用

    采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...

  2. 为什么导入数据库要加入set names utf-8

    Repinted:http://blog.csdn.NET/class1/archive/2006/12/30/1469298.aspx 为了让你的网页能在更多的服务器上正常地显示,还是加上" ...

  3. 【BZOJ】3028: 食物

    http://www.lydsy.com/JudgeOnline/problem.php?id=3028 题意: 每种食物的限制如下:汉堡:偶数个:可乐:0个或1个鸡腿:0个,1个或2个蜜桃:奇数个鸡 ...

  4. 安卓发展史以及安卓和苹果对比PPT

    此PPT由我们小组协力完成,介绍了Android的发展史以及android与苹果的一些比较.概述了android发展至今的一系列版本,功能的日益完善,它的强大性,灵活性,公开性使其拥有吸引客服的绝大魅 ...

  5. 深入分析C++引用

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 关于引用和指针的差别的文章非常多非 ...

  6. JSP(二)

    一.pageContext对象    1>代表当前JSP页面的运行环境, [作用域仅仅局限于当前JSP页面中,出了该JSP页面, 原PageContext域对象被销毁]    2>封装了对 ...

  7. Windows 系统消息范围和前缀,以及消息大全

    Windows系统定义的消息类别消息标识符前缀 消息分类ABM 应用桌面工具栏消息BM 按钮控件消息CB 组合框控件消息CBEM 扩展组合框控件消息CDM 通用对话框消息DBT 设备消息DL 拖曳列表 ...

  8. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)

    原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...

  9. EJB到底是什么

    EJB到底是什么?   1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业 ...

  10. 基于Two.js实现的一个小demo,星球环绕动画效果

    下面是核心js code HTML就不贴了,需要引入two.js文件: var elem = document.getElementById('draw-animation'); var two = ...