参考 【K8s】初识PV和PVC 章节《2.4.3 挂载NFS至容器》前置结论先回顾 NFS 是网络文件系统可以把远端服务器上的目录通过网络挂载成本地目录。K8s 里可以把 NFS 挂载进 Pod实现数据持久化。 ⚠️ 原文重点提醒生产不推荐单机 NFS因为 NFS 服务端是单点故障测试 / 非生产环境用来快速验证存储挂载很方便。公有云场景优先用云厂商 NAS。环境说明NFS 服务端k8s-node01IP192.168.1.34提供共享目录集群其他节点master、其他 nodeNFS 客户端只需要安装客户端工具不需要启动 nfs-server1. 每台机器安装 NFS 客户端yum install nfs-utils -ynfs-utilsNFS 全套工具包所有 K8s 节点master 所有 node都要装因为 Pod 调度到任意节点节点都要能挂载 NFS。包含挂载命令mount.nfs、查看共享showmount等工具。注意服务端也要装这个包里面包含nfs-server服务。2. k8s-node01NFS 服务端启动 nfs 服务systemctl start nfs-servernfs-serverNFS 服务端守护进程只有提供共享的那台机器才需要启动。cat /proc/fs/nfsd/versions -2 3 4 4.1 4.2查看内核 NFS 服务端支持协议版本-2不支持 NFSv23 4 4.1 4.2支持 NFSv3、v4、v4.1、v4.2K8s 挂载默认优先 NFS4v4 性能更好支持文件锁。3. NFS 服务端创建共享目录mkdir -p /data/nfs/test_nfs-p父目录不存在自动创建/data/nfs就是对外共享的根目录。4. 编辑 服务端NFS 授权配置文件/etc/exportsvim /etc/exports /data/nfs/ 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)/etc/exports是 NFS 核心配置定义哪些客户端可以访问哪个目录、权限是什么字段拆解/data/nfs/本地要共享出去的目录192.168.1.0/24允许访问的客户端网段你的 K8s 集群机器都在这个网段括号内选项rw读写权限readwrite如果是ro就是只读sync同步写入数据落盘后才返回成功稳定性更高async异步性能高但断电丢数据风险no_subtree_check关闭子树校验提升性能常用no_root_squash重点默认 NFS 会把客户端root用户映射成匿名用户nobodyno_root_squash客户端 root 保持 root 身份。K8s 场景经常需要加这个不然容器内 root 写入 NFS 目录会报权限不足生产慎用有安全风险。5. 服务端配置生效exportfs -rexportfs -rexportfsNFS 管理共享的命令-rreload重新读取/etc/exports加载共享配置不用重启服务常用配套查看命令exportfs -v查看当前已发布共享6. 服务端重载 NFS 服务systemctl reload nfs-serverreload平滑重载配置不中断现有 NFS 连接新增 / 修改 exports 后exportfs -r reload 双重保险。7. 在 k8s-master01客户端挂载测试mount -t nfs 192.168.1.34:/data/nfs /mnt/-t nfs指定文件系统类型为 nfs192.168.1.34:/data/nfsNFS 服务端地址 共享目录/mnt/本地挂载点远端 NFS 目录挂载到本地 /mntcd /mnt/ touch test123进入挂载目录新建test123文件。原理写入/mnt本质是通过网络写到远端k8s-node01:/data/nfs。8. NFS 服务端验证文件cd /data/nfs/ ls test123 test_nfs到 NFS 服务端的共享目录查看 ✅ 看到刚才 master 上创建的test123说明 NFS 共享挂载成功。文件存在远端机器上。9、和 K8s 容器挂载的关联这几步只是底层 NFS 预验证上面全部是宿主机层面验证 NFS 通不通还没到容器。 下一步才会写 K8s PV/PVC在 Pod 资源清单里引用 NFS 存储直接把 NFS 目录挂载进容器内部。简单示例 PVapiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.34 path: /data/nfs10、Pod Yaml 直接挂载 NFS不使用 PV/PVC简易方式K8s Pod 原生支持直接在volumes字段指定nfs不需要提前创建 PV、PVC适合快速测试。 底层原理Pod 调度到哪个节点该节点就会调用宿主机mount.nfs挂载远端 NFS。 ⚠️ 前提集群所有节点已经提前安装 nfs-utils前面步骤已经做了pod-nfs-direct.yamlapiVersion: v1 kind: Pod metadata: name: nfs-direct-pod spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 volumeMounts: # 将 volume 挂载到容器内路径 /usr/share/nginx/html - name: nfs-storage mountPath: /usr/share/nginx/html volumes: # 直接定义nfs卷无需PV/PVC - name: nfs-storage nfs: server: 192.168.1.34 # NFS服务端IP就是k8s-node01 path: /data/nfs # NFS服务端共享目录/etc/exports里配置的目录 readOnly: false # false读写true只读字段解释volumes.name: nfs-storage卷名称自定义要和下面volumeMounts.name对应volumes.nfs.serverNFS 服务 IPvolumes.nfs.pathNFS 服务端导出的共享目录volumeMounts.mountPath容器内部的挂载点容器里这个目录就是 NFS 远端目录优缺点直接 NFS 挂载无 PV/PVC✅ 优点极简一条 yaml 搞定不用维护 PV/PVC 资源适合临时测试快速验证 NFS 在 Pod 中读写❌ 缺点生产严禁使用没有存储生命周期管理无法做存储配额无法复用多个 Pod 不能统一声明存储每个 Pod 都要硬编码 NFS 地址没有抽象NFS 地址写死在 Pod yamlNFS 服务 IP 变更所有 Pod yaml 都要改不支持 StorageClass不能动态供给