【Kubernetes】存储类StorageClass

2023-12-13 06:44

本文主要是介绍【Kubernetes】存储类StorageClass,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

存储类StorageClass

  • 一、StorageClass介绍
  • 二、安装nfs provisioner,用于配合存储类动态生成pv
    • 2.1、创建运行nfs-provisioner需要的sa账号
    • 2.2、对sa授权
    • 2.3、安装nfs-provisioner程序
  • 三、创建storageclass,动态供给pv
  • 四、创建pvc,通过storageclass动态生成pv
  • 五、创建pod,挂载storageclass动态生成的pvc

一、StorageClass介绍

之前介绍的PV和PVC模式都是需要先创建好PV,然后定义好PVC和pv进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,

Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。

具体来说,StorageClass会定义以下两部分:
=========
1、PV的属性 ,比如存储的大小、类型等;
2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等
=========
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。

查看定义的storageclass需要的字段:kubectl explain storageclass
每个StorageClass都包含字段provisioner,parameters和reclaimPolicy

[root@master 10]# kubectl explain storageclass
KIND:     StorageClass
VERSION:  storage.k8s.io/v1
DESCRIPTION:StorageClass describes the parameters for a class of storage for whichPersistentVolumes can be dynamically provisioned.StorageClasses are non-namespaced; the name of the storage class accordingto etcd is in ObjectMeta.Name.
FIELDS:allowVolumeExpansion	<boolean>allowedTopologies	<[]Object>apiVersion	<string>kind	<string>metadata	<Object>mountOptions	<[]string>parameters	<map[string]string>  # 键值对类型provisioner	<string> -required-  # 供应商reclaimPolicy	<string>         # 回收策略volumeBindingMode	<string>

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。

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

在这里插入图片描述

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

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

将nfs-subdir-external-provisioner.tar.gz上传到工作节点node01和node02上,然后手动解压。

[root@node01 ~]#  ctr -n=k8s.io images import  nfs-subdir-external-provisioner.tar.gz
unpacking registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 (sha256:69b08b256d7e9f5823cf09dece7eabf025cc60c652e4ae08201978bb2862a276)...done
You have new mail in /var/spool/mail/root
[root@node02 ~]#  ctr -n=k8s.io images import  nfs-subdir-external-provisioner.tar.gz
unpacking registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 (sha256:69b08b256d7e9f5823cf09dece7eabf025cc60c652e4ae08201978bb2862a276)...done
You have new mail in /var/spool/mail/root

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

[root@master 11]# cat serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
[root@master 11]# kubectl apply -f serviceaccount.yaml
serviceaccount/nfs-provisioner created
[root@master 11]# kubectl get sa
NAME              SECRETS   AGE
default           0         5d13h
nfs-provisioner   0         21s

扩展:什么是sa?

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

2.2、对sa授权

[root@master 11]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding  --clusterrole=cluster-admin  --serviceaccount=default:nfs-provisioner
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinding created

2.3、安装nfs-provisioner程序

[root@master 11]# cat /etc/exports
/data/volumes 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v1 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v2 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v3 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v4 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v5 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v6 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v7 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v8 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v9 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v10 10.32.1.147/24(rw,no_root_squash)
/data/nfs_pro 10.32.1.147/24(rw,no_root_squash)
[root@master 11]# exportfs -arv
exporting 10.32.1.147/24:/data/nfs_pro
exporting 10.32.1.147/24:/data/volume_test/v10
exporting 10.32.1.147/24:/data/volume_test/v9
exporting 10.32.1.147/24:/data/volume_test/v8
exporting 10.32.1.147/24:/data/volume_test/v7
exporting 10.32.1.147/24:/data/volume_test/v6
exporting 10.32.1.147/24:/data/volume_test/v5
exporting 10.32.1.147/24:/data/volume_test/v4
exporting 10.32.1.147/24:/data/volume_test/v3
exporting 10.32.1.147/24:/data/volume_test/v2
exporting 10.32.1.147/24:/data/volume_test/v1
exporting 10.32.1.147/24:/data/volumes
[root@master 11]# 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.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 10.32.1.147- name: NFS_PATHvalue: /data/nfs_pro/volumes:- name: nfs-client-rootnfs:server: 10.32.1.147path: /data/nfs_pro/
[root@master 11]# kubectl apply -f nfs-deployment.yaml
deployment.apps/nfs-provisioner created
[root@master 11]# kubectl get pods | grep nfs
nfs-provisioner-d5bd78f66-56ccg   1/1     Running   0             6s

三、创建storageclass,动态供给pv

[root@master 11]# cat nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs
provisioner: example.com/nfs
[root@master 11]# kubectl apply -f nfs-storageclass.yaml
storageclass.storage.k8s.io/nfs created
[root@master 11]# kubectl get storageclass
NAME   PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs    example.com/nfs   Delete          Immediate           false                  22s
# 显示内容如上,说明storageclass创建成功了

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

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

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

[root@master 11]# cat claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:accessModes:  ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName:  nfs
[root@master 11]# kubectl apply -f claim.yaml
persistentvolumeclaim/test-claim1 created
# 查看是否动态生成了pv,pvc是否创建成功,并和pv绑定
[root@master 11]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim1   Bound    pvc-6ecea632-e5ff-4ef9-99df-33638fe90a1c   1Gi        RWX            nfs            13s
# 通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc-6ecea632-e5ff-4ef9-99df-33638fe90a1c 
# 这个pv是由storageclass调用nfs provisioner自动生成的。

步骤总结:

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

五、创建pod,挂载storageclass动态生成的pvc

[root@master 11]# cat read-pod.yaml
kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-podimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
[root@master 11]# kubectl apply -f read-pod.yaml
pod/read-pod created
[root@master 11]# kubectl get pods | grep read
read-pod                          1/1     Running   0             16s

这篇关于【Kubernetes】存储类StorageClass的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的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. 创

使用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

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处