环境说明:
- 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
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
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
|
reclaimPolicy
即 PersistentVolumes(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
|
部署后的测试
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
|
nfs server 端口 echo
数据 至目录下的 index.html
文件内
1
|
echo 'hello' >> /data/nfs.sharedir/default-sc-nginx-pvc-pvc-bd14929c-ed1f-4ede-baa7-a39de13ee169/index.html
|