Kubernetes 1.6新特性系列 | 动态配置和存储类

导读:
Dynamic Provisioning的目标是完全自动化存储资源的生命周期管理,让用户无需过多的关注存储的管理,可以按需求自动动态创建和调整存储资源。StorageClass本质上是底层存储介质的抽象:不同的存储介质拥有统一的表示和行为。

作者注:这是五天深入理解Kubernetes新特性系列的第一篇。

存储(Storage)是运行有状态容器的关键要素,Kubernetes提供了强大的原语来管理存储。动态卷配置(Dynamic provisioning)是Kubernetes的独有功能,它可以根据需要动态的创建存储卷。在动态配置之前,集群管理员必须手动调用云/存储服务提供商的接口来配置新的存储卷,然后创建PersistentVolume对象以在Kubernetes中表示和使用他们。通过动态配置,可以实现两个步骤的自动化,无须集群管理员预先配置存储资源,而是使用StorageClass对象制定的供应商来动态配置存储资源,具体请参考用户指南)。StorageClass本质上是为底层存储提供者描绘了蓝图,以及各种参数,例如磁盘类型(例如固态和标准磁盘)。

StorageClasses使用特定的存储平台或者云提供商为Kubernetes提供物理介质。多个存储配置以in-tree的形式(用户手册),但现在也支持out-of-tree配置器(请参阅kubernetes-incubator)。

在Kubernetes 1.6正式版中,动态配置被提升至稳定版(Kubernetes 1.4是Beta)。这是完成Kubernetes存储自动化愿景的一大重要进步,它允许集群管理员控制资源的配置,也能够让用户更好地专注应用开发。这些所有的有点,在使用Kubernetes 1.6之前,这些面向用户的变化都是非常重要的。

1、怎么使用Storage Classes

StorageClass是Dynamic Provisioning(动态配置)的基础,允许集群管理员位底层存储平台做定义抽象。用户只需在PersistentVolumeClaim(PVC)通过名字引用StorageClass即可。

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

 storageClassName: gold

为了促进Dynamic Provisioning的使用,此功能允许集群管理指定默认的StorageClass。当Dynamic Provisioning存在时,用户可以创建一个PVC而不需要制定一个StorageClassName,进一步减少了用户用于关注底层存储提供者所需的精力。当使用默认的StorageClasses时,创建PersistentVolumeClaims(PV),这一点尤为重要:

  • Kubernetes 1.6中,已经跟PVCs绑定的PVs依然保持绑定:
    • 除非用户手动添加他们,否则,他们将不具有与他们相关联的StorageClass
    • 如果PV变为“可用”,如果删除的PVC和对应的PV被回收,则它要接受如下约束:
  • 如果PVC中未指定StorageClassName,则默认的StorageClass将用于动态配置(Dynamic Provisioning)。
    • 如果存在并且“可用”,没有StorageClass标签的PV将不被考虑用于绑定到PVC
  • 如果在PVC中将StorageClassName设置为空字符串(“”),则不会使用存储类。(即:此PVC禁止使用动态配置)
    • 如果存在并且“可用”,PVs(没有指定StorageClassName),将被考虑用于绑定到PVC
  • 如果StorageClassName设置为特定值,则将使用与之匹配的存储类。
    • 如果存在并且“可用”,匹配到StorageClassNamePV将被考虑用于绑定到PVC
    • 如果不存在对应的存储类,PVC将失败。

为了减轻集群中默认StorageClasses的负担,从Kubernetes 1.6开始,Kubernetes为多个云提供商安装(通过add-on管理器)默认的StorageClasses。要使用这些默认的StorageClasses,用户不需要按名称引用他们,也就是说,不需要在PVC中指定StorageClassName,便可直接使用。

下面的表格显示不同的云提供商预安装的默认StorageClasses:

云提供商 默认StorageClasses Name 默认存储
Amazon Web Services gp2 aws-ebs
Microsoft Auzer standard azure-disk
Google Cloud Platform standard gcd-pd
OpenStack standard cinder
VMware vSphere thin vsphere-volume

对于大多数用户来说,选择使用每个云提供商默认的提供的存储是“理智的”,如果想指定自己使用的默认存储方式,请参考用户手册。

2、动态配置卷和回收策略

所有的PVs都有一个与之关联的回收策略,规定PV一旦从声明中解除后会发生什么(请参考用户指南)。由于自动化存储资源的生命周期管理,因此动态配置卷(Dynamic Provisioning Volume)的默认回收策略为“删除”。这意味着当PersistentVolumeClaim(PVC)被释放时,动态配置卷会被相应的删除,并且可能数据无法恢复。如果这不是所预期的行为,则在设置卷后,用户必须在相应的PersistentVolume(PV)对象上更改回收策略。

如何设置回收策略?

您可以通过修改PV对象中的persistentVolumeReclaimPolicy字段的值来修改PV的回收策略。更多的细节和不同的回收策略请参考用户手册。

3、FAQs

A、如何使用默认的StorageClass?

如果您的集群有一个默认的StorageClass能够满足您的需求,那么您剩下所有需要做的就是创建PersistentVolumeClaim(PVC),剩下的都有默认的动态配置搞定,包括您无需去指定storageClassName:

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

B、能添加自己的StorageClass吗?

当然可以。在添加自己的StorageClass之前,需要先确定动态配置能否在集群上工作。然后,创建一个StorageClass对象并通过设置参数来定制它。对很多用户来说,最简单的创建对象的方式就是通过编写一个yaml文件并通过kubectl create -f来创建。

下面的创建StorageClass的例子使用了Google Cloud Platform,创建了一个pd-ssd,名称为gold:

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

 name: gold

provisioner: kubernetes.io/gce-pd

parameters:

 type: pd-ssd

由于集群中可以存在多个类,因此管理员可以为大多数工作负载保存默认值(因为它使用pd-standard),为需要额外的工作负载保留gold类。

C、是否已经安装了默认的StorageClass?

您可以使用kubectl命令检查StorageClass对象。在下面的例子中有两个StorageClass:gold和standard。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

Events:         <none>

D、能过删除/关闭默认的StorageClass?

您不能删除默认的StorageClass,因为它是作为集群的add-on安装的,如果它被删除,会被重新安装。

当然,您可以停掉默认的StorageClass行为,通过删除annotation:storageclass.beta.kubernetes.io/is-default-class。

如果没有StorageClass对象标记默认的annotation,那么PersistentVolumeClaim对象(在不指定StorageClass情况下)将不自动触发动态配置。相反,它们将回到绑定可用的*PersistentVolume(PV)*的状态。

E、能否将PVs与一个特殊的StorageClass绑定?

可以。通过改变PV对象的storageClassName字段,可以将一个StorageClass与这个PV绑定。

F、当删除PersistentVolumeClaim(PVC)会发生什么?

如果一个卷是动态配置的卷,则默认的回收策略为“删除”。这意味着,在默认的情况下,当PVC被删除时,基础的PV和对应的存储也会被删除。如果需要保留存储在卷上的数据,则必须在PV被设置之后将回收策略从delete更改为retain。

作者及原文链接

作者:Saad Ali & Michelle Au, Software Engineers, and Matthew De Lio, Product Manager, Google

原文:http://blog.kubernetes.io/2017/03/dynamic-provisioning-and-storage-classes-kubernetes.html

20161219151628

译者微信公众号推荐