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

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

在这里插入图片描述
博客原文

文章目录

    • 前言
    • 集群环境
    • nfs 环境搭建
    • pod 挂载 nfs
      • 架构图
    • pvc 方式挂载 nfs
      • 架构图
    • storageclass 方式动态申请 pv
      • 架构图
    • 参考

前言

持久化卷(Persistent Volume, PV)允许用户将外部存储映射到集群,而持久化卷申请(Persistent Volume Claim, PVC)则类似于许可证,使有授权的应用(Pod)可以使用PV。

  • 持久化卷(Persistent Volume,PV)。

  • 持久化卷申请(Persistent Volume Claim,PVC)。

  • 存储类(Storage Class,SC)。

概括地说,PV代表的是Kubernetes中的存储;PVC就像许可证,赋予Pod访问PV的权限;sc则使分配过程是动态的。

集群环境

操作系统: Ubuntu 20.04

IPHostname配置
192.168.254.130master012C 4G 30G
192.168.254.131node012C 4G 30G
192.168.254.132node022C 4G 30G
192.168.254.133nfs-tools2C 4G 30G

nfs 环境搭建

安装 nfs

sudo apt-get install -y nfs-kernel-server  # 安装 NFS服务器端
sudo apt-get install -y nfs-common         # 安装 NFS客户端

nfs服务器端,只在集群中某一台安装即可

创建nfs共享目录

mkdir -p /nfs/share
chmod -R 777 /nfs/share

修改配置 vim /etc/exports

# 当登录NFS主机使用共享目录的使用者是root时,其权限将被转换成为匿名使用者,通常它的UID与GID都会变成nobody身份,添加no_root_squash参数,确保root账户能用
/nfs/share *(rw,sync,no_root_squash)     # * 表示允许任何网段 IP 的系统访问该 NFS 目录

配置生效

exportfs -r
exportfs  # 查看生效

启动服务

sudo /etc/init.d/nfs-kernel-server restart
mount -t nfs 192.168.254.130:/nfs/share /nfsremote -o nolock
  1. 如果提示 mount.nfs: access denied by server while mounting

    在服务器端 ``/etc/exports中加入insecure`

    如: /nfs/share *(insecure,rw,sync,no_root_squash)

实例数据

echo "hello world" > /nfs/share/index.html

pod 挂载 nfs

架构图

image-20240128164131754

pod_nfs.yaml:

apiVersion: v1
kind: Pod
metadata:name: nfs-testpodlabels:app: nfs-testpod
spec:containers:- name: nfs-testpodimage: nginximagePullPolicy: IfNotPresentsecurityContext:privileged: trueports:- containerPort: 80hostPort: 8080   # 将该端口暴露在主机的 8080volumeMounts:- mountPath: /usr/share/nginx/htmlname: datadirrestartPolicy: Alwaysvolumes:- name: datadirnfs:server: 192.168.254.133path: /nfs/share

验证结果:

$ k create -f pod_nfs.yaml$ k get po -owide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-testpod      1/1     Running   0          16m   10.244.196.134   node01   <none>           <none>$ curl node01:8080
hello world

pvc 方式挂载 nfs

架构图

image-20240128164806076

pod_nfs_pv_pvc.yaml:

# pv 分配资源
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv01labels:pv: nfs-pv01
spec:capacity:storage: 1GiaccessModes:- ReadWriteMany# 挂载 nfsnfs:path: /nfs/shareserver: 192.168.254.133
---
# pvc 向一个 pv 去请求资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc01labels:pv: nfs-pvc01
spec:# 向 pv 请求的存储大小resources:requests:storage: 500MiaccessModes:- ReadWriteMany# 通过 label 选择 pvselector:matchLabels:pv: nfs-pv01
---
apiVersion: v1
kind: Pod
metadata:name: nfs-pv-pvc-podlabels:app: nfs-pv-pvc-pod
spec:containers:- name: nfs-pv-pvc-podimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 8081   # 暴露 8081 volumeMounts:- mountPath: /usr/share/nginx/htmlname: datadirrestartPolicy: Alwaysvolumes:- name: datadirpersistentVolumeClaim:claimName: nfs-pvc01

验证结果:

$ k get po -owide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-pv-pvc-pod   1/1     Running   0          97s   10.244.196.135   node01   <none>           <none>
nfs-testpod      1/1     Running   0          16m   10.244.196.134   node01   <none>           <none>$ k get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
nfs-pv01   1Gi        RWX            Retain           Bound    default/nfs-pvc01                  <unset>                          8s
$ k get pvc
NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
nfs-pvc01   Bound    nfs-pv01   1Gi        RWX                           <unset>                 10s$ curl node01:8081
hello world

注意: 1 个 pv 能绑定一个 pvc

storageclass 方式动态申请 pv

架构图

image-20240128165511823

sc 要方式动态申请 pv, 需要一个与存储对应的 provisioner, 可以是云服务器的 provisioner. 参考

我们使用的是 nfs, 所以需要 nfs-provisioner

安装 nfs-provisioner

本次使用的是 nfs-provisionernfs subdir

# 通过 helm 安装, 安装 helm
wget https://get.helm.sh/helm-v3.7.0-linux-amd64.tar.gz 
tar zxvf helm-v3.7.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
$ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \--set nfs.server=192.168.254.133 \--set nfs.path=/nfs/share
# 也可以 helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner 后修改 values 的值
# 推荐 helm pull 下来后修改镜像地址 aifeierwithinmkt/nfs-subdir-external-provisioner (无法拉取镜像, 我推到 dockerhub的镜像)
NAME: nfs-subdir-external-provisioner
LAST DEPLOYED: Sun Jan 28 15:39:16 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None# 查看 pod
$ k get po -owide
NAME                                              READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-pv-pvc-pod                                    1/1     Running   0          50m   10.244.196.135   node01   <none>           <none>
nfs-subdir-external-provisioner-f8db66c64-cgpqk   1/1     Running   0          52s   10.244.196.137   node01   <none>           <none>
nfs-testpod                                       1/1     Running   0          65m   10.244.196.134   node01   <none>           <none># 我们需要从 pod 中获取 provisioner 的地址(pod 的环境变量), 用作 sc 的 provisioner 地址
k describe po nfs-subdir-external-provisioner-f8db66c64-cgpqk | grep PROVISIONER_NAME

pod_nfs_sc_pvc.yaml:

# 构建 storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-sc
provisioner: cluster.local/nfs-subdir-external-provisioner
mountOptions:- nfsvers=4
#parameters:
#  server: nfs-server.example.com
#  path: /share
#  readOnly: "false"
---
# pvc 向一个 pv 去请求资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc02labels:pv: nfs-pvc02
spec:# 向 pv 请求的存储大小resources:requests:storage: 500MiaccessModes:- ReadWriteMany# 指定 storageclassstorageClassName: nfs-sc# 通过 label 选择 pv
#  selector:
#    matchLabels:
#      pv: nfs-pv01
---
apiVersion: v1
kind: Pod
metadata:name: nfs-sc-pvc-podlabels:app: nfs-sc-pvc-pod
spec:containers:- name: nfs-sc-pvc-podimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 8082volumeMounts:- mountPath: /usr/share/nginx/htmlname: datadirrestartPolicy: Alwaysvolumes:- name: datadirpersistentVolumeClaim:claimName: nfs-pvc02

验证结果:

$ k get po -owide
NAME                                              READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nfs-sc-pvc-pod                                    1/1     Running   0          10s   10.244.196.138   node01   <none>           <none>$ k get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
nfs-pvc02   Bound    pvc-7ebac745-38f2-4ea7-8d18-0465f6fdf2d1   500Mi      RWX            nfs-sc         <unset>                 2m4s$ curl node01:8082
hello world

参考

  1. https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#nfs

相关文章:

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储

博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷&#xff08;Persistent Volume, PV&#xff09;允许用户将外部存储映射到集群&#xff0c;而持久化卷申请&#xff08;Persist…...

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

Modelsim10.4安装

简介&#xff08;了解&#xff0c;可跳过&#xff09; modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境&#xff0c;采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术&#xff0c;编译仿真速…...

Java基于微信小程序的医院核酸检测服务系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

VC++ 绘制折线学习

win32 有三个绘制折线的函数&#xff1b; Polyline&#xff0c;根据给定点数组绘制折线&#xff1b; PolylineTo&#xff0c;除了绘制也更新当前位置&#xff1b; PolyPolyline&#xff0c;绘制多条折线&#xff0c;第一个参数是点数组&#xff0c;第二个参数是一个数组、指…...

速盾:dns解析和cdn加速的区别与联系

DNS解析和CDN加速是两种不同的网络技术&#xff0c;但在网站访问过程中起到了相互协作的作用。 首先&#xff0c;DNS解析&#xff08;Domain Name System&#xff09;是将域名转换为IP地址的过程。当用户输入一个网址时&#xff0c;计算机会先向本地DNS服务器发送一个查询请求…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据

对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统&#xff08;1&#xff09;-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统&#xff08;2&#xff09;折线图显示-CSDN博客继续优化&#xff0c;增加一个保存按钮&#xff0c;用于保存成绩数据…...

ChatGPT 4:新特性与优势

ChatGPT 4&#xff1a;新特性与优势 一、引言 ChatGPT 4是一款备受瞩目的人工智能模型&#xff0c;它以其强大的语言生成能力和智能回答能力&#xff0c;为用户提供了更高效、更便捷的对话体验。为了能够充分享受ChatGPT 4的各项功能&#xff0c;本文将向您详细介绍其新特性&…...

【教程】MySQL数据库学习笔记(二)——数据类型(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、整…...

Servo的并发模型介绍

Servo是一个由Mozilla Research开发的实验性浏览器引擎&#xff0c;旨在为未来的网页和应用程序提供高性能的渲染。Servo的并发模型是其核心特点之一&#xff0c;它利用现代多核处理器的优势&#xff0c;通过异步编程和并行处理来提高渲染效率和响应性。以下是对Servo并发模型的…...

Vue3大事件项目(ing)

文章目录 核心内容1.大事件项目介绍2.大事件项目创建3.Eslint配置代码风格4.配置代码检查工作流问题: pnpm lint是全量检查,耗时问题,历史问题 5.目录调整6.vue-router4 路由代码解析7.引入 Element Plus 组件库8.Pinia 构建仓库 和 持久化9.Pinia 仓库统一管理 核心内容 Vue3…...

基于spring boot实现邮箱发送和邮箱验证

目录 一、邮箱发送实现1. 开通邮箱服务2. 添加邮箱依赖3.添加配置4.添加邮箱通用类5. 测试类 二、邮箱验证实现1.添加依赖2. 添加配置3.添加controller4. 测试 项目地址: https://gitee.com/nssnail/springboot-email 一、邮箱发送实现 1. 开通邮箱服务 使用qq邮箱、163邮箱都…...

华清作业day56

SQLite特性&#xff1a; 零配置一无需安装和管理配置&#xff1b;储存在单一磁盘文件中的一个完整的数据库&#xff1b;数据库文件可以在不同字节顺序的机器间自由共享&#xff1b;支持数据库大小至2TB&#xff1b;足够小&#xff0c;全部源码大致3万行c代码&#xff0c;250KB…...

【FPGA】VHDL:八段码到8421BCD码转换电路

目录 EDA设计基础练习题 &#xff1a; 实验要求如下&#xff1a; 代码 八段码到8421BCD码转换电路 8421BCD码到八段码转换电路 八段码到8421BCD~运行结果展示 8421BCD转八段码~运行结果展示 特别注意 软件&#xff1a;Quartus II 13.0 (64-bit) 语言&#xff1a;VHDL E…...

docker安装、运行

1、安装 之前有docker的话&#xff0c;需要先卸载旧版本&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装之前需要安装yum工具&#xff1a; sud…...

新型RedAlert勒索病毒针对VMWare ESXi服务器

前言 RedAlert勒索病毒又称为N13V勒索病毒&#xff0c;是一款2022年新型的勒索病毒&#xff0c;最早于2022年7月被首次曝光&#xff0c;主要针对Windows和Linux VMWare ESXi服务器进行加密攻击&#xff0c;到目前为止该勒索病毒黑客组织在其暗网网站上公布了一名受害者&#x…...

qt-C++笔记之判断一个QLabel上有没有load图片

qt-C笔记之判断一个QLabel上有没有load图片 code review! 在Qt框架中&#xff0c;QLabel是用来显示文本或者图片的一个控件。如果你想判断一个QLabel控件上是否加载了图片&#xff0c;你可以检查它的pixmap属性。pixmap属性会返回一个QPixmap对象&#xff0c;如果没有图片被加…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Menu组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Menu组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Menu组件 以垂直列表形式显示的菜单。 子组件 包含MenuItem、MenuItemGroup子组…...

vue三种路由守卫详解

在 Vue 中&#xff0c;可以通过路由守卫来实现路由鉴权。Vue 提供了三种路由守卫&#xff1a;全局前置守卫、全局解析守卫和组件内的守卫。 全局前置守卫 通过 router.beforeEach() 方法实现&#xff0c;可以在路由跳转之前进行权限判断。在这个守卫中&#xff0c;可以根据用…...

【Linux】线程概念和线程控制

线程概念 一、理解线程1. Linux中的线程2. 重新定义线程和进程3. 进程地址空间之页表4. 线程和进程切换5. 线程的优点6. 线程的缺点7. 线程异常8. 线程用途9. 线程和进程 二、线程控制1. pthread 线程库&#xff08;1&#xff09;pthread_create()&#xff08;2&#xff09;pth…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...