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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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有一个正确的认识。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7月前
|
存储 Kubernetes 应用服务中间件
Kubernetes(k8s)容器编排数据存储
Kubernetes(k8s)容器编排数据存储
85 0
|
6月前
|
存储 Kubernetes 文件存储
Kubernetes跨StorageClass迁移,切换Rainbond默认SC
在原生的 Kubernetes 集群中,通过 StorageClass 创建的 PVC 是无法修改存储后端的,需要将 PV、PVC 删除后通过新的 StorageClass 创建新的 PVC,然后再将数据迁移,再重新挂载 PVC。当有很多个 PVC 时,需要多次重复的操作。 而 Rainbond 虽然也是通过 StorageClass 创建的 PVC,但相比原生 Kubernetes 省去了创建 PV、PVC 和重新挂载的步骤,以及重复性的操作。在 Rainbond 中只需要将底层存储类更换,然后迁移 Rainbond 所创建的一整个目录,最后重新在页面中修改挂载即可完成迁移。
|
8月前
|
存储 Unix 应用服务中间件
k8s--数据存储、HostPath、NFS 存储
k8s--数据存储、HostPath、NFS 存储
|
4月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
117 0
|
4月前
|
存储 Kubernetes 关系型数据库
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
kubernetes学习之持久化存储StorageClass(4---nfs存储服务)
46 0
|
4月前
|
存储 Kubernetes 调度
k8s教程(Volume篇)-StorageClass详解
k8s教程(Volume篇)-StorageClass详解
134 0
|
7月前
|
存储 Kubernetes 应用服务中间件
大白话说明白K8S的PV / PVC / StorageClass(理论+实践)
本文主要通过大白话说明白PV、PVC的概念和原理,再说说StorageClass的作用,最后通过实践加深理解。
大白话说明白K8S的PV / PVC / StorageClass(理论+实践)
|
8月前
|
存储 Kubernetes 容器
k8s--数据存储、PV、PVC
k8s--数据存储、PV、PVC
|
8月前
|
存储 应用服务中间件 nginx
k8s--数据存储、EmptyDir存储
k8s--数据存储、EmptyDir存储
|
存储 运维 Kubernetes
【k8s的持久化存储】PV、PVC、StorageClass讲解(二)
【k8s的持久化存储】PV、PVC、StorageClass讲解(二)
【k8s的持久化存储】PV、PVC、StorageClass讲解(二)