当前位置: 首页 > news >正文

【云原生】Kubernetes---Storageclass存储类动态生成存储(持久化)

三、Storageclass存储类动态生成存储

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

3.1、StorageClass介绍

  • 每个StorageClass都包含字段provisioner,parameters和reclaimPolicy
  • 具体来说,StorageClass会定义以下两部分:

​ PV的属性,比如存储的大小、类型等

​ 创建这种PV需要使用到的存储插件,比如Ceph、NFS等

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

3.2、StorageClass示例

3.2.1、资源列表
操作系统主机名配置IP
CentOS 7.9master2C4G192.168.93.101
CentOS 7.9node12C4G192.168.93.102
CentOS 7.9node22C4G192.168.93.103
CentOS 7.9nfs2C4G192.168.93.104
3.2.2、准备NFS
  • NFS节点操作
3.2.2.1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3.2.2.2、关闭内核安全机制
setenforce 0
sed -i "s/.*SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
3.2.2.3、安装
[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# mkdir -p /data/nfs_pro
[root@nfs ~]# cat >> /etc/exports << EOF
/data/nfs_pro 192.168.93.0/24(rw,no_root_squash)
EOF
[root@nfs ~]# systemctl restart nfs
# 所有Kubernetes集群中的节点需要安装以下软件包用以支持NFS
yum -y install nfs-utils rpcbind
3.2.3、部署供应商
  • 该yaml文件里面指定了NFS节点的地址,以及使用NFS节点的哪个目录。需要替换成自己的
[root@master ~]# cat nfs-provisioner.yaml
# 表示使用Kubernetes核心API的v1版本
apiVersion: v1
# ServiceAccount表示这是一个服务账户资源,用于定义运行在Pod中的进程可以访问权限
kind: ServiceAccount
metadata:
# 服务账户的名称name: nfs-provisioner
---
# 表示使用基于角色的访问控制(RBAC)的v1版本
apiVersion: rbac.authorization.k8s.io/v1
# 表示这是一个集群角色绑定资源,用于将角色(CLusterRole)绑定到一个或多个用户或组
kind: ClusterRoleBinding
# 这是集群角色绑定的名称
metadata:name: nfs-provisioner-clusterrolebinding
# 指定了要绑定的角色
roleRef:
# rbac.authorization.k8s.io是角色所在的API组apiGroup: rbac.authorization.k8s.io
# 表示这是一个集群级别的角色kind: ClusterRole
# cluster-admin是要绑定的角色,这里给予了nfs-provisioner服务账户非常高的权限name: cluster-admin
# 指定了绑定到这个角色用户或组
subjects:
# ServiceAccount表示这是一个服务账户
- kind: ServiceAccount
# 服务账号的名称name: nfs-provisioner
# 指定了服务账户所在的命名空间,这里是默认的命名空间namespace: default
---
# 表示这是一个部署资源,用于管理无状态应用的Pod
kind: Deployment
# apps/v1表示使用应用工作负载API的v1版本
apiVersion: apps/v1
metadata:
# Deployment的名字name: nfs-provisioner
# 定义了部署的规格
spec:
# 定义了如何识别由这个部署管理的Podselector:
# 指定了Pod必须具有的标签matchLabels:app: nfs-provisioner
# 表示Deployment将运行一个Pod副本replicas: 1
# 定义了Pod的更新策略strategy:
# 表示在更新时先删除除旧的Pod,然后创建新的Podtype: Recreatetemplate:metadata:labels:app: nfs-provisioner# 定义Pod的规格spec:# nfs-provisioner指定了Pod将使用的账户serviceAccount: nfs-provisionercontainers:- name: nfs-provisioner# 指定了容器的镜像,这里是一个NFS外部卷预配器的镜像image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0# 定义了容器内部的挂载点volumeMounts: # nfs-client-root挂载卷的名字- name: nfs-client-root# 将卷挂载到容器内部的目录/persistentvolumesmountPath: /persistentvolumes# 定义了容器的环境变量env:# 定义了预配器的名称,这是动态卷预配的关键- name: PROVISIONER_NAMEvalue: example.com/nfs # NFS_SERVER和NFS_PATH定义了NFS服务器的地址和路径,预配器将从中创建新的NFS持久化- name: NFS_SERVERvalue: 192.168.93.104- name: NFS_PATHvalue: /data/nfs_pro# 定义Pod中的挂载卷volumes:# 卷的名字,与容器挂载点中的名字相匹配- name: nfs-client-root# 定义了NFS卷的类型和配置nfs:# server和path分别是NFS服务器的地址和路径,与环境变量中的值相同server: 192.168.93.104path: /data/nfs_pro
[root@master ~]# kubectl apply -f nfs-provisioner.yaml 
serviceaccount/nfs-provisioner created
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinding created
deployment.apps/nfs-provisioner created
3.2.4、创建StorageClass
[root@master ~]# cat StorageClass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: nfs
# 注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下
provisioner: example.com/nfs
allowVolumeExpansion: true		# 允许动态扩容
[root@master ~]# kubectl apply -f StorageClass.yaml 
storageclass.storage.k8s.io/nfs created
3.2.5、创建PVC
[root@master ~]# cat pvc.yaml 
# 定义一个PVC资源对象
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:
# 访问模式ReadWriteMany表示这个卷可以被多个节点以读写的模式挂载。这是NFS存储的一个常见特性accessModes: ["ReadWriteMany"]resources:requests:# storage: 1G表示指定了这个PVC请求的存储量大小为1Gstorage: 1G# nfs指定了这个PVC应用使用的存储类(StorageClass)的名称storageClassName: nfs
[root@master ~]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/test-claim1 created
3.2.6、Pod使用PVC
[root@master ~]# cat test-pvc-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: test-pvc-podlabels:app: busybox
spec:containers:- name: busyboximage: busybox:1.28imagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]volumeMounts: - name: datamountPath: /optvolumes:- name: datapersistentVolumeClaim:# test-claim1是这个卷将要使用的PVC的名字,这告诉Kubernetes,当Pod被调度到某个节点上时,它应该使用名为test-claim1的PVC来挂在一个持久化到Pod中的/opt目录claimName: test-claim1
[root@master ~]# kubectl apply -f test-pvc-pod.yaml 
pod/test-pvc-pod created
[root@master ~]# kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nfs-provisioner-77cdc7f549-z8csl   1/1     Running   0          31m
test-pvc-pod                       1/1     Running   0          46s
# pv和pvc将会自动绑定
[root@master ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087   1G         RWX            Delete           Bound    default/test-claim1   nfs                     14m
[root@master ~]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim1   Bound    pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087   1G         RWX            nfs            14m
# 在容器里面写个文件,NFS服务器的指定目录下就会有这个 
[root@master ~]# kubectl exec -it test-pvc-pod -- sh -c 'date > /opt/time.txt'
[root@master ~]# kubectl exec -it test-pvc-pod -- cat /opt/time.txt
Fri Jul  5 03:15:59 UTC 2024# 登录到NFS服务器查看
[root@nfs ~]# cat /data/nfs_pro/default-test-claim1-pvc-5c73d02d-1083-4d2c-85c7-85c5645c6087/time.txt 
Fri Jul  5 03:15:59 UTC 2024

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32自己从零开始实操08:STM32主控原理图
  • MongoDB:掌握核心常用命令语句,精通数据操作
  • RabbitMq - Java客户端基础【简单案例 +Work模型】
  • 深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇-续
  • docker安装oracle 11g
  • Let‘s Encrypt 申请免费 SSL 证书(每隔60天自动更新证书)
  • 服务端健康检查最常见的方式:TCP 端口探测与 HTTP 接口返回码探测
  • Fast R-CNN(论文阅读)
  • 三菱PLC 实现PID控制温度 手搓PID指令!!!
  • 计算机网络概述--自我学习用
  • c#中的超时终止
  • C++ 智能指针使用不当导致内存泄漏问题
  • 深入理解Spring Boot中的异步处理
  • spring boot(学习笔记第十二课)
  • STM32-ADC+DMA
  • Apache的基本使用
  • express如何解决request entity too large问题
  • Javascript弹出层-初探
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • springboot_database项目介绍
  • Vue学习第二天
  • vue自定义指令实现v-tap插件
  • 关于List、List?、ListObject的区别
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用parted解决大于2T的磁盘分区
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一份游戏开发学习路线
  • 白色的风信子
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #window11设置系统变量#
  • #大学#套接字
  • #预处理和函数的对比以及条件编译
  • (SpringBoot)第七章:SpringBoot日志文件
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET成年了,然后呢?
  • .net实现客户区延伸至至非客户区
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET学习教程二——.net基础定义+VS常用设置
  • @Validated和@Valid校验参数区别
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [autojs]autojs开关按钮的简单使用
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [C# WPF] 如何给控件添加边框(Border)?