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

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

SpringMVC入参绑定特别注意

1.直接在controller中定义一个变量,但是此种传输方式有一个限制就是参数名和请求中的参数名必须保持一致,否则失效。 @RequestMapping("test2")@ResponseBodypublic DBHackResponse<UserInfoVo> test2(String id , String name){UserInfoVo userInfoVo = new UserInf