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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: kubernetes的简单化数据存储StorageClass(建立和删除以及初步使用)

前言


k8s有着非常多的新概念,而这些概念使得我们学习k8s需要更多的成本,本文主要就k8s的数据持久化存储涉及到的一些新概念:pv,pvc,sc,svc讨论,从而在实际的生产活动中,更好的用好k8s集群。

一、StorageClass是什么?


先说结论,StorageClass 为管理员提供了描述存储 "类" 的方法,实现了存储的动态供给,简单来说,StorageClass能够根据pvc来自动创建pv,减轻了集群管理员创建pv的负担。简单的说人话,就是在管理k8s集群的时候,不需要创建pv了,只需要创建一个pvc就可以了。

那么,这就引出了两个全新的概念,什么是pv?什么是pvc?

(1)pv


pv=persistentVolume,是一个缩写,中文意思持久存储,PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”,比如Node也是容器应用可以消费的资源。PV由管理员创建和配置,与共享存储的具体实现直接相关。

kubernetes支持的PV类型如下:
◎ AWSElasticBlockStore:AWS公有云提供的ElasticBlockStore。
◎ AzureFile:Azure公有云提供的File。
◎ AzureDisk:Azure公有云提供的Disk。
◎ CephFS:一种开源共享存储系统。
◎ FC(Fibre Channel):光纤存储设备。
◎ FlexVolume:一种插件式的存储机制。
◎ Flocker:一种开源共享存储系统。
◎ GCEPersistentDisk:GCE公有云提供的PersistentDisk。
◎ Glusterfs:一种开源共享存储系统。
◎ HostPath:宿主机目录,仅用于单机测试。
◎ iSCSI:iSCSI存储设备。
◎ Local:本地存储设备,目前可以通过指定块(Block)设备提供Local PV,或通过社区开发的sig-storage-local-static-provisioner插件( https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner )来管理Local PV的生命周期。
◎ NFS:网络文件系统。
◎ Portworx Volumes:Portworx提供的存储服务。
◎ Quobyte Volumes:Quobyte提供的存储服务。
◎ RBD(Ceph Block Device):Ceph块存储。
◎ ScaleIO Volumes:DellEMC的存储设备。
◎ StorageOS:StorageOS提供的存储服务。
◎ VsphereVolume:VMWare提供的存储系统。

以上可以看到,nfs,iscsi,ceph这些常用的网络存储或者块存储会被看做一个资源,也就是被k8s认为是一个可用资源。

一个简单的pv创建文件,内容如下:

[root@master mysql]# cat pv_mysql.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
  name: nfs-pv-test
  namespace: database
spec:
  accessModes:
    - ReadWriteOnce      
  capacity:
    storage: 1.5Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /data/nfs_sc/nfs-pv-test
    server: 192.168.217.16

上面这个pv创建文件,有比较多的参数,其中需要关注的参数是:

1, capacity


它的值就是pod允许持久化多少数据,假如这个pv被某个pvc调用,那么,将只能使用1.5G的空间。

2,存储卷模式(Volume Mode)


volumeMode=xx,可选项包括Filesystem(文件系统)和Block(块设备),默认值是FileSystem。上面这个文件因为是使用的网络存储nfs,因此,这里省略了,使用的默认filesystem

3,访问模式(Access Modes)


用于描述应用对存储资源的访问权限。

◎ ReadWriteOnce(RWO):读写权限,并且只能被单个Node挂载。

◎ ReadOnlyMany(ROX):只读权限,允许被多个Node挂载。

◎ ReadWriteMany(RWX):读写权限,允许被多个Node挂载。

上面的示例使用的readwriteonce ,这个也是比较常用的,另一个常用的就是readwritemany,但,many可能会造成后期的管理上的混乱问题,因此,once是应用最多的,如果不想给自己找麻烦的话,once就够用了,不要使用many。

4、存储类别(Class)


设定存储的类别,通过storageClassName参数指定给一个StorageClass资源对象的名称,具有特定类别的PV只能与请求了该类别的PVC进行绑定。未绑定类别的PV则只能与不请求任何类别的PVC进行绑定。

前面已经说过了,如果有设定StorageClass,并且这个StorageClass被设定为默认的话,这个就可以不指定了。如果没有设定默认的StorageClass,那么,这里必须要指定。

如何选择StorageClass?

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

比如我的测试系统,我安装了很多个StorageClass,示例pv文件使用的就是默认nfs(default)

5、回收策略(Reclaim Policy)


通过persistentVolumeReclaimPolicy字段设置,

◎ Retain 保留:保留数据,需要手工处理。

◎ Recycle 回收空间:简单清除文件的操作(例如执行rm -rf /thevolume/* 命令)。

◎ Delete 删除:与PV相连的后端存储完成Volume的删除操作

EBS、GCE PD、Azure Disk、OpenStack Cinder等设备的内部Volume清理)。

回收策略是根据实际的生产活动来设定的,如果持久化的数据比较重要,那么,retain是一个不错的选择,这里的意思是,如果是retain 即使删除了pv,数据依然保留。本例是使用的retain

如何查询pv是使用的哪种策略?(总不能什么都看上面的那个示例安装文件吧,万一找不到了呢?)

[root@master mysql]# k get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                                          STORAGECLASS      REASON   AGE
mysql-pv-test                              1Gi        RWO            Retain           Terminating   database/mysql-pvc-test                        nfs-provisioner            34h
nfs-pv-test                                1536Mi     RWO            Retain           Terminating   database/nfs-pvc-test                          nfs                        3h56m
pvc-04203f8a-5907-48ce-9fc2-013e94313c3c   8Gi        RWO            Delete           Bound         kube-system/redis-data-redis-test-replicas-1   nfs-provisioner            3d11h
pvc-751a32b6-8706-477b-8cad-d71e8e9f3ab8   256Mi      RWO            Delete           Bound         kube-system/redis                              nfs-provisioner            3d11h
pvc-d5ea7d10-2ffa-402e-b3f1-8573a195ad6f   8Gi        RWO            Delete           Bound         kube-system/redis-data-redis-test-replicas-0   nfs-provisioner            3d11h
pvc-e1693689-b01b-4855-ab1c-b8f843be4e2e   8Gi        RWO            Delete           Bound         kube-system/redis-data-redis-test-replicas-2   nfs-provisioner            3d11h
pvc-f9193155-776c-42f4-a3f5-71e75f16416f   8Gi        RWO            Delete           Bound         kube-system/redis-data-redis-test-master-0     nfs-provisioner            3d11

那,我创建的nfs-pv-test这个pv就是使用的retain策略。

如何更改策略呢?  重新kubectl  apply -f 示例文件就可以了 ,例如下面这样修改:

[root@master mysql]# cat pv_mysql.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
  name: nfs-pv-test1
spec:
  accessModes:
    - ReadWriteOnce      
  capacity:
    storage: 1.5Gi
  persistentVolumeReclaimPolicy: Recycle 
  storageClassName: nfs
  nfs:
    path: /data/nfs_sc/nfs-pv-test1
    server: 192.168.217.16
[root@master mysql]# k apply -f pv_mysql.yaml
The PersistentVolume "nfs-pv-test1" is invalid: spec.persistentVolumeReclaimPolicy: Unsupported value: "recycle": supported values: "Delete", "Recycle", "Retain"
[root@master mysql]# vim pv_mysql.yaml
[root@master mysql]# k apply -f pv_mysql.yaml
persistentvolume/nfs-pv-test1 created

The PersistentVolume "nfs-pv-test1" is invalid: spec.persistentVolumeReclaimPolicy: Unsupported value: "recycle": supported values: "Delete", "Recycle", "Retain"   这一段表示就三种策略,策略必须指定,没有默认的说法。

[root@master mysql]# k get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                                          STORAGECLASS      REASON   AGE
mysql-pv-test                              1Gi        RWO            Retain           Terminating   database/mysql-pvc-test                        nfs-provisioner            35h
nfs-pv-test                                1536Mi     RWO            Retain           Terminating   database/nfs-pvc-test                          nfs                        4h2m
nfs-pv-test1                               1536Mi     RWO            Recycle          Available                                                    nfs                        15s
pvc-04203f8a-5907-48ce-9fc2-013e94313c3c   8Gi        RWO            Delete           Bound         kube-system/redis-data-redis-test-replicas-1   nfs-provisioner            3d11h
pvc-751a32b6-8706-477b-8cad-d71e8e9f3ab8   256Mi      RWO            Delete           Bound         kube-system/redis                              nfs-provisioner            3d11h

这里需要注意一点,pv名称是nfs-pv-test1,回收策略是Recycle,这里需要注意大小写。它和其它的pv 状态不同,其它的要么是bound,要么是Terminating ,而这个是available,因为这个pv还没有绑定到任何pvc。而Terminating 表示这个pv已经结束使命了,因为,我用了默认的StorageClass,pod已经起来了,pv的生命周期也就结束了(没有继续bound 绑定的意义了)。

另外,如果资源供应使用的是动态模式,即管理员没有预先定义PV,仅通过StorageClass交给系统自动完成PV的动态创建,那么PVC再设定Selector时,系统将无法为其供应任何存储资源。

在启用动态供应模式的情况下,一旦用户删除了PVC,与之绑定的PV也将根据其默认的回收策略“Delete”被删除。如果需要保留PV(用户数据),则在动态绑定成功后,用户需要将系统自动生成PV的回收策略从“Delete”改成“Retain”。说人话就是,如果是使用的default 的StorageClass,那么,策略一定要定为retain。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
12月前
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
594 13
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文档详细介绍如何在Kubernetes中使用StorageClass动态创建PersistentVolume (PV),以简化大量PV的手动配置工作。StorageClass作为一种动态存储供给机制,
210 1
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文介绍了Kubernetes中的`StorageClass`,这是一种用于定义不同存储提供者配置的抽象机制,能够动态生成PersistentVolume(PV),简化存储管理。文中详细描述了如何在K8s集群中配置和使用`StorageClass`,包括搭建NFS服务器、配置RBAC权限、创建StorageClass及关联PVC和Pod的过程,并通过实验验证了动态PV的创建和删除功能。实验环境包含一个Master节点和两个Node节点,以及一台NFS服务器。
623 0
|
存储 运维 Kubernetes
k8s学习笔记之StorageClass+NFS
k8s学习笔记之StorageClass+NFS
|
存储 Kubernetes Perl
在K8S中,如何知道Pod的数据存储在哪里?
在K8S中,如何知道Pod的数据存储在哪里?
|
存储 Kubernetes 应用服务中间件
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例
1164 0
|
存储 Kubernetes Cloud Native
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
云原生|kubernetes|持久化存储pv,pvc和StorageClass的学习
559 1
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes—数据存储(二)
Kubernetes—数据存储(二)
111 0
|
存储 Kubernetes 应用服务中间件
Kubernetes—数据存储(一)
Kubernetes—数据存储(一)
151 0
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
330 1