环境说明:

  • helm version: v3.4.2
  • kubernetes version: v1.19.6
  • nfs server: 192.168.8.66
  • sub-net: 192.168.8.0/24

nfs 服务端配置

1
yum install rpcbind nfs-utils -y  # 安装 nfs server

创建用户 & 数据目录

1
2
3
4
5
6
7
8
9
groupadd -g 2233 nfs-user

useradd nfs-user -M -s /sbin/nologin -u 2233 -g nfs-user

id  nfs-user

mkdir -p /data/nfs.sharedir

chown -R nfs-user /data/nfs.sharedir

服务端 配置文件修改

1
2
3
cat /etc/exports # 配置文件 如下:

/data/nfs.sharedir 192.168.8.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=2233,anongid=2233)

​ 参数说明:

  • read-write,可读写;
  • ro:read-only,只读;
  • sync:文件同时写入硬盘和内存;
  • async:文件暂存于内存,而不是直接写入内存;
  • no_root_squash:NFS客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,也拥有 root 权限。显然开启这项是不安全的。
  • root_squash:NFS客户端连接服务端时如果使用的是 root 的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用 nobody 或 nfsnobody 身份;
  • all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
  • anonuid:匿名用户的 UID 值,可以在此处自行设定。
  • anongid:匿名用户的 GID 值

执行配置 生效

1
exportfs -r

启动服务 & 设置服务开机自启

1
2
3
4
5
6
service rpcbind start  

service nfs start

systemctl enable nfs \
&& systemctl enable rpcbind  

nfs 客户端配置

⚠️ 注意如果在 k8s 中使用 nfs时,需要在每一个节点中多配置安装 rpcbind,因为 nfs 依赖于使用 rpc 协议进行通讯。

1
2
3
4
yum install rpcbind  rpcbind nfs-utils -y

service rpcbind start 
systemctl enable rpcbind  

客户端测试挂载

1
showmount -e [nfs-server]  # 查看服务端 可挂载目录

示例 showmount -e 192.168.8.66

image-20210119170611572

1
mount -t nfs 192.168.8.66:/data/nfs.sharedir /mnt

如网络不太稳定时,可以尝试切换为 tcp 协议

1
mount -t nfs 192.168.8.66:/data/nfs.sharedir /mnt -o proto=tcp -o nolock

部署 nfs storageClass

helm 添加仓库

1
2
3
helm repo add stable https://charts.helm.sh/stable

helm repo update

创建 helm 部署文件

1
2
3
4
5
6
7
8
cat > prod-values.yaml << EOF
storageClass:
  name: nfs-retain  
  reclaimPolicy: Retain 
nfs:
  server: 192.168.8.66
  path: '/data/nfs.sharedir'
EOF

reclaimPolicyPersistentVolumes(pv) 的回收策略,包括 “Retain”、“Recycle” 和 “Delete”。 对于动态配置的 PersistentVolumes 来说,默认回收策略为 “Delete”。 这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。 如果 volume 包含重要数据时,这种自动行为可能是不合适的。 那种情况下,更适合使用 “Retain” 策略。 使用 “Retain” 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。 相反,它将变为 Released 状态,表示所有的数据可以被手动恢复。

部署

部署至 kube-system 命名空间, storageClass 为 集群 概念,集群内任意命名空间多可以使用。

1
helm upgrade --install nfs-storage-class -f ./prod-values.yaml -n kube-system stable/nfs-client-provisioner

image-20210119205725301

image-20210119205744586

部署后的测试

 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
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sc-nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-retain
  resources:
    requests:
      storage: 1Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-nginx
  namespace: default
  labels:
    name: sc-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      name: sc-nginx
  template:
    metadata:
      labels:
       name: sc-nginx
    spec:
      containers:
      - name: sc-nginx
        image: nginx:1.16.0
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nginx-data
        ports:
        - containerPort: 80
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: sc-nginx-pvc
EOF

image-20210119201907839

nfs server 端口 echo 数据 至目录下的 index.html 文件内

1
echo 'hello' >>  /data/nfs.sharedir/default-sc-nginx-pvc-pvc-bd14929c-ed1f-4ede-baa7-a39de13ee169/index.html

image-20210119202614660