kubernetes的简单化数据存储StorageClass(建立和删除以及初步使用)(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: kubernetes的简单化数据存储StorageClass(建立和删除以及初步使用)

PV生命周期的各个阶段


◎ Available:可用状态,还未与某个PVC绑定。

◎ Bound:已与某个PVC绑定。

◎ Released:绑定的PVC已经删除,资源已释放,但没有被集群回收。

◎ Failed:自动资源回收失败

◎Terminating:pv已经终结

一般情况下,bound是表示正常的,如果使用了default的StorageClass,那么,pv由于是StorageClass自动启停管理的,因此,Terminating 也是表示正常的。

6、挂载参数(Mount Options)

在将PV挂载到一个Node上时,根据后端存储的特点,可能需要设置额外的挂载参数,可根据PV定义中的mountOptions字段进行设置。本例中没有用到。

(2)pvc


pvc=PersistentVolumeClaim,也是一个缩写,中文意思持久存储需求清单

PVC是用户对存储资源的一个“申请”,就像Pod消费Node资源一样,PVC能够消费PV资源。PVC可以申请特定的存储空间和访问模式。

示例:

[root@master mysql]# cat pvc_mysql.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-pvc-test
  namespace: database
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1.5Gi
  storageClassName: nfs

kubectl apply -f  pvc_mysql.yaml就可以创建这个名叫nfs-pvc-test的pvc。

[root@master mysql]# k get pvc -A
NAMESPACE     NAME                               STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
database      mysql-pvc-test                     Bound    mysql-pv-test                              1Gi        RWO            nfs-provisioner   35h
database      nfs-pvc-test                       Bound    nfs-pv-test                                1536Mi     RWO            nfs               4h35m

可以看到,pvc和命名空间有关了,也自动绑定了nfs-pv-test这个pv了。最后面也提示了使用了StorageClass  ,名称叫nfs。

关键配置


1、资源请求(Resources)

描述对存储资源的请求,目前仅支持request.storage的设置,即是存储空间的大小,本例没有配置

2、访问模式(AccessModes)

用于描述对存储资源的访问权限,与PV设置相同,本例仍然配置的是once

3、存储卷模式(Volume Modes)

用于描述希望使用的PV存储卷模式,包括文件系统和块设备。本例使用的是默认,仍然是filesystem

4、PV选择条件(Selector)

通过对Label Selector的设置,可使PVC对于系统中已存在的各种PV进行筛选。

选择条件可以使用matchLabels和matchExpressions进行设置,如果两个字段都设置了,则Selector的逻辑将是两组条件同时满足才能完成匹配

本例没有配置

5、存储类别(Class)

PVC 在定义时可以设定需要的后端存储的类别(通过storageClassName字段指定),以减少对后端存储特性的详细信息的依赖。只有设置了该Class的PV才能被系统选出,并与该PVC进行绑定

PVC也可以不设置Class需求。如果storageClassName字段的值被设置为空(storageClassName=""),则表示该PVC不要求特定的Class,系统将只选择未设定Class的PV与之匹配和绑定。PVC也可以完全不设置storageClassName字段,此时将根据系统是否启用了名为DefaultStorageClass的admission controller进行相应的操作

本例配置了StorageClass,并且使用的是default。

6、未启用DefaultStorageClass

等效于PVC设置storageClassName的值为空(storageClassName=""),即只能选择未设定Class的PV与之匹配和绑定。

本例中可以指定为非default,比如nfs-sc

[root@master nfs-sc]# k get sc 
NAME              PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs             mynfs                                 Delete          Immediate           true                   4h57m
nfs (default)     nfs                                   Delete          Immediate           true                   4h59m
nfs-provisioner   choerodon.io/nfs-client-provisioner   Delete          Immediate           false                  3d21h
nfs-sc            storage.pri/nfs                       Delete          Immediate           true                   5h45m

二、什么时候需要使用StorageClass


1.关键配置


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

StorageClass的定义主要包括名称、后端存储的提供者(privisioner)和后端存储的相关参数配置。StorageClass一旦被创建,就无法修改,如需修改,只能删除重建。例如,生成一个全新的StorageClass:

[root@master nfs-sc]# cat storageclass-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: mynfs
provisioner: mynfs
reclaimPolicy: Delete
allowVolumeExpansion: True  #允许pvc创建后扩容

关键配置

1、提供者(Privisioner)

描述存储资源的提供者,也可以看作后端存储驱动。

2、参数(Parameters)

后端存储资源提供者的参数设置,不同的Provisioner包括不同的参数设置。某些参数可以不显示设定,Provisioner将使用其默认值。本例使用的是默认配置,没有使用参数。一般也不需要设置参数。

3,allowVolumeExpansion: True  #允许pvc创建后扩容

如果你不确定存储空间是否够用(比如,nfs),请设置为true。

4,reclaimPolicy: Delete 这里还是看自己的需求,delete基本够用,如果对数据比较在意,那么就retain。

2.设置默认的StorageClass


例如,我现有4个StorageClass,通过k get sc -A 命令查出来的:

[root@master nfs-sc]# k get sc -A
NAME              PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs             mynfs                                 Delete          Immediate           true                   5h13m
nfs (default)     nfs                                   Delete          Immediate           true                   5h15m
nfs-provisioner   choerodon.io/nfs-client-provisioner   Delete          Immediate           false                  3d21h
nfs-sc            storage.pri/nfs                       Delete          Immediate           true                   6h

那么,我想设定nfs-sc这个是默认的default,怎么设定呢?

kubectl patch storageclass nfs-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

再次查询:

[root@master nfs-sc]# k get sc -A
NAME               PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs              mynfs                                 Delete          Immediate           true                   5h16m
nfs (default)      nfs                                   Delete          Immediate           true                   5h17m
nfs-provisioner    choerodon.io/nfs-client-provisioner   Delete          Immediate           false                  3d21h
nfs-sc (default)   storage.pri/nfs                       Delete          Immediate           true                   6h3m

这个就不行了,两个default,那么,以后使用肯定会有各种问题了(k8s不知道到底用哪个了嘛),把nfs(default)去掉default,简单:

kubectl patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

再次查询,就达到目的了:

[root@master nfs-sc]# k get sc -A
NAME               PROVISIONER                           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs              mynfs                                 Delete          Immediate           true                   5h18m
nfs                nfs                                   Delete          Immediate           true                   5h20m
nfs-provisioner    choerodon.io/nfs-client-provisioner   Delete          Immediate           false                  3d21h
nfs-sc (default)   storage.pri/nfs                       Delete          Immediate           true                   6h6m

总结


pv,pvc和StorageClass三者的关系是比较紧密的,但还有一些运行规则需要重点提示:

(1)资源供应

k8s支持两种资源的供应模式:静态模式(Static)和动态模式(Dynamic)。资源供应的结果就是创建好的PV。

静态模式:集群管理员手工创建许多PV,在定义PV时需要将后端存储的特性进行设置。

动态模式:集群管理员无需手工创建PV,而是通过StorageClass的设置对后端存储进行描述,标记为某种类型。此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建及与PVC的绑定。PVC可以声明Class为"",说明该PVC禁止使用动态模式。

(2)资源绑定

在定义好PVC之后,系统将根据PVC对存储资源的要求(存储空间和访问模式)在已存在的PV中选择一个满足PVC要求的PV,一旦找到,就将该PV与定义的PVC进行绑定,应用就可以使用这个PVC了。如果系统中没有这个PV,则PVC则会一直处理Pending状态,直到系统中有符合条件的PV。PV一旦绑定到PVC上,就会被PVC独占,不能再与其他PVC进行绑定。当PVC申请的存储空间比PV的少时,整个PV的空间就都能够为PVC所用,可能会造成资源的浪费。如果资源供应使用的是动态模式,则系统在为PVC找到合适的StorageClass后,将自动创建一个PV并完成与PVC的绑定。

(3)资源使用

Pod使用Volume定义,将PVC挂载到容器内的某个路径进行使用。Volume的类型为Persistent VolumeClaim,在容器挂载了一个PVC后,就能被持续独占使用。多个Pod可以挂载到同一个PVC上。

volumes:
  - name: pv
    persistentVolumeClaim:
      claimName: pvc

4)资源释放

