跳转到内容

nfs

starlightBlog.tags.count

赛博拆迁办:安全切断外接大水管 (卸载 NFS 动态供应器)

在赛博工地,拆迁工作也分危险等级。如果说卸载 Longhorn 相当于“定向爆破承重墙”,那么卸载 NFS 动态供应器仅仅相当于**“辞退了一个水管工”**。

因为 NFS 的实际数据都安全地躺在你远端的 TrueNAS 或群晖里,K3s 集群内运行的仅仅是一个负责“自动建文件夹和接管子”的调度程序(Provisioner)。所以,它的卸载过程非常轻松且无痛。

尽管如此,为了保证集群状态的绝对干净,包工头还是建议你按照标准协议进行拆除。

⚠️ 拆除前置:清退依赖水管的租客

Section titled “⚠️ 拆除前置:清退依赖水管的租客”
安全规范

在辞退水管工之前,最好先确认集群里是否还有应用正在使用 nfs-client 这个存储类(StorageClass)。

如果还有应用在用,当你卸载了供应器后,这些应用原本挂载的旧硬盘虽然还能读写,但未来如果它们意外重启或者你需要扩容,由于失去了“水管工”的调度,它们可能会陷入异常状态。

检查指令:

Terminal window
# 查看是否还有绑定到 nfs-client 的 PVC(存储声明)
kubectl get pvc -A | grep nfs-client

(如果输出为空,说明水管已经全部闲置,可以放心开拆。如果还有业务在使用,请先决定是保留业务,还是将其连同 PVC 一并删除。)


  1. 呼叫 Helm 拆迁队 (Uninstall Provisioner)

    因为我们是使用 Helm 规范化部署的,直接用一条命令就可以把水管工(Pod)、它的权限(RBAC)以及图纸代号(StorageClass)全部带走:

    Terminal window
    helm uninstall nfs-provisioner -n kube-system

    预期输出:release "nfs-provisioner" uninstalled。此时,K8s 已经失去了自动在 NAS 上划分目录的能力。

  2. 打扫物理 NAS 的残余数据 (Manual Cleanup)

    还记得我们在上一篇配置 values.yaml 时,特意加了一个防爆机制 archiveOnDelete: true 吗?

    正是因为这个机制,即使你之前在 K8s 里删除了测试用的 PVC,水管工也不会真的去删你 NAS 里的数据,而是会将那个文件夹重命名,加上 archived- 前缀。

    现在,水管工已经被我们辞退了,这部分“赛博垃圾”就需要你手动去清理了:

    • 登录你物理 NAS 的后台(TrueNAS / 群晖)。
    • 打开文件管理器,进入你分配给 K8s 的那个共享根目录(例如 /mnt/pool/k8s_nfs)。
    • 你会看到一些名字带有 archived- 开头的文件夹。如果你确认这些数据都已经没用了,直接在 NAS 后台右键 -> 删除即可,彻底释放物理空间。
  3. 清理本地 Helm 仓库 (可选)

    如果你有极度的强迫症,不想在本地电脑上留下任何痕迹,可以顺手把官方的图纸源也删掉:

    Terminal window
    helm repo remove nfs-subdir-external-provisioner

最后,敲下这行命令,看看 K8s 的“存储物资局”里还有没有这张图纸:

Terminal window
kubectl get storageclass

如果输出的列表中已经找不到 nfs-client,且终端里没有任何关于 nfs-provisioner 的报错,那么恭喜你,这根外接大水管已经被安全、干净地彻底切断!

PVE 宿主机实战:4T USB 硬盘挂载与 NFS 权限配置指南

在 PVE 环境中,将大容量 USB 硬盘挂载至宿主机并开启 NFS 共享,是实现跨虚拟机数据共享的高效方案。但在实际操作中,磁盘识别错误会导致数据丢失,网段配置不当会导致访问受阻。本文记录了从底层格式化到权限调优的标准流程。


在执行任何格式化操作前,必须核对物理磁盘。

Terminal window
lsblk

注意: 观察磁盘容量(如 3.7T)和类型。通常系统盘为 sda,外挂盘可能为 sdbsdc。请在后续步骤中将 /dev/sdb 替换为你实际识别到的磁盘代号。一旦选错,数据将不可恢复。

对于超过 2T 的硬盘,必须使用 GPT 分区表:

Terminal window
# 使用 fdisk 工具(以 /dev/sdb 为例,请按实际修改)
fdisk /dev/sdb
# 交互指令:
# 输入 g (创建 GPT 分区表)
# 输入 n (创建新分区,起始和结束扇区均按回车保持默认)
# 输入 w (写入并退出)
# 格式化分区为 ext4
mkfs.ext4 /dev/sdb1

使用 UUID 挂载可以防止 USB 插拔后驱动器路径改变。

Terminal window
# 获取 UUID
blkid /dev/sdb1
# 记录 UUID="xxxxxxxx-xxxx-..." 部分
# 创建挂载点
mkdir -p /mnt/nfs
# 修改系统挂载表
nano /etc/fstab
# 在末尾添加(替换为你实际的 UUID):
UUID=你的UUID /mnt/nfs ext4 defaults 0 2
# 生效挂载
mount -a

二、 NFS 服务安装与核心权限配置

Section titled “二、 NFS 服务安装与核心权限配置”
Terminal window
apt update && apt install -y nfs-kernel-server

编辑配置文件:nano /etc/exports,添加如下配置:

/mnt/nfs 10.0.0.0/16(rw,sync,no_subtree_check,no_root_squash,insecure)
  1. 网段地址 (10.0.0.0/16)必须按实际修改。这里的地址定义了谁能访问此共享。
    • 如果你的 IP 是 192.168.1.x,请填入 192.168.1.0/24
    • 使用 /16 掩码(如 10.0.0.0/16)可以覆盖 10.0.x.x 范围内的所有 IP,适合多子网环境。
  2. insecure (关键): 默认 NFS 要求客户端使用 1024 以下端口,而 Kubernetes/K3s 等容器化平台挂载时常使用高位随机端口。不加此参数会导致 Access Denied
  3. no_root_squash: 允许客户端以 root 权限写入,这对于需要持久化存储的应用(如数据库、媒体库)至关重要。

修改配置后必须手动刷新导出表:

Terminal window
# 强制重新导出所有路径
exportfs -ra
# 查看当前生效的完整配置
exportfs -v

验收标准:exportfs -v 的输出中,确认包含了你设置的路径和网段,并且权限列表中出现了 insecure


  • 磁盘休眠:部分 USB 硬盘盒会自动进入休眠,可能导致 Pod 首次挂载超时。
  • 网络防火墙:若挂载失败,请检查 PVE 节点是否开启了数据中心防火墙,确保 2049 端口已对目标网段放行。