原文地址: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存储类

    一 .存储类 在理解C的存储类之前,首先要搞懂的概念有:作用域.生存周期.连接属性 C中的存储类说明符实际上是上述属性的不同组合 作用域:一个C变量的作用域可以是 代码块作用域(在函数内部代码块中定义 ...

  4. Kubernetes中的存储(六)

    一.ConfigMap 1,介绍 ConfigMap 功能在 Kuberbetes 1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们 ...

  5. kubernetes存储类与PV与PVC关系及实践

    StorageClass & PV & PVC关系图 Volumes是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们也可以编写自己的存储插件来支持特 ...

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

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

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

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

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

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

  9. k8s教程:Kubernetes集群使用网络存储NFS

    NFS存储 NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功 ...

随机推荐

  1. Vim编辑器基本操作学习(二)

    操作符+位移 x命令可以删除一个字符,4x可以删除4个字符. dw可以删除一个word,w事实上是向后移动一个word的命令:dw可以接上一个任意一个位移命令,它将删除从当前光标开始到位移终点处的文本 ...

  2. request和response的复习

    客户端发来的请求,服务器将请求封装成request对象,包括请求头和请求的数据等.创建response对象,调用Servlet的Service()方法传递这两个参数,使用HttpServlet就是将这 ...

  3. PHP for和foreach的区别

    首先,我们先准备两个用于遍历的数组: $arr1=array(1=>'a', 3=>22, 5=>'b', 4=>'c', 8=>'d'); $arr2=array('a ...

  4. Python极其简单的分布式异步作业管理系统RQ入门

    Python极其简单的分布式异步作业管理系统RQ入门 原创 2017-08-19 lixing 生信人 Python极其简单的分布式异步作业管理系统RQ入门 1. 什么是Job? Job直译过来就是工 ...

  5. 关于No ManagedConnections available within configured blocking timeout异常的解决

    最近由于系统和业务重构需要,需要把线上1亿数据迁移到新库,由于业务变更,新表老表结构有变化,没法直接用dba dump的方式,需要自己写转换程序迁移.今天在调试的时候,碰到一个蛋疼的问题,就是一开始查 ...

  6. mongodb(三)

    索引详讲索引管理空间索引 for(var i = 0 ; i<200000 ;i++){ db.books.insert({number:i,name:i+"book"}) ...

  7. 批处理文件中获取当前所在路径的几种方法,以及写文件到txt

    @echo off setlocal EnableDelayedExpansion echo 当前正在运行的批处理文件所在路径:!cd! pause @echo off echo 当前目录是:%cd% ...

  8. 拼接两个yuv合帧

    http://blog.csdn.net/huahuahailang/article/details/9040847 /**************************************** ...

  9. 第二天:让我们一起来玩玩css精灵(css sprites)

    1.效果图 2.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://ww ...

  10. fdsf

    https://blog.csdn.net/chen_2890/article/details/83757022Elasticsearch环境搭建和介绍(Windows) https://blog.c ...