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 最低版本
gcePersistentDisk1.11
awsElasticBlock Store1.11
Cinder1.11
glusterfs1.11
rbd1.11
Azure File1.11
Azure Disk1.11
Portworx1.13
Flex Volume1.14 (Alpha)
CSI1.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的一些概念及用法,希望能帮助到大家,谢谢大家的阅读,本文完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值