k8s教程(Volume篇)-StorageClass详解

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 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的一些概念及用法,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
Kubernetes 应用服务中间件 nginx
百度搜索:蓝易云【使用Kubernetes部署Nginx应用教程】
现在,你已经成功在Kubernetes集群上部署了Nginx应用。通过访问Service的外部IP地址,你可以访问Nginx服务。
57 4
|
2月前
|
Kubernetes Java 容器
部署 Spring Boot 应用到 K8S 教程
部署 Spring Boot 应用到 K8S 教程
125 0
|
4天前
|
Kubernetes Ubuntu jenkins
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
|
12天前
|
Kubernetes 前端开发 微服务
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
|
2月前
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
245 0
|
2月前
|
存储 Kubernetes 数据安全/隐私保护
k8s详细教程(二)
k8s详细教程(二)
181 0
|
2月前
|
Kubernetes 调度 Docker
k8s详细教程(一)
k8s详细教程(一)
163 0
|
2月前
|
Kubernetes Linux 网络安全
百度搜索:蓝易云【K8s在centos7安装及kubectl教程】
希望以上教程对你有所帮助!Kubernetes是一个强大的容器编排平台,能够帮助你更轻松地管理容器化应用程序。如果你有其他问题,请随时继续提问。
73 1
|
2月前
|
Kubernetes Ubuntu Docker
百度搜索:蓝易云【Ubuntu系统搭建K8s集群教程】
现在,你已经在Ubuntu系统上成功搭建了一个Kubernetes集群。记得保留好Kubernetes配置文件以便后续管理。
44 0
|
2月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
179 0