当存储资源使用完毕后,可以删除PVC,与该PVC绑定的PV会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被保留在存储设备上,只有在清除之后该PV才能被再次使用。

(5)资源回收

对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用。

在静态资源供应模式下,通过PV和PVC完成绑定,并供Pod使用的存储管理机制

在动态资源供应模式下,通过StorageClass和PVC完成资源动态绑定(系统自动生成PV),并供Pod使用的存储管理机制。

(6)

如果,启用DefaultStorageClass要求集群管理员已定义默认的StorageClass。如果在系统中不存在默认StorageClass,则等效于不启用DefaultStorageClass的情况。如果存在默认的StorageClass,则系统将自动为PVC创建一个PV(使用默认StorageClass的后端存储),并将它们进行绑定。集群管理员设置默认StorageClass的方法见总结的上面一点,如果管理员将多个StorageClass都定义为default,则由于不唯一,系统将无法为PVC创建相应的PV。

(7)未启用DefaultStorageClass

等效于PVC设置storageClassName的值为空(storageClassName=""),即只能选择未设定Class的PV与之匹配和绑定。

这些规则非常重要,也比较绕口,需要仔细的多加实践,从而对k8s有一个正确的认识。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文介绍了Kubernetes中的`StorageClass`,这是一种用于定义不同存储提供者配置的抽象机制,能够动态生成PersistentVolume(PV),简化存储管理。文中详细描述了如何在K8s集群中配置和使用`StorageClass`,包括搭建NFS服务器、配置RBAC权限、创建StorageClass及关联PVC和Pod的过程,并通过实验验证了动态PV的创建和删除功能。实验环境包含一个Master节点和两个Node节点,以及一台NFS服务器。
|
4月前
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文档详细介绍如何在Kubernetes中使用StorageClass动态创建PersistentVolume (PV),以简化大量PV的手动配置工作。StorageClass作为一种动态存储供给机制,
|
4月前
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
4月前
|
存储 Kubernetes Perl
在K8S中,如何知道Pod的数据存储在哪里?
在K8S中,如何知道Pod的数据存储在哪里?
|
7月前
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
675 0
|
7月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
310 1
|
7月前
|
存储 Kubernetes 关系型数据库
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
148 0
|
7月前
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes—数据存储(二)
Kubernetes—数据存储(二)
47 0
|
7月前
|
存储 Kubernetes 应用服务中间件
Kubernetes—数据存储(一)
Kubernetes—数据存储(一)
59 0
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。

热门文章

最新文章