Skip to content

第 11 章 客户端挂载

11.1 Linux 客户端安装与挂载

安装 NFS 客户端

bash
# Ubuntu
apt install -y nfs-common

# Rocky
dnf install -y nfs-utils

临时挂载

bash
mkdir -p /mnt/nfs-ha
mount -t nfs -o vers=4.1,hard,intr,timeo=600,retrans=3 10.0.0.100:/gv0 /mnt/nfs-ha

验证挂载

bash
df -h /mnt/nfs-ha
touch /mnt/nfs-ha/testfile
ls -l /mnt/nfs-ha/testfile

11.2 /etc/fstab 持久化配置

编辑 /etc/fstab,添加:

10.0.0.100:/gv0 /mnt/nfs-ha nfs4 defaults,_netdev,hard,intr,timeo=600,retrans=3 0 0

自动挂载

bash
mount -a

_netdev 选项告诉系统这是一个网络文件系统,网络就绪后再挂载。

11.3 挂载参数最佳实践

推荐参数

参数推荐值说明
vers4.1NFSv4.1
hard-故障时持续重试
intr-允许中断
timeo600超时 60 秒
retrans3重试次数
_netdev-网络文件系统
noatime-不更新访问时间
nolock视情况NFSv4 已内置锁,可不加

完整示例

bash
mount -t nfs -o vers=4.1,hard,intr,timeo=600,retrans=3,_netdev,noatime 10.0.0.100:/gv0 /mnt/nfs-ha

11.4 Kubernetes NFS 动态供给

安装 NFS Subdir External Provisioner

bash
helm repo add nfs-subdir-external-provisioner \
  https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update

部署 Provisioner

bash
helm install nfs-provisioner \
  nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=10.0.0.100 \
  --set nfs.path=/gv0 \
  --set storageClass.defaultClass=true

创建 StorageClass 和 PVC

默认会创建 StorageClass nfs-client。验证:

bash
kubectl get sc
kubectl get pods -n default

测试 PVC

yaml
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
EOF

验证:

bash
kubectl get pvc test-pvc

在 Pod 中使用

yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-pvc

11.5 多客户端并发访问测试

场景 1:多节点写入

在 client1 和 client2 同时执行:

bash
# client1
for i in {1..100}; do echo "client1-$i" >> /mnt/nfs-ha/shared.log; done

# client2
for i in {1..100}; do echo "client2-$i" >> /mnt/nfs-ha/shared.log; done

场景 2:大文件传输

bash
dd if=/dev/zero of=/mnt/nfs-ha/bigfile bs=1M count=1024

场景 3:故障切换测试

在客户端持续写入的同时,停止当前持有 VIP 节点的 Ganesha 服务,观察写入是否中断后恢复。

bash
while true; do date >> /mnt/nfs-ha/failover-test.log; sleep 1; done

11.6 本章小结

  • Linux 客户端使用 nfs-common/nfs-utils
  • 推荐 NFSv4.1 + hard 挂载
  • /etc/fstab 中加入 _netdev 确保网络就绪后挂载
  • Kubernetes 使用 nfs-subdir-external-provisioner 动态供给 PVC
  • 多客户端并发测试可验证高可用性

练习题

  1. 为什么 _netdev 参数在 fstab 中很重要?
  2. NFSv4 是否需要额外配置 nolock
  3. Kubernetes 中 ReadWriteMany 访问模式有什么要求?
  4. 设计一个测试方案,验证 VIP 漂移时客户端 IO 是否中断。