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包括:
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/“开头,用户也可以使用自定义的后端存储提供者。
为了符合 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
并进行PVC
与PV
的绑定操作。
需要注意的是,对于拓扑受限 (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
个,全部key
和value
所占的空间不能超过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
,为那些未指定StorageClass
的PVC
使用。当然,管理员要明确系统默认提供的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的一些概念及用法,希望能帮助到大家,谢谢大家的阅读,本文完!