【 云原生 | 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

相关文章

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Python动态处理文件编码的完整指南

《Python动态处理文件编码的完整指南》在Python文件处理的高级应用中,我们经常会遇到需要动态处理文件编码的场景,本文将深入探讨Python中动态处理文件编码的技术,有需要的小伙伴可以了解下... 目录引言一、理解python的文件编码体系1.1 Python的IO层次结构1.2 编码问题的常见场景二

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC