新闻详情

新闻详情

首页 / 资讯中心 / 详情

05_在k8s集群中安装NFS实现ReadWriteMany存储

发布时间:2026/9/27 5:04:12来源:尧图网络
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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

3个细节决定生死,一文搞懂网站建设产品中心SEO逻辑 2026/9/27 5:54:49

3个细节决定生死,一文搞懂网站建设产品中心SEO逻辑

3个细节决定生死,一文搞懂网站建设产品中心SEO逻辑 网站做好了没人访问,这大概是每个创业团队负责人最头疼的事。你花了大几万甚至十几万定制开发,页面美观、功能齐全,结果上线三个月,百度收录不到十个页面,每天UV只有个位数。别急着怪百度,问题…

阅读更多 →
3招搞定wordpress插件支付宝积分,选哪家好看这几点 2026/9/27 5:54:36

3招搞定wordpress插件支付宝积分,选哪家好看这几点

3招搞定wordpress插件支付宝积分,选哪家好看这几点 很多老板做站,第一反应就是找个现成模板套一下,结果上线一看,页面丑得像十年前的网吧主页,功能还缺失,根本留不住人。这时候你才意识到,光有模板不够,还得看 哪家好…

阅读更多 →
3步搞定怎么改网站内容,零基础从零搭建避坑指南 2026/9/27 5:54:36

3步搞定怎么改网站内容,零基础从零搭建避坑指南

3步搞定怎么改网站内容,零基础从零搭建避坑指南 很多老板找上门,第一句话不是问价格,而是抱怨:“我那个网站,我想改个电话号码、换张产品图,结果技术员说太忙,要排期一周。我自己点后台,要么没反应,要么一保存页面就乱了。” 这就是典型的…

阅读更多 →
网上购物网站开发的背景及域名备案避坑指南,选哪家好 2026/9/27 5:54:29

网上购物网站开发的背景及域名备案避坑指南,选哪家好

网上购物网站开发的背景及域名备案避坑指南,选哪家好 做电商网站最让人头秃的,往往不是代码怎么写,而是 备案流程一头雾水 。很多老板花大价钱找了开发团队,结果网站做出来了,因为域名没备案或者备案信息不对,导致服务器直接停机,甚至被阿里云官方文…

阅读更多 →
5.2 备考复习 2026/9/27 5:54:10

5.2 备考复习

备考是学习场景里压力最集中的阶段,例如知识点太多、时间有限、不知道重点在哪里、零散的笔记不知道怎么整合成能背的内容。大模型在备考阶段最实用用途可以是,根据大纲生成复习重点、针对薄弱章节出练习题、把零散笔记整理成结构化的要点、帮难记的知识…

阅读更多 →
Win11打印失败根源:RPCSS与DCOM服务依赖故障解析 2026/9/27 5:54:10

Win11打印失败根源:RPCSS与DCOM服务依赖故障解析

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