【实战】Kubernetes安装持久化工具NFS-StorageClass
文章目录
- 前言
- 技术积累
- 存储类(storage class)
- 什么是NFS
- 什么是PV\PVC
- 为什么要用NFS-StorageClass
- 安装NFS-StorageClass
- 保证K8S集群正常投用
- 安装NFS工具与客户端
- NFS安装常见错误
- 安装NFS-StorageClass存储器
前言
前面的博文我们介绍了如何用kuberadmin的架构概述与简单执行流程,以及部署K8S集群的详细步骤。今天我们继续介绍如何安装持久化工具NFS-StorageClass。
技术积累
存储类(storage class)
存储类是Kubernetes资源类型的一种,是管理员为创建PV方便而按需创建的类别。
要使用 StorageClass,就得安装对应的自动配置程序,比如这里存储后端使用的是 nfs,那么就需要使用到一个 nfs-client 的自动配置程序,也叫它 Provisioner,这个程序使用我们已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动创建 PV。PV、PVC和StorageClass之间的运作关系如下图所示:

什么是NFS
网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
NFS是主流的k8s数据持久化解决方案与pod共享存储解决方案;NFS数据卷提供对NFS挂载支持,可以自动将NFS共享 路径挂载到Pod中;NFS是一个主流的文件共享服务器。
什么是PV\PVC
在Kubernetes中,PV(Persistent Volume)网络管理员配置的存储和PVC(Persistent Volume Claim)用户申请的存储是用于持久化存储的两个概念,
它们的区别如下:
PV是实际的存储资源,例如物理存储设备、网络存储设备等。PVC是对PV的请求,描述了应用程序需要多少存储资源以及存储资源的属性。
PV由管理员手动配置,而PVC由应用程序自动创建。应用程序在需要持久化存储时,可以创建一个PVC,Kubernetes将根据PVC的要求自动查找或创建一个匹配的PV,并将PV与PVC进行绑定。
PV和PVC是分离的概念,它们可以独立地管理。当一个PVC被删除时,它所绑定的PV并不会立即被删除。相反,PV会被标记为"Released"状态,等待管理员手动删除。
PV和PVC之间的绑定是一对一的关系。一个PVC只能绑定一个PV,而一个PV只能被一个PVC绑定。但是,多个PVC可以绑定同一个PV,以实现共享存储。
PV可以设置访问模式(Access Modes),例如ReadWriteOnce、ReadWriteMany和ReadOnlyMany。Access Modes定义了多个Pod如何访问同一个PV。例如,ReadWriteOnce表示PV只能被一个Pod以读写方式访问,而ReadWriteMany表示PV可以被多个Pod以读写方式访问。
为什么要用NFS-StorageClass
PV 都是静态的,要使用的一个 PVC 的话就必须手动去创建一个 PV,这种方式在很大程度上并不能满足我们的需求,比如我们有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,这就需要 StorageClass动态的创建PV。
要使用 StorageClass,需要安装对应的自动配置程序,比如我们这里存储使用的是 NFS,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 NFS服务器,来自动创建持久卷,也就是自动帮我们创建 PV。
安装NFS-StorageClass
保证K8S集群正常投用
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 60d v1.27.2
node1 Ready <none> 60d v1.27.2
node2 Ready <none> 60d v1.27.2
[root@master ~]#
安装NFS工具与客户端
# 所有kubernetes集群节点中都需要安装nfs
[root@master ~]# yum install -y nfs-utils# 在master节点中执行
[root@master ~]# echo "/data/nfs *(insecure,rw,sync,no_root_squash)" > /etc/exports
[root@master ~]# mkdir -p /data/nfs && chmod -R 777 /data/nfs
[root@master ~]# exportfs -r
#master节点启动rpc 与 nfs
[root@master ~]# systemctl enable rpcbind && systemctl start rpcbind
[root@master ~]# systemctl enable nfs && systemctl start nfs#在所有的node节点执行
[root@master ~]# systemctl enable rpcbind && systemctl start rpcbind
[root@master ~]# systemctl enable nfs && systemctl start nfs
[root@master ~]# showmount -e master#验证k8s集群节点nfs工具安装和配置正确
[root@master ~]# showmount -e master
Export list for master:
/data/nfs *
[root@master ~]#
如下图所示表示安装成功:

NFS安装常见错误
1、clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)
需要关闭服务端和客户端防火墙以及selinux。
安装NFS-StorageClass存储器
创建k8s执行文件
[root@master ~]# vim nfs-storage.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs-provisioner
parameters:archiveOnDelete: "true" ---
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2# resources:# limits:# cpu: 10m# requests:# cpu: 10mvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-provisioner- name: NFS_SERVERvalue: 10.10.22.91 ## master nfs服务器IP- name: NFS_PATH value: /data/nfs ## nfs服务器共享的目录路径volumes:- name: nfs-client-rootnfs:server: 10.10.22.91path: /data/nfs
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
执行k8s安装文件
#执行nfs-storageclass安装文件
[root@master ~]# kubectl apply -f nfs-storage.yaml
#验证执行结果
[root@master ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage (default) nfs-provisioner Delete Immediate false 60d
[root@master ~]#
如下图所示表示安装成功:

⭐️路漫漫其修远兮,吾将上下而求索 🔍
相关文章:
【实战】Kubernetes安装持久化工具NFS-StorageClass
文章目录 前言技术积累存储类(storage class)什么是NFS什么是PV\PVC为什么要用NFS-StorageClass 安装NFS-StorageClass保证K8S集群正常投用安装NFS工具与客户端NFS安装常见错误安装NFS-StorageClass存储器 前言 前面的博文我们介绍了如何用kuberadmin的…...
透明安全地解释Moonbeam基金会分配的GLMR去了哪
在GLMR分配比例中,约有16.7%的GLMR分配给了生态支持。这部分GLMR究竟用在了哪里,Moonbeam生态是否还有足够的GLMR扶持生态项目? Moonbeam基金会每隔半年会发布一份GLMR透明度报告,最近的报告日期为2023年7月31日。其中列出了社区…...
python安装包失败 安装scipy包
最近在配深度学习环境,安装好了conda、CUDA、cuDNN,运行之后报错,没有scipy包。 试了很多方法: 用命令行pip、conda install 在pycharm下载包 在环境中添加包 都失败了 要么直接ERROR,要么超时 问了师兄 需要在conda环…...
解决javascript报错:SyntaxError: Invalid Unicode escape sequence
在处理cookie时报这个错: 网上搜了一圈都说是反斜杠问题,要把\替换成/ 但是试了网上的replace替换: replace(/\\/g, /) 结果没有用!!! 然后我干脆直接做了一个最简单字符串赋值,再打印出来。…...
【Python第三方包】使用Python的Translate包进行文本翻译
文章目录 前言一、Translator类的初始化参数二、translate函数三、翻译示例代码1.1 示例代码11.2 示例代码2总结前言 在现代互联网时代,跨语言翻译已经成为了不可或缺的工具。不仅对于个人,对于企业和开发者来说,实现文本翻译在国际化、多语言支持以及内容本地化方面都具有…...
【OpenCV实现图像阈值处理】
文章目录 概要简单阈值调整自适应阈值调整大津(Otsus)阈值法Otsus 二值化是如何工作的 概要 OpenCV库中的图像处理技术,主要分为几何变换、图像阈值调整和平滑处理三个部分。 在几何变换方面,OpenCV提供了cv.warpAffine和cv.warpPerspective函数&#…...
【Python机器学习】零基础掌握StackingRegressor集成学习
如何更准确地预测糖尿病患者的血糖水平? 糖尿病是一种影响全球数百万人的慢性疾病。有效地管理和预测血糖水平是糖尿病患者日常生活的重要一环。单一的预测模型(比如线性回归、支持向量机等)虽然有一定的效果,但在处理复杂的医疗数据时,其准确性可能会受到限制。 为了准…...
JVM(Java Virtual Machine)G1收集器篇
前言 本文参考《深入理解Java虚拟机》,本文主要介绍G1收集器的收集思想和具体过程(填上一篇文章留下的坑) 本系列其他文章链接: JVM(Java Virtual Machine)内存模型篇 JVM(Java Virtual Machi…...
微信小程序设计之主体文件app-json-tabBar
一、新建一个项目 首先,下载微信小程序开发工具,具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后,注册小程序账号,具体注册方法,可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…...
GZ035 5G组网与运维赛题第2套
2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第2套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子任务2:5G室内与室外站点建设(20分) 竞赛模块2--5G公共网络运维与优化(…...
如何训练Embedding Model
BGE的技术亮点: 高效预训练和大规模文本微调;在两个大规模语料集上采用了RetroMAE预训练算法,进一步增强了模型的语义表征能力;通过负采样和难负样例挖掘,增强了语义向量的判别力;借鉴Instruction Tuning的…...
springboot配置redis、Spring cache
1.Jedis库 依赖库 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.2</version> </dependency>使用案例: Testpublic void jedis(){Jedis jedis new Jedis("127…...
悟空crm安装搭建 报错[0] RedisException in Redis.php line 56问题处理办法
相信很多朋友进行安装悟空crm的时候 提示错误: [0] RedisException in Redis.php line 56 Connection refused 不知道怎么样处理是吧~~~ $this->options array_merge($this->options, $options);}# redis 密码$password config(cache.password);if (!empty…...
Ubuntu22.04 交叉编译阿里oss c-sdk
一、交叉编译openssl Ubuntu20.04 交叉编译openssl 1.0.1f_编译前去除 makefile 中所有的"-m64"字段_qq76211822的博客-CSDN博客文章浏览阅读319次。Ubuntu20.04 交叉编译openssl_编译前去除 makefile 中所有的"-m64"字段https://blog.csdn.net/sz7621182…...
arch linux 安装 vsftpd 配置虚拟用户
后面操作会直接基于 yay 操作 自行查找如何安装 yay 公司经常会用到 ftp 服务 不想用 apache 的 ftp server 所以自己在小机器上撞了 arch linux 用来安装软件 跑程序等。 1. 安装 vsftpd yay vsftpd --noconfirm选择 1 安装 输入密码 2. 安装 pam_pwdfile 安装 pam_pwdf…...
Django的查询所有,根据用户名查询,增加用户操作
1.路由 from meiduo_admin.user.user_views import UsersViewurlpatterns [# 用户操作路由path(users/, UsersView.as_view()), ]2. 序列化器 from rest_framework import serializersfrom meiduo_admin.models import Userclass UsersSerialize(serializers.ModelSerialize…...
【adb】adb相关命令行及adb传输文件权限问题 remote couldn‘t create file: Read-only file system
adb传输文件权限问题 今天用adb push的时候,报错说并非root权限 remote couldnt create file: Read-only file system 以下是adb相关命令一、非root权限解决方案 1️⃣运行以下命令行 adb root adb remount2️⃣如果还报错,则运行以下命令行 adb disab…...
基于物联网云平台的分布式光伏监控系统的设计与实现
贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:针对国内光伏发电监控系统的研究现状,文中提出了基于云平台的光伏发电监控体系。构建基于B/S架构的数据实时采集与推送,以SSH(strutsspringhibernate)作为Web开发框架,开发基…...
初识Node.js开发
一、Node.js是什么 1.node.js是什么 官方对Node.js的定义: Node.js是一个基于V8 JavaScript引擎的JavaScript运行时环境。 也就是说Node.js基于V8引擎来执行JavaScript的代码,但是不仅仅只有V8引擎: 前面我们知道V8可以嵌入到任何C 应用…...
【Python入门教程】基于OpenCV视频分解成图片+图片组合成视频(视频抽帧组帧)
在人工智能爆火的今天,深度学习被广泛应用于各个领域。深度学习的模型训练离不开大量的样本库。我之前分享过【Python爬虫】批量爬取网页的图片&制作数据集,今天跟大家分享一下如何使用OpenCV库对视频进行抽帧,从而增加样本图片的数量。正…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
