尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
05_在k8s集群中安装NFS实现ReadWriteMany存储
文章目录0 背景与架构0.1 为什么需要NFS0.2 环境架构0.3 镜像拉取方案1 配置NFS服务器rockylinux10-41.1 创建出 rockylinux10-41.2 安装nfs-utils1.3 创建共享目录并设置权限1.4 配置/etc/exports1.5 启动并启用nfs-server1.6 验证NFS共享2 在所有K8s节点安装nfs-utils客户端3 部署nfs-subdir-external-provisioner3.1 下载部署文件3.2 修改deployment.yaml3.3 应用部署4 验证部署4.1 查看 Pod 状态4.2 查看 StorageClass5 测试RWX PVC5.1 创建 RWX PVC5.2 创建两个 Pod 同时挂载5.3 验证数据共享6 常见问题与解决6.1 镜像拉取失败ImagePullBackOff6.2 Pod 一直 Pending6.3 挂载失败7 总结感谢阅读0 背景与架构0.1 为什么需要NFS在 《02_在多个RockyLinux10虚拟机上安装k8s集群》 和 《04_在k8s集群中安装OpenEBS Rawfile并测试快照》 之后我们的集群已经具备了本地存储Rawfile和快照能力。但 Rawfile 只支持ReadWriteOnceRWO而很多场景例如多个Pod同时读写同一份数据需要ReadWriteManyRWX。NFS 是 Kubernetes 中原生支持 RWX 的存储方案之一它允许多个节点上的多个 Pod 同时挂载同一个共享目录并进行读写。非常适合学习 PVC 的不同访问模式尤其是 RWX。0.2 环境架构IP虚拟机名称角色说明192.168.56.101rockylinux10-1control-planek8s master 节点192.168.56.102rockylinux10-2workerk8s worker 节点192.168.56.103rockylinux10-3workerk8s worker 节点192.168.56.104rockylinux10-4NFS Server独立的 NFS 服务器这个是从 rockylinux10-1 的 VirtualBox 快照中复制出来后配置的0.3 镜像拉取方案由于国内网络限制我们采用以下镜像源原始仓库替换地址用途docker.iodocker.m.daocloud.ioDaoCloud 镜像加速registry.k8s.iok8s.m.daocloud.ioDaoCloud 的 k8s 镜像代理1 配置NFS服务器rockylinux10-41.1 创建出 rockylinux10-4从 rockylinux10-1 的 VirtualBox 快照rockylinux10-init中复制出 rockylinux10-4如下图在弹出的对话框中做如下图的配置复制好之后启动 rockylinux10-4我们来修改它的静态 ip 和 hostname 。这块儿可以参考 《02_在多个RockyLinux10虚拟机上安装k8s集群》 的1.14 设置静态IP小节的内容。由于 rockylinux10-4 是从 rockylinux10-1 复制出来的所以不用想现在 rockylinux10-4 的静态 ip 肯定是192.168.56.101我们直接在 rockylinux10-4 中执行nmtui命令如下图回车之后回车之后按照上图的编辑好之后一路 OK就好。然后设置 hotstname 主机名hostnamectl set-hostname rockylinux10-4然后 reboot 重启 rockylinux10-4 。重启之后给 rockylinux10-1 到 10-4 的每台机器设置一下 /etc/hosts 保证有如下内容192.168.56.101 rockylinux10-1192.168.56.102 rockylinux10-2192.168.56.103 rockylinux10-3192.168.56.104 rockylinux10-41.2 安装nfs-utils在rockylinux10-4上执行sudodnfinstall-ynfs-utils1.3 创建共享目录并设置权限sudomkdir-p/data/k8s-nfssudochownnobody:nobody /data/k8s-nfssudochmod777/data/k8s-nfs这里设置为nobody:nobody和777是为了简化权限生产环境请根据实际需求调整。1.4 配置/etc/exports编辑/etc/exports添加以下内容/data/k8s-nfs192.168.56.0/24(rw,sync,no_subtree_check,no_root_squash)参数说明rw读写权限sync同步写入no_subtree_check不检查子树提高性能no_root_squash允许 root 用户保持权限方便测试1.5 启动并启用nfs-serversudoexportfs-rasudosystemctl restart nfs-serversudosystemctlenablenfs-server1.6 验证NFS共享sudoshowmount-elocalhost期望输出Export list for localhost: /data/k8s-nfs 192.168.56.0/242 在所有K8s节点安装nfs-utils客户端Kubernetes 的 kubelet 需要调用mount -t nfs来挂载 NFS因此每个节点都需要安装nfs-utils。在rockylinux10-1、10-2、10-3上分别执行sudodnfinstall-ynfs-utils--disablerepodocker-ce-stable加--disablerepodocker-ce-stable是为了跳过可能会连接失败的 Docker 仓库避免dnf卡住。如果已经永久禁用了该仓库可以省略此参数。3 部署nfs-subdir-external-provisionernfs-subdir-external-provisioner是 Kubernetes SIG-Storage 官方维护的项目它可以在 NFS 共享目录下自动创建子目录作为 PV实现动态供应。3.1 下载部署文件在 master 节点rockylinux10-1上执行mkdir-p~/nfs-provisionercd~/nfs-provisioner# 下载三个 YAML 文件curl-Ohttps://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/deployment.yamlcurl-Ohttps://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yamlcurl-Ohttps://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml如果curl下载失败可以用浏览器打开链接保存文件。3.2 修改deployment.yaml需要修改三个地方a. 修改 NFS 服务器地址和路径找到env部分改成你的 NFS 服务器信息env:-name:PROVISIONER_NAMEvalue:k8s-sigs.io/nfs-subdir-external-provisioner-name:NFS_SERVERvalue:192.168.56.104# NFS 服务器 IP-name:NFS_PATHvalue:/data/k8s-nfs# NFS 共享路径volumes:-name:nfs-client-rootnfs:server:192.168.56.104# 同上path:/data/k8s-nfs# 同上b. 修改镜像地址为国内可访问的原镜像registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2国内拉不动改成 DaoCloud 的镜像源image:docker.m.daocloud.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2c. 确认镜像版本当前最新稳定版是v4.0.2。如果拉取失败可以试试v4.0.1或v4.0.0。3.3 应用部署kubectl apply-frbac.yaml kubectl apply-fdeployment.yaml kubectl apply-fclass.yaml4 验证部署4.1 查看 Pod 状态kubectl get pods|grepnfs-client期望输出nfs-client-provisioner-6bd7ff8964-gf9jv 1/1 Running 0 2m4.2 查看 StorageClasskubectl get sc期望输出NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE AGE nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate 2m5 测试RWX PVC5.1 创建 RWX PVC创建文件test-pvc-rwx.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:demo-rwx-pvcspec:accessModes:-ReadWriteManystorageClassName:nfs-clientresources:requests:storage:1Gi应用kubectl apply-ftest-pvc-rwx.yaml kubectl get pvc期望输出NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE demo-rwx-pvc Bound pvc-e380223a-732e-4446-89e9-20af374a7803 1Gi RWX nfs-client 10s5.2 创建两个 Pod 同时挂载创建文件test-pods-rwx.yamlapiVersion:v1kind:Podmetadata:name:demo-rwx-pod-1spec:containers:-name:busyboximage:m.daocloud.io.localcache.registry:65000/docker.io/library/busybox:1.38.0command:[/bin/sh,-c,while true; do echo pod-1 /mnt/data/test.txt; sleep 5; done]volumeMounts:-name:datamountPath:/mnt/datavolumes:-name:datapersistentVolumeClaim:claimName:demo-rwx-pvc---apiVersion:v1kind:Podmetadata:name:demo-rwx-pod-2spec:containers:-name:busyboximage:m.daocloud.io.localcache.registry:65000/docker.io/library/busybox:1.38.0command:[/bin/sh,-c,while true; do echo pod-2 /mnt/data/test.txt; sleep 5; done]volumeMounts:-name:datamountPath:/mnt/datavolumes:-name:datapersistentVolumeClaim:claimName:demo-rwx-pvc应用kubectl apply-ftest-pods-rwx.yaml kubectl get pods-owide5.3 验证数据共享进入任意一个 Pod 查看文件内容kubectlexec-itdemo-rwx-pod-1 --cat/mnt/data/test.txt你会看到pod-1和pod-2交替出现证明RWX 生效。6 常见问题与解决6.1 镜像拉取失败ImagePullBackOff现象nfs-client-provisionerPod 处于ImagePullBackOff。排查kubectl describe pod-lappnfs-client-provisioner|grep-EImage:|Failed解决将deployment.yaml中的镜像地址替换为国内可访问的镜像源例如image:docker.m.daocloud.io/sig-storage/nfs-subdir-external-provisioner:v4.0.26.2 Pod 一直 Pending现象使用 RWX PVC 的 Pod 一直Pending。排查kubectl describe podpod-name常见原因PVC 未绑定检查 PVC 状态确保STATUS为Bound。节点资源不足检查节点 CPU/内存。节点污点Master 节点有污点Pod 需要容忍度。6.3 挂载失败现象Pod 事件中出现mount failed或permission denied。解决确认所有节点已安装nfs-utils。确认 NFS 服务器共享目录权限正确/data/k8s-nfs为777或合适的权限。确认/etc/exports中no_root_squash已设置并执行exportfs -ra。7 总结通过本文我们完成了以下工作配置了 NFS 服务器在rockylinux10-4上安装并启动了 NFS 服务共享/data/k8s-nfs目录。在所有 K8s 节点安装了 nfs-utils确保 kubelet 可以挂载 NFS。部署了 nfs-subdir-external-provisioner实现了 NFS 存储的动态供应并创建了nfs-clientStorageClass。测试了 RWX PVC创建了ReadWriteMany的 PVC并用两个 Pod 同时挂载验证了多节点读写共享。感谢阅读
RELATED

相关推荐

Graylog Web 界面 NavDropdown 导航下拉组件开发指南:API、实现原理与实战案例

Graylog Web 界面 NavDropdown 导航下拉组件开发指南:API、实现原理与实战案例

日志分析运维观测 【免费下载链接】graylog2-server Free and open log management 项目地址: https://gitcode.com/gh_mirrors/gr/graylog2-server 点击查看 免费下载 导读 本文围绕 Graylog2-server 仓库中 graylog2-web-interface 前端组件库的 NavDropdown 组…

📅 2026/9/27 5:04:18
产线安规误判根因排查:接地、夹具、干扰、参数四大硬核方向

产线安规误判根因排查:接地、夹具、干扰、参数四大硬核方向

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/27 5:04:18
WordPress评论后自动刷新实战:解决网站被黑挂马隐患,选型哪家好看这篇

WordPress评论后自动刷新实战:解决网站被黑挂马隐患,选型哪家好看这篇

WordPress评论后自动刷新实战:解决网站被黑挂马隐患,选型哪家好看这篇 网站被黑挂马不知道怎么办?这种深夜惊魂时刻,90%的站长都经历过。页面突然多了博彩广告,后台多出陌生管理员,甚至域名直接被搜索引擎收录了非法内容。这时候你找运维问…

📅 2026/9/27 5:04:18
MORE NEWS

更多资讯

📰

Storm 数据倾斜处理:Shuffle 倾斜、Field Grouping 热点与自定义分组

Storm 数据倾斜处理:Shuffle 倾斜、Field Grouping 热点与自定义分组1. 数据倾斜现象与危害 Storm 作为实时计算框架,数据倾斜会导致部分 Worker 负载过高,其他 Worker 空闲,严重影响整体吞吐量。常见表现为任务执行时间延长、资源…

📰

微波简答题实战指南:从电磁场到S参数的物理直觉构建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

拒绝被坑:3步搞定wordpress形式官网,免费工具全揭秘

拒绝被坑:3步搞定wordpress形式官网,免费工具全揭秘 找建站公司怕被坑高价,是很多中小企业主的噩梦。市面上报价从几千到几万不等,交付周期拖沓,后期维护更是无底洞,让人避之不及。其实,用 wordpress形式 搭建官网,配合…

📰

做国际英文网站别只拼价格,3个维度对比评测帮你省下10万设计费

做国际英文网站别只拼价格,3个维度对比评测帮你省下10万设计费 做外贸站的老板们,是不是经常盯着那些几百块的模板网站直皱眉?页面排版挤得像早高峰的地铁,字体小得看不清,颜色花里胡哨却毫无逻辑,客户点开两秒就关掉了。 模板网站太丑不够用…

📰

NetWatch深度包检测实战:15种L7协议解码器全解析,从SNI提取到QUIC/HTTP3重组

NetWatch深度包检测实战:15种L7协议解码器全解析,从SNI提取到QUIC/HTTP3重组 【免费下载链接】netwatch Real-time network diagnostics in your terminal. One command, zero config, instant visibility. 项目地址: https://gitcode.com/gh_mirrors/…

📰

Coze搭建AI智能体

进入coze 的官方网站 https://code.coze.cn/home , 我们选择智能体开发 可以通过聊天创建小程序,网页应用、移动应用 ; 智能体开发: “几步就能创造智能体,和用户深度交互”。 核心本质:创造一个具备“大脑…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