您现在的位置是:首页 >技术杂谈 >storageclass详解网站首页技术杂谈
storageclass详解
storageclass概念
StorageClass作为对存储资源的抽象定义,对用户设置的PVC
申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的工作,由系统自动完成PV的创建和绑定,实现动态的资源供应。基于StorageClass的动态资源供应模式将逐步成为云平台的标准存储管理模式。
storageclass定义
StorageClass 资源对象的定义主要包括:名称、后端存储的提供者 (provisioner)、后端存储的相关参数配置和回收策略(StorageClass
的名称尤为重要,将在创建 PVC
时引用,管理员应该准确命名具有不同存储特性的 StorageClass
)。
注意:StorageClass 一旦被创建,则无法修改,如需更改,则只能删除原 StorageClass资源对象并重新创建。
如下为storageclass举例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
annotations:
storageclass.beta.kubernetes.io/is-default-class="true" ###设置为默认的存储类型
provisioner: fuseim.pri/ifs ####上述定义的provisioner 名称
parameters:
type: nfs
reclaimPolicy: Retain ###删除;类型
allowVolumeExpansion: true ####允许扩容
mountOptions:
- debug
volumeBindingMode: Immediate ##pv和pvc绑定
参数解释如下:
- 存储提供者 (Provisioner)
描述存储资源的提供者,用于提供具体的PV资源,也可以将其看作后端存储驱动。
目前,Kubernetes内置支持的Provisioner包括:AWSElasticBlockStore、 AzureDisk 、 AzureFile、 Cinder ( OpenStack Block Storage ) Flocker GCEPersistentDisk、 GlusterFS、 Portworx Volume、 Quobyte Volumes、 RBD (Ceph Block Device)、 ScaleIO、 StorageOS、 VsphereVolume。
Kubernetes内置支持的Provisioner的命名都以“kubernetes.io/“开头,用户也可以使用自定义的后端存储提供者。以上例子中provisioner
名称为自定义fuseim.pri/ifs
-
资源回收策略 (Reclaim Policy)
通过动态资源供应模式创建的PV将继承在StorageClass资源对象上设置的回收策略,配置字段名称为“reclaimPolicy
“,可以设置的选项包括Delete
(删除)和Retain
(保留)。
如果StorageClass没有指定reclaimPolicy,则默认值为Delete。
对于管理员手工创建的仍被StorageClass管理的PV,将使用创建PV时设置的资源回收策略。 -
是否允许存储扩容 (Allow Volume Expansion)
allowVolumeExpansion: true
PV 可以被配置为允许扩容,当 StorageClass 资源对象的 allowVolumeExpansion字段被设置为true时,将允许用户通过编辑PVC的存储空间自动完成PV的扩容。
- 挂载选项 (Mount Options)
通过StorageClass资源对象的mountOptions字段,系统将为动态创建的PV设置挂载选项。
并不是所有PV类型都支持挂载选项,如果PV不支持但StorageClass 设置了该字段,则PV将会创建失败。另外,系统不会对挂载选项进行验证,如果设置了错误的选项,则容器在挂载存储时将直接失败。
- 存储绑定模式 (Volume Binding Mode)
StorageClass资源对象的volumeBindingMode字段设置用于控制何时将PVC与动态创建的PV绑定。
目前支持的绑定模式包括: Immediate 和 WaitForFirstConsumer。
Immediate:
存储绑定模式的默认值为 Immediate,表示当一个PersistentVolumeClaim (PVC)
创建出来时,就动态创建PV
并进行PVC
与PV
的绑定操作
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上允许创建:
allowedTopologies:
- matchLabelExpressions:
- key: failure-domain.beta.kubernetes.io/zone
vallues:
- us-central1-a
- us-central1-b
- 存储参数 (Parameters)
下面举常见存储提供商(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;