云原生 | K8S中数据存储之StorageClass

        在一个大规模的Kubernetes集群里,可能有成千上万个PVC,这就意味着运维人员必须实现创建出这个多个 PV,此外,随着项目的需要,会有新的PVC不断被提交,那么运维人员就需要不断的添加新的,满足要求的PV,否 则新的Pod就会因为PVC绑定不到PV而导致创建失败。而且通过 PVC 请求到一定的存储空间也很有可能不足 以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速 度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass, 通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等, kubernetes根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根 据应用的特性去申请合适的存储资源了。

 什么是StorageClass

 Kubernetes提供了一套可以自动创建PV的机制,即:Dynamic Provisioning.而这个机制的核心在 于:StorageClass这个API对象. StorageClass对象会定义下面两部分内容:

1.PV的属性.比如,存储类型,Volume的大小等.

2.创建这种PV需要用到的存储插件

 

 用户创建StatefulSet:statefuleset中定义volumeclaimtemplates,指定storageclassname:manages-nfs-storage.

k8s生成PVC:每个pod启动时,自动创建PVC

StorageClass触发Provisioner: k8s发现PVC引用了managed-nfs-storage,查找对应的storageclass,并调用其关联的provisioner

provisioner创建PV:provisioner根据storageclass配置,在NFS服务器上创建目录,并动态生成PV,绑定PVC

pod挂载PV:PV成功绑定后,pod挂载该PV到指定路径

创建storageclass

创建NFS共享服务

[root@k8s-master storageclass]# cat /etc/exports
/data/nfs-demo 192.168.9.0/24(rw,sync,no_root_squash,no_subtree_check)
[root@k8s-master storageclass]# sudo exportfs -r
[root@k8s-master storageclass]# sudo exportfs -v
/data/nfs-demo  192.168.9.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

配置account及相关权限


# rbac.yaml (已去除所有注释和隐藏字符)
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]resources: ["persistentvolumes"]   #允许管理PVverbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumeclaims"]   #允许管理PVCverbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]     #允许访问storageclassverbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["events"]       #允许记录事件verbs: ["create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: run-nfs-client-provisioner   #绑定到serviceaccount
subjects:
- kind: ServiceAccountname: nfs-client-provisioner     #引用的clusterrolenamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: leader-locking-nfs-client-provisionernamespace: default
rules:
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io[root@k8s-master storageclass]# kubectl apply -f rbac.yaml 
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
[root@k8s-master storageclass]#  kubectl get role,rolebinding
NAME                                                                   CREATED AT
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner   2025-04-25T02:59:25ZNAME                                                                          ROLE                                         AGE
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner   Role/leader-locking-nfs-client-provisioner   13s

 创建NFS资源的storageclass

[root@k8s-master storageclass]# kubectl apply -f nfs-StorageClass.yaml 
storageclass.storage.k8s.io/manages-nfs-storage created
[root@k8s-master storageclass]# kubectl get sc
NAME                  PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
manages-nfs-storage   nfs-storage   Delete          Immediate           false                  8s
#动态创建pv
[root@k8s-master storageclass]# cat nfs-StorageClass.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: nfs-storage
parameters:archiveOnDelete: "false"

 创建NFS provisioner

[root@k8s-master storageclass]# kubectl get deploy,pod
NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nfs-client-provisioner   1/1     1            1           18sNAME                                         READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-cfbb6c87c-ztfvf   1/1     Running   0          18s
#定义 NFS Provisioner 的 Deployment。
[root@k8s-master storageclass]# cat nfs-provisioner.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisionernamespace: default
spec:replicas: 1strategy:type: Recreate       #重启策略:删除旧pod 再创建新podselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisioner      #使用前面创建的serviceaccountcontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage       - name: NFS_SERVERvalue: 192.168.9.178 - name: NFS_PATHvalue: /data/nfs-demo volumes:- name: nfs-client-rootnfs:server: 192.168.9.178  path: /data/nfs-demo

 创建测试pod,查看是否可以正常挂载

[root@k8s-master storageclass]# cat test-pod.yaml 
apiVersion: v1
kind: Pod
metadata: name: test-pod
spec:containers:- name: test-podimage: busybox:1.24command:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim[root@k8s-master default-test-claim-pvc-54d78e0c-7c7e-460c-a288-df1ecc3e346d]# ll
total 0
-rw-r--r--. 1 root root 0 Apr 26 23:16 SUCCESS

StateFulDet+volumeClaimTemplates自动创建PV

statefulset:为每个pod提供稳定的唯一标识,适用于需要持久化数据或有序部署/扩展的应用;通过volumeclaimtemplates字段,为每个pod自动生成唯一的PVC

