macos 启用 nfs-server

macos 启用 nfs-server

1
2
3
	sudo vi /etc/exports
	添加如下内容
	/Users/huangxiaofeng/nas_a -alldirs  -maproot=huangxiaofeng:wheel

为了能让 k8s 使用 nfs-server。需要再操作一下

在/etc/nfs.conf中
```
nfs.server.mount.require_resv_port = 0
```

服务启动命令

1
2
3
4
5
6
sudo nfsd start # 启动服务
sudo nfsd stop # 停止服务
sudo nfsd restart # 重启服务
sudo nfsd status # 查看状态
sudo nfsd enable # 开机自启
sudo nfsd disable # 禁止开机自启

检查配置是否生效

1
showmount -e

image.png 为了更好的使用,可以进行本地测试

1
2
3
## 创建client角色的目录,就是被挂载的目录
mkdir /Users/caiwenhui/nas_a2
 sudo mount -t nfs -o nolock,nfsvers=3,vers=3 127.0.0.1:/Users/huangxiaofeng/nas_a /Users/huangxiaofeng/nas_a2

挂载成功之后,尝试在 client 目录添加文件

1 touch /Users/huangxiaofeng/nas_a2/hello

查看 server 目录是否有文件同步

1 2 ls /Users/huangxiaofeng/nas_a hello

这个时候会发现 nas_a 目录下,自动多了一个hello的文件

取消挂在,可以在finder中直接弹出挂载,或者使用如下命令即可。

1 umount /Users/huangxiaofeng/nas_a2

k8s 中测试 nfs

NFS PersistentVolume

前面我们已经在 mac 上启动了一个 NFS 服务,现在通过在 k8s 上创建一个 PersistentVolume 来使用 NFS。

创建一个 PV,编辑配置文件nfs-pv-1.yaml,内容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ➜ ~ cat nfs-pv-1.yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfspv1 spec: mountOptions: - nfsvers=3 - nolock capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs nfs: path: /Users/caiwenhui/nas_a server: docker.for.mac.host.internal

nfs 相关的配置:

  • nfsvers=3 使用 v3 协议
  • 路径就是 nfs 上的目录
  • 注意这里,我们的服务器 ip,如果不能明确的目前现在的网络通信情况的下,请使用docker.for.mac.host.internal

 申请资源 PV。

1 kubectl apply -f nfs-pv-1.yaml

查看资源状态。

1 2 3 ➜ ~ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfspv1 2Gi RWO Recycle Available nfs 13h

STATUS 为Available表示 nfspv1 就绪,可以被 PVC 申请。

PersistentVolumeClaim

下面创建 PVC,编辑 nfs-pvc-1.yaml 文件

1 2 3 4 5 6 7 8 9 10 11 12 ➜ ~ cat nfs-pvc-1.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfspvc1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs

申请资源 PVC。

1 kubectl apply -f nfs-pvc-1.yaml

查看 pvc 状态/查看 pv 状态。

1 2 3 4 5 6 7 ➜ ~ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfspvc1 Bound nfspv1 10Gi RWO nfs 85s ➜ ~ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfspv1 2Gi RWO Recycle Bound default/nfspvc1 nfs 13h

这里,我们可以看到  status = bound,代表此时pvpvc已经绑定在一起了。这样子我们就可以把podpvc绑定。

cat « EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-csi provisioner: nfs.csi.k8s.io parameters: server: 192.168.2.3 # 这里填 NFS Server 地址 share: /Users/huangxiaofeng/nas_a csi.storage.k8s.io/provisioner-secret-name: “mount-options” csi.storage.k8s.io/provisioner-secret-namespace: “kube-system” reclaimPolicy: Delete volumeBindingMode: Immediate mountOptions:

  • nfsvers=3
  • hard EOF
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

  cat << EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.2.3
  share: /Users/huangxiaofeng/nas_a
  csi.storage.k8s.io/provisioner-secret-name: "mount-options"
  csi.storage.k8s.io/provisioner-secret-namespace: "kube-system"
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
  - hard
EOF

  cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: nfs-csi
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pvc-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: test-pvc
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
EOF
Licensed under CC BY-NC-SA 4.0
最后更新于 Sep 10, 2025 02:16 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up