Kubernetes (1.6) 中的存储类及其动态供给
原文地址: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"。