storageclass:描述动态存储蓝图,指定存储后端类型,provisioner,回收策略;触发动态创建PV:当 PVC 中引用 StorageClass 名称时,Kubernetes 会根据 StorageClass 配置,调用关联的 Provisioner 自动创建 PV

provisioner:动态创建PV,根据storageclass的配置动态创建PV,并绑定

组件

核心作用

动态存储中的角色

StatefulSet

管理有状态应用,为每个 Pod 生成唯一的 PVC

触发动态 PVC 创建

StorageClass

定义存储类型和配置模板(如 NFS、云存储)

告诉 Kubernetes 如何创建 PV

Provisioner

根据 StorageClass 配置,在存储后端动态创建 PV

执行实际存储资源分配和绑定操作

apiVersion: v1
kind: Service
metadata:name: nginx-headlesslabels: app: nginx-headless
spec:ports:- port: 80name: webclusterIP: Noneselector: app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginxserviceName: "nginx-headless"replicas: 2template:metadata:labels: app: nginxspec: containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec: accessModes: - ReadWriteOnceresources:requests:storage: 1Gi[root@k8s-master storageclass]# kubectl get pod -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          50s
web-1   1/1     Running   0          23s
[root@k8s-master storageclass]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-54d78e0c-7c7e-460c-a288-df1ecc3e346d   1Mi        RWX            managed-nfs-storage   4h11m
www-web-0    Bound    pvc-138a31f9-f5c0-40a2-a6a8-7d49af0bc377   1Gi        RWO            managed-nfs-storage   60s
www-web-1    Bound    pvc-6104a805-da71-4a0c-b9ae-048747412b69   1Gi        RWO            managed-nfs-storage   33s
[root@k8s-master storageclass]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-138a31f9-f5c0-40a2-a6a8-7d49af0bc377   1Gi        RWO            Delete           Bound    default/www-web-0    managed-nfs-storage            65s
pvc-54d78e0c-7c7e-460c-a288-df1ecc3e346d   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            4h11m
pvc-6104a805-da71-4a0c-b9ae-048747412b69   1Gi        RWO            Delete           Bound    default/www-web-1    managed-nfs-storage            38s[root@k8s-master storageclass]# ll /data/nfs-demo/
total 0
drwxrwxrwx. 2 root root 21 Apr 26 23:19 default-test-claim-pvc-54d78e0c-7c7e-460c-a288-df1ecc3e346d
drwxrwxrwx. 2 root root  6 Apr 27 03:18 default-www-web-0-pvc-138a31f9-f5c0-40a2-a6a8-7d49af0bc377
drwxrwxrwx. 2 root root  6 Apr 27 03:19 default-www-web-1-pvc-6104a805-da71-4a0c-b9ae-048747412b69

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Hadoop大数据技术音乐推荐系统数据分析与可视化(基于Spark和Hive的音乐推荐系统数据分析与可视化)基于Python的音乐推荐系统数据分析与可视化

基于Hadoop大数据技术音乐推荐系统数据分析与可视化(基于Spark和Hive的音乐推荐系统数据分析与可视化)基于Python的音乐推荐系统数据分析与可视化 1. 开发工具和实现技术 Pycharm, Python3.7,Django框架,Hadoop,Spar…

podman/docker国内可用的docker镜像源(2025-05)

一、添加Docker国内镜像 1、修改 /etc/docker/daemon.json 设置 registry mirror&#xff0c;具体命令如下: sudo vim /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me",&q…

【Java ee初阶】多线程(4)

一、java是怎么做到可重入的 java中&#xff0c;通过synchronized进行加锁&#xff0c;指定一个&#xff08;&#xff09;包含了一个锁对象。&#xff08;锁对象本身是一个啥样的对象&#xff0c;这并不重要&#xff0c;重点关注锁对象是不是同一个对象&#xff09; 后面搭配…

LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系

之前一直搞不懂这些乱七八糟的Tex到底有啥区别&#xff0c;不同引擎不同编译器换来换去&#xff0c;查了些资料又问了下AI&#xff0c;总算是搞懂了。 大概是这样&#xff0c;很久以前有人写了个Tex排版引擎&#xff0c;输入一些代码命令&#xff0c;输出dvi文件&#xff08;设…

【Unity】一个UI框架例子

使用框架前置条件&#xff1a;调整脚本运行顺序, Canvas挂载UIManager, Panel挂载对应的UIController、UI控件挂载UIControl。 UIManager:UI管理器&#xff0c;用于处理和管理各个UIController和UIControl的业务逻辑&#xff0c;挂载在Canvas上&#xff1b; UIController:界面层…

kalibr:相机模型

文章目录 📚简介Kalibr标定支持的相机模型及适用场景📌 针孔相机模型(Pinhole)🌐 全向相机模型(Omnidirectional)🔍 特殊模型💡 选型建议⚠️ 注意事项📚简介 Kalibr作为多传感器标定的重要工具,支持多种相机模型以适应不同光学特性的视觉传感器。其核心相机…

今日行情明日机会——20250430

指数目前仍然在震荡区间&#xff0c;等后续的方向选择以及放量后的主线~ 2025年4月30日涨停主要行业方向分析 一、核心主线方向 机器人概念&#xff08;政策催化技术突破&#xff09; • 涨停家数&#xff1a;18家。 • 代表标的&#xff1a; ◦ 全筑股份&#xff08;工业机器…

量子加密通信:打造未来信息安全的“铜墙铁壁”

在数字化时代&#xff0c;信息安全已成为全球关注的焦点。随着量子计算技术的飞速发展&#xff0c;传统的加密算法面临着前所未有的挑战。量子计算机的强大计算能力能够轻易破解现有的加密体系&#xff0c;这使得信息安全领域急需一种全新的加密技术来应对未来的威胁。量子加密…

微信小程序中基于 SSE 实现轻量级实时通讯 —— 原理、实践与对比分析

本文系统梳理了在微信小程序开发中&#xff0c;如何使用 SSE&#xff08;Server-Sent Events&#xff09;方式实现轻量级即时通讯&#xff0c;结合实际项目实践&#xff0c;详细讲解原理、实现流程、对比 WebSocket/TCP/UDP 通讯方式&#xff0c;并给出完整模块封装与最佳实践建…

OpenCV 图形API(73)图像与通道拼接函数-----执行 查找表操作图像处理函数LUT()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对矩阵执行查找表变换。 函数 LUT 使用来自查找表中的值填充输出矩阵。输入矩阵中的值作为查找表的索引。也就是说&#xff0c;函数对 src 中的…

MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机

下面几种机制会让你的 List<String>/Map<String,?> 能正确读写成 JSON 数组&#xff0f;对象文本&#xff1a; MyBatis-Plus 自动注册 最新版本的 MyBatis-Plus starter 会把类路径下所有带 MappedTypes({List.class})、MappedJdbcTypes(JdbcType.VARCHAR) 这类注…

专题二十一:无线局域网——WLAN

一、WLAN简介 WLAN&#xff08;Wireless Local Area Network &#xff09;无线局域网&#xff0c;使用的是 IEEE 802.11 标准系列。 标准版本发布年份最大传输速率频段Wi-Fi代数特点/描述IEEE 802.1119971–2 Mbps2.4 GHzWi-Fi 0最早的无线局域网标准&#xff0c;传输速率低&…

python多进程的使用

多进程编程全面指南&#xff1a;从入门到实践 摘要&#xff1a;本文是为初学者设计的Python多进程编程全攻略&#xff0c;涵盖基础概念、核心函数详解、系统特性分析&#xff0c;并附带流程图、测试用例、开源项目推荐和经典书籍清单。通过8个实战代码示例和3个性能对比实验&am…

数据库管理与安全:从用户权限到备份恢复的全面指南

引言 在数字化时代&#xff0c;数据已成为组织最宝贵的资产之一。数据库作为存储和管理这些数据的核心系统&#xff0c;其安全性和可靠性直接关系到企业的运营和发展。无论是金融交易记录、医疗健康信息&#xff0c;还是电子商务平台的用户数据&#xff0c;都需要通过完善的数…

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字&#xff0c;要想体验图片聊天&#xff0c;需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…

在 Elastic 中使用 JOIN 进行威胁狩猎!

作者&#xff1a;来自 Elastic Paul Ewing, Jonhnathan Ribeiro Elastic 的管道查询语言 ES | QL 为查询带来了 join 功能。 威胁狩猎者欢呼吧&#xff01;你是否一直在寻找一种通过 Elastic 的速度和强大功能来连接数据的方法&#xff1f;好消息&#xff01;Elastic 现在可以通…

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…

Ethan独立开发产品日报 | 2025-04-30

1. Daytona 安全且灵活的基础设施&#xff0c;用于运行你的人工智能生成代码。 Daytona Cloud重新定义了AI代理的基础设施&#xff0c;具备低于90毫秒的启动时间、原生性能和有状态执行能力&#xff0c;这些是传统云服务无法比拟的。您可以以前所未有的速度和灵活性来创建、管…

Unity SpriteMask(精灵遮罩)

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;SpriteMask&#xff1a;精灵遮罩 &#x1f4a1;作用就是对精灵图片产生遮罩&#xff0c…

OpenHarmony全局资源调度管控子系统之内存管理部件

OpenHarmony之内存管理部件 内存管理部件 简介目录框架 进程回收优先级列表 补充 回收策略/查杀策略 使用说明参数配置说明 availbufferSizeZswapdParamkillConfignandlife 相关仓 简介 内存管理部件位于全局资源调度管控子系统中&#xff0c;基于应用的生命周期状态&#…