学习笔记二十六:storageclass存储类动态生成存储

2023-11-01 15:52

本文主要是介绍学习笔记二十六:storageclass存储类动态生成存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

storageclass存储类动态生成存储

  • storageclass作用
    • StorageClass 定义
    • provisioner:供应商
    • reclaimPolicy:回收策略
  • 安装nfs provisioner,用于配合存储类动态生成pv
    • 前置条件
    • 扩展:什么是sa
    • 安装nfs-provisioner程序
    • 创建storageclass,动态供给pv
    • 创建pvc,通过storageclass动态生成pv
    • 步骤总结:
  • 创建pod,挂载storageclass动态生成的pvc:test-claim1

storageclass作用

之前介绍的PV和PVC模式都是需要先创建好PV,然后定义好PVC和pv进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。

  • 每个StorageClass都包含字段provisioner,parameters和reclaimPolicy。

StorageClass 定义

  • PV的属性 ,比如存储的大小、类型等;
  • 创建这种PV需要使用到的存储插件,比如Ceph、NFS等

有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

查看定义的storageclass需要的字段

kubectl explain storageclass

provisioner:供应商

storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的provisioner如下
https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

在这里插入图片描述

provisioner既可以由内部供应商提供,也可以由外部供应商提供,如果是外部供应商可以参考https://github.com/kubernetes-incubator/external-storage/下提供的方法创建。
https://github.com/kubernetes-sigs/sig-storage-lib-external-provisioner

  • 以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。

reclaimPolicy:回收策略

allowVolumeExpansion:允许卷扩展,PersistentVolume 可以配置成可扩展。将此功能设置为true时,允许用户通过编辑相应的 PVC 对象来调整卷大小。当基础存储类的allowVolumeExpansion字段设置为 true 时,以下类型的卷支持卷扩展。

在这里插入图片描述

注意:此功能仅用于扩容卷,不能用于缩小卷。

安装nfs provisioner,用于配合存储类动态生成pv

前置条件

把nfs-subdir-external-provisioner.tar.gz上传到k8snode1和2
链接:https://pan.baidu.com/s/1Aks1dPFbXqVUupKIVei93A?pwd=h779
提取码:h779

ctr -n=k8s.io images import  nfs-subdir-external-provisioner.tar.gz

创建运行nfs-provisioner需要的sa账号

cat serviceaccount.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
kubectl apply -f serviceaccount.yaml 

扩展:什么是sa

sa的全称是serviceaccount
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。
指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。
对sa授权

kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

安装nfs-provisioner程序

把/data/nfs_pro变成nfs共享的目录

mkdir /data/nfs_pro -p
cat /etc/exports
/data/volumes 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)
/data/nfs_pro 192.168.40.0/24(rw,no_root_squash)
exportfs -arv
exporting 192.168.40.0/24:/data/nfs_pro
exporting 192.168.40.0/24:/data/volume_test/v10
exporting 192.168.40.0/24:/data/volume_test/v9
exporting 192.168.40.0/24:/data/volume_test/v8
exporting 192.168.40.0/24:/data/volume_test/v7
exporting 192.168.40.0/24:/data/volume_test/v6
exporting 192.168.40.0/24:/data/volume_test/v5
exporting 192.168.40.0/24:/data/volume_test/v4
exporting 192.168.40.0/24:/data/volume_test/v3
exporting 192.168.40.0/24:/data/volume_test/v2
exporting 192.168.40.0/24:/data/volume_test/v1
exporting 192.168.40.0/24:/data/volumes
cat nfs-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 192.168.40.180- name: NFS_PATHvalue: /data/nfs_provolumes:- name: nfs-client-rootnfs:server: 192.168.40.180path: /data/nfs_pro

更新资源清单文件

kubectl apply -f nfs-deployment.yaml 

查看nfs-provisioner是否正常运行

kubectl get pods | grep nfs
nfs-provisioner-cd5589cfc-pjwsq      1/1     Running 

创建storageclass,动态供给pv

cat nfs-storageclass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: nfs
provisioner: example.com/nfs
kubectl apply -f nfs-storageclass.yaml
kubectl get storageclass
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   
nfs       example.com/nfs         Delete          Immediate 
#显示内容如上,说明storageclass创建成功了

注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下:

env:- name: PROVISIONER_NAMEvalue: example.com/nfs

创建pvc,通过storageclass动态生成pv

cat claim.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:accessModes:  ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName:  nfs
kubectl apply -f claim.yaml
kubectl get pvc

在这里插入图片描述

#通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc-da737fb7-3ffb-43c4-a86a-2bdfa7f201e2,这个pv是由storageclass调用nfs provisioner自动生成的。

步骤总结:

  • 供应商:创建一个nfs provisioner
  • 创建storageclass,storageclass指定刚才创建的供应商
  • 创建pvc,这个pvc指定storageclass

创建pod,挂载storageclass动态生成的pvc:test-claim1

cat read-pod.yaml 
kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-pod
image: nginx
imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
kubectl apply -f read-pod.yaml
kubectl get pods | grep read
read-pod      1/1     Running     0

这篇关于学习笔记二十六:storageclass存储类动态生成存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

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

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

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

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

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

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2