k8s教程(Volume篇)-StorageClass详解

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

在上一篇博客《k8s教程(Volume篇)-PVC详解》,我们了解了PVC是作为用户对存储资源的需求申请,本文继续深入学习StorageClass

02 StorageClass详解

2.1 StorageClass概念

StorageClass作为对存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的工作,由系统自动完成PV的创建和绑定,实现动态的资源供应。基于StorageClass的动态资源供应模式将逐步成为云平台的标准存储管理模式。

2.2 StorageClass定义

StorageClass 资源对象的定义主要包括:名称后端存储的提供者 (provisioner)后端存储的相关参数配置和回收策略StorageClass的名称尤为重要,将在创建 PVC时引用,管理员应该准确命名具有不同存储特性的 StorageClass)。

StorageClass 一旦被创建,则无法修改,如需更改,则只能删除原 StorageClass资源对象并重新创建

下例定义了一个StorageClass,名称为standard, provisioner为aws-ebs, type为gp2,回收策略为Retain等:

apiVersion: storage.k8s.io/v1 
kind: StorageClass 
metadata:
	name: standard
provisioner: kubernetes.io/aws-ebs 
parameters:
	type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true 
mountOptions:
	- debug
volumeBindingMode: Immediate

StorageClass资源对象需要设置的关键配置参数如下:

2.2.1 存储提供者 (Provisioner)

描述存储资源的提供者,用于提供具体的PV资源,也可以将其看作后端存储驱动。

目前,Kubernetes内置支持的Provisioner包括:AWSElasticBlockStoreAzureDiskAzureFileCinder ( OpenStack Block Storage ) Flocker GCEPersistentDiskGlusterFSPortworx Volume Quobyte VolumesRBD (Ceph Block Device)ScaleIOStorageOSVsphereVolume

Kubernetes内置支持的Provisioner的命名都以“kubernetes.io/“开头,用户也可以使用自定义的后端存储提供者。

为了符合 StorageClass的用法,自定义 Provisioner需要符合存储卷的开发规范,外部存储供应商的作者对代码、提供方式、运行方式、存储插件(包括Flex)等具有完全的自由控制权

目前,在 Kubernetes 的kubernetes-sigs/sig-storage-lib-external-provisioner库中维护外部 Provisioner 的代码实现,其他一些 Provisioner 也在 kubernetesincubator/external-storage库中进行维护。

例如,对NFS类型,Kubernetes没有提供内部的Provisioner,但可以使用外部的Provisioner。也有许多第三方存储提供商自行提供外部的Provisioner。

2.2.2 资源回收策略 (Reclaim Policy)

通过动态资源供应模式创建的PV将继承在StorageClass资源对象上设置的回收策略,配置字段名称为“reclaimPolicy“,可以设置的选项包括Delete(删除)和 Retain(保留)。

如果StorageClass没有指定reclaimPolicy,则默认值为Delete。

对于管理员手工创建的仍被StorageClass管理的PV,将使用创建PV时设置的资源回收策略。

2.2.3 是否允许存储扩容 (Allow Volume Expansion)

PV 可以被配置为允许扩容,当 StorageClass 资源对象的 allowVolumeExpansion字段被设置为true时,将允许用户通过编辑PVC的存储空间自动完成PV的扩容。

下表描述了支持存储扩容的Volume类型和要求的Kubernetes最低版本:

支持存储扩容的 Volume 类型 Kubernetes 最低版本
gcePersistentDisk 1.11
awsElasticBlock Store 1.11
Cinder 1.11
glusterfs 1.11
rbd 1.11
Azure File 1.11
Azure Disk 1.11
Portworx 1.13
Flex Volume 1.14 (Alpha)
CSI 1.16 (Beta)

2.2.4 挂载选项 (Mount Options)

通过StorageClass资源对象的mountOptions字段,系统将为动态创建的PV设置挂载选项

并不是所有PV类型都支持挂载选项,如果PV不支持但StorageClass 设置了该字段,则PV将会创建失败。另外,系统不会对挂载选项进行验证,如果设置了错误的选项,则容器在挂载存储时将直接失败。

2.2.5 存储绑定模式 (Volume Binding Mode)

StorageClass资源对象的volumeBindingMode字段设置用于控制何时将PVC与动态创建的PV绑定

目前支持的绑定模式包括: Immediate 和 WaitForFirstConsumer

2.2.5.1 Immediate绑定模式

存储绑定模式的默认值为 Immediate,表示当一个PersistentVolumeClaim (PVC)创建出来时,就动态创建PV并进行PVCPV的绑定操作。

需要注意的是,对于拓扑受限 (Topology-limited) 或无法从全部Node访问的后端存储,将在不了解Pod调度需求的情况下完成PV的绑定操作,这可能会导致某些Pod无法完成调度。

2.2.5.2 WaitForFirstConsumer绑定模式

WaitForFirstConsumer绑定模式表示PVC与PV的绑定操作延迟到第一个使用 PVC的Pod创建出来时再进行。

系统将根据Pod的调度需求,在Pod所在的Node上创建PV,这些调度需求可以通过以下条件(不限于)进行设置:

  • Pod对资源的需求;
  • Node Selector;
  • Pod亲和性和反亲和性设置;
  • Taint和Toleration设置

目前支持 WaitForFirstConsumer 绑定模式的存储卷包括:AWSElasticBlockStore、 AzureDisk、 GCEPersistentDisk.

另外,有些存储插件通过预先创建好的PV绑定支持WaitForFirstConsumer模式,比如AWSElasticBlockStore、 AzureDisk、 GCEPersistentDisk和Local.

在使用WaitForFirstConsumer模式的环境中,如果仍然希望基于特定拓扑信息(Topology)进行PV绑定操作,则在StorageClass的定义中还可以通过 allowedTopologies字段进行设置。

下面的例子通过matchLabelExpressions设置目标Node的标签选择条件 (zone=us-central1-a us-central1-b) PV将在满足这些条件的Node上允许创建:

apiVersion: storage.k8s.io/v1
kind: StorageClass 
metadata:
	name: standard
provisioner: kubernetes.io/gce-pd 
parameters:
	type: pd-standard
volumeBindingMode: WaitForFirstConsumer 
allowedTopologies:
- matchLabelExpressions:
 - key: failure-domain.beta.kubernetes.io/zone 
   vallues:
   - us-central1-a
   - us-central1-b

2.2.6 存储参数 (Parameters)

后端存储资源提供者的参数设置,不同的Provisioner可能提供不同的参数设置。某些参数可以不显示设定,Provisioner将使用其默认值

目前StorageClass资源对象支持设置的存储参数最多为512个,全部keyvalue所占的空间不能超过 256KiB

下面举常见存储提供商(Provisioner)提供的StorageClass存储参数示例(以AWSElasticBlockStore存储卷为例子):

kind: StorageClass
apiVersion: storage.k8s.io/v1 
metadata:
	name: slow
provisioner: kubernetes.io/aws-ebs 
parameters:
	type: io1
	iopsPerGB: "10"
	fsType: ext4

可以配置的参数如下(详细说明请参考AWSElasticBlockStore文档):

  • type:可选项为io1、gp2、 sc1、 st1,默认值为gp2;
  • iopsPerGB:仅用于io1类型的Volume,意为每秒每GiB的I/O操作数量;
  • fsType:文件系统类型,默认值为ext4;
  • encrypted:是否加密;
  • kmsKeyld:加密时使用的Amazon Resource Name;

2.2.7 设置默认的StorageClass

在Kubernetes 中,管理员可以为有不同存储需求的PVC创建相应的 StorageClass来提供动态的存储资源(PV)供应,同时在集群级别设置一个默认的StorageClass,为那些未指定StorageClassPVC使用。当然,管理员要明确系统默认提供的StorageClass应满足和符合PVC的资源需求,同时注意避免资源浪费。

要在集群中启用默认的StorageClass,就需要在kube-apiserver服务准入控制器--enableadmission-plugins中开启 DefaultStorageClass(从 Kubernetes 1.10版本开始默认开启):

--enable-admission-plugins=.. ., DefaultStorageClass

然后,在StorageClass的定义中设置一个annotation:

kind: Storageclass
apiVersion: storage.k8s.io/v1 
metadata:
	name: gold
annotations:
	storageclass.beta.kubernetes.io/is-default-class="true" 
provisioner: kubernetes.io/gce-pd
parameters:
	type: pd-ssd

03 文末

本文主要讲解了StorageClass的一些概念及用法,希望能帮助到大家,谢谢大家的阅读,本文完!

猜你喜欢

转载自blog.csdn.net/qq_20042935/article/details/129883925