【 云原生 | kubernetes 】持久化存储 - StorageClass动态绑定PV

2023-10-28 14:59

本文主要是介绍【 云原生 | kubernetes 】持久化存储 - StorageClass动态绑定PV,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:上篇文章我们了解了PV、PVC。PV的创建和绑定需要我们手动去创建, Kubernetes 为我们提供了一套可以自动创建 PV 的机制,Dynamic Volume Provisioning

Dynamic Volume Provisioning 的实现基于 StorageClass 这个API 对象。 每个对象都会指定一个卷插件(又名 provisioner

简述

StorageClass 对象的作用其实就是创建 PV 的模板。每个StorageClass 都包含 provisionerparametersreclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。
在这里插入图片描述

StorageClass对象

简单来说分为两部分:

  1. PV的属性。 比如,存储类型、Volume 的大小等
  2. 创建 PV 需要用到的存储插件(provisioner)。比如,nfs,ceph等
#####官网案例
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

有了这两个主体信息之后,k8s就可以根据用户提交的PVC,找到对应的StorageClass,调用sc声明的provisioner 去创建PV

回收策略

目前的回收策略有:

  • Retain – 手动回收
  • Recycle – 需要擦除后才能再次使用
  • Delete – 当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。

目前,仅 NFS 和 HostPath 支持回收(Recycle) , 如果 StorageClass 对象被创建时没有指定 reclaimPolicy,它将默认为 Delete

状态

一个Volume卷发生的状态:

  • Available:空闲的资源,未绑定给PVC
  • Bound:成功绑定PVC
  • Released:PVC已经被删除,但PV还没有被集群回收
  • Failed:PV回收失败

在这里插入图片描述

实战

这里通过NFS服务为例,创建我们的动态资源绑定

前提条件:

  • Helm
  • NFS

我们使用Kubernetes的包管理工具Helm来部署自动配置器,自动创建持久卷

1、添加存储库

[root@ycloud ycloud]# helm repo add kubesphere https://charts.kubesphere.io/main
[root@ycloud ycloud]# helm repo ls 
NAME            URL                                      
kubesphere      https://charts.kubesphere.io/main   

2、把我们需要的包拉到本地,方便大家查看其中的内容

[root@ycloud ycloud]# helm pull kubesphere/nfs-client-provisioner

3、拉下来的是一个压缩包,我们需要把它解压到指定目录

[root@ycloud ycloud]#ls
nfs-client-provisioner-4.0.11.tgz
[root@ycloud ycloud]# tar -zxvf nfs-client-provisioner-4.0.11.tgz  -C /ycloud
[root@ycloud ycloud]# cd nfs-client-provisioner
[root@ycloud nfs-client-provisioner]# ll
total 28
-rw-r--r-- 1 root root  482 Sep 26  2021 Chart.yaml
drwxr-xr-x 2 root root 4096 Oct 22 22:09 ci
-rw-r--r-- 1 root root   74 Sep 26  2021 OWNERS
-rw-r--r-- 1 root root 5194 Sep 26  2021 README.md
drwxr-xr-x 2 root root 4096 Oct 22 22:39 templates
-rw-r--r-- 1 root root 1712 Oct 22 22:13 values.yaml

4、修改配置

[root@ycloud nfs-client-provisioner]# vi values.yaml 
replicaCount: 1
strategyType: Recreateimage:repository: registry.cn-beijing.aliyuncs.com/kubesphereio/nfs-subdir-external-provisionertag: v4.0.2pullPolicy: IfNotPresentnfs:server: 192.168.100.10    #####  nfs-server地址path: /data/nfs-data    #####  nfs配置的共享目录mountOptions:# For creating the StorageClass automatically:
storageClass:create: true# Set a provisioner name. If unset, a name will be generated.# provisionerName:# Set StorageClass as the default StorageClass# Ignored if storageClass.create is falsedefaultClass: false# Set a StorageClass name# Ignored if storageClass.create is falsename: nfs-client# Allow volume to be expanded dynamicallyallowVolumeExpansion: false# Method used to reclaim an obsoleted volumereclaimPolicy: Delete# When set to false your PVs will not be archived by the provisioner upon deletion of the PVC.archiveOnDelete: true·······

我们这里只需要修改nfs.server和nfs.path内容即可,下面内容用于自动创建StorageClass,name可以修改为我们熟悉的名称,默认的reclaimPolicy为Delete。

5、接下来让我们创建它到指定的Namespace

[root@ycloud nfs-client-provisioner]# kubectl create ns nfs-pro
[root@ycloud nfs-client-provisioner]# helm install nfs-provisioner ../nfs-client-provisioner -n nfs-pro
NAME: nfs-provisioner
LAST DEPLOYED: Sat Oct 22 22:15:00 2022
NAMESPACE: nfs-pro
STATUS: deployed
REVISION: 1
TEST SUITE: None

到这里我们已经创建结束了,我们可以通过Helm来查看其应用,也可直接查看Pod的状态,可以看到Pod在正常运行。

[root@ycloud nfs-client-provisioner]# helm ls -A
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION      
nfs-provisioner         nfs-pro         1               2022-10-22 22:15:00.327920762 +0800 CST deployed        nfs-client-provisioner-4.0.11   4.0.2      
[root@ycloud nfs-client-provisioner]# kubectl get po -n nfs-pro
NAME                                                     READY   STATUS    RESTARTS   AGE
nfs-provisioner-nfs-client-provisioner-bdf4b4df7-6sjzr   1/1     Running   0          61m

验证

接下来就到了验证,我们创建的StorageClass 可不可直接绑定PV

[root@ycloud nfs-client-provisioner]# kubectl describe sc nfs-client
Name:                  nfs-client
IsDefaultClass:        No
Annotations:           meta.helm.sh/release-name=nfs-provisioner,meta.helm.sh/release-namespace=nfs-pro
Provisioner:           cluster.local/nfs-provisioner-nfs-client-provisioner
Parameters:            archiveOnDelete=true
AllowVolumeExpansion:  False
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

我们只需要在PVC里指定要使用的StorageClass名字即可

[root@ycloud ycloud]# cat pvc.yaml 
apiVersion: v1 
kind: PersistentVolumeClaim
metadata:name: my-test
spec:accessModes:- ReadWriteOnceresources:requests:storage: 500MistorageClassName: nfs-client

可以看到,我们在这个 PVC 里添加了一个叫作 storageClassName 的字段,用于指定该 PVC 所要使用的 StorageClass 的名字是:nfs-client。

让我们去创建它,并查看详细内容,可以看到我们创建的PVC会绑定一个K8s自动创建的PV

[root@ycloud ycloud]# kubectl apply  -f pvc.yaml 
persistentvolumeclaim/my-test created
[root@ycloud ycloud]# kubectl describe pvc my-test
Name:          my-test
Namespace:     gstrain-pipeline
StorageClass:  nfs-client
Status:        Bound
Volume:        pvc-4403ad46-2813-4e22-8501-32fb9a101a13
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yespv.kubernetes.io/bound-by-controller: yesvolume.beta.kubernetes.io/storage-provisioner: cluster.local/nfs-provisioner-nfs-client-provisioner
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      500Mi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>

通过查看创建出来的PVC,我们可以清楚看到,和我们创建的PVC存储属性是一致的
在这里插入图片描述

Kubernetes指挥将StorageClass相同的PV和PVC绑定在一起

总结

我们通过PV和PVC了解了StorageClass是干什么用的。自动绑定会极大的帮助我们减少创建PV的时间。你还在手动的去创建PV吗?

参考文献

https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/

https://kubernetes.io/zh-cn/docs/concepts/storage/dynamic-provisioning/

这篇关于【 云原生 | kubernetes 】持久化存储 - StorageClass动态绑定PV的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/294019

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1