用NFS来做kubernetes的持久化卷虽然不是最佳实践,但存在即合理。在现在的公司就是这么用的,记录一下,可用但不是最佳。
一、搭建NFS服务端和所有工作节点安装客户端
1#NFS服务端 (centos7)
2yum install nfs-utils rpcbind -y
3
4mkdir -p /data/nfs/{download,bakup,www}
5echo "/data/nfs 10.10.0.0/16(rw,all_squash,insecure,sync)" >> /etc/exports
6exportfs -r
7
8systemctl enable rpcbind nfs-server
9systemctl restart rpcbind nfs-server
10
11showmount -e localhost
12
13#客户端根本不装也可以,客户端不需要启动任何nfs服务
14#只是为了使用showmount工具来验证
15
16#NFS客户端(CentOS,所有WorkNode节点都需要执行)
17yum install -y nfs-utils
18
19#NFS客户端(Ubuntu,所有WorkNode节点都需要执行)
20apt install -y nfs-common
NFS 服务端的参数如下:
- rw 能读能写
- insecure NFS通过1024以上的端口发送
- root_squash root会被变成noboby,其他人不变
- no_root_squash root身份保持不变,其他人不变。(不能用这个,容易被黑)
- all_squash 不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody
- sync 数据直接落盘,性能略损。
- async 数据先落内存,然后落盘,性能略升。
综上,保险的参数就是
1/data/nfs 10.10.0.0/16(rw,insecure,all_squash,sync)
注意:修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可
1exports -rv
二、POD内直接使用
由于nfs是内核自带的东西,所以最简单的使用方法就是直接在pod内使用
1apiVersion: v1
2kind: Pod
3metadata:
4 name: test
5 labels:
6 app.kubernetes.io/name: alpine
7spec:
8 containers:
9 - name: alpine
10 image: alpine:latest
11 command:
12 - touch
13 - /data/test
14 volumeMounts:
15 - name: nfs-volume
16 mountPath: /data
17 volumes:
18 - name: nfs-volume
19 nfs:
20 server: 10.10.247.38
21 path: /data
22 readOnly: no
这个pod是一次性运行的,运行完后就可以看到nfs中多了个test文件
三、用PV和PVC使用
先建立PV,注意策略是Retain,不会丢数据。如果是Recycle会清洗数据
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: nfs-pv-pvname
5spec:
6 accessModes:
7 - ReadWriteOnce
8 - ReadOnlyMany
9 - ReadWriteMany
10 capacity:
11 storage: 10Gi
12 storageClassName: ""
13 persistentVolumeReclaimPolicy: Retain
14 volumeMode: Filesystem
15 nfs:
16 server: 10.10.247.38
17 path: /data
18 readOnly: no
然后建立 PVC
1apiVersion: v1
2kind: PersistentVolumeClaim
3metadata:
4 name: nfs-pvc-pvcname
5spec:
6 accessModes:
7 - ReadWriteMany
8 resources:
9 requests:
10 storage: 1Gi
建一个Deployment,用一下
1apiVersion: extensions/v1beta1
2kind: Deployment
3metadata:
4 name: nfs-pvc
5spec:
6 replicas: 1
7 template:
8 metadata:
9 labels:
10 app: nfs-pvc
11 spec:
12 containers:
13 - name: nginx
14 image: alphine/nginx:latest
15 imagePullPolicy: IfNotPresent
16 ports:
17 - containerPort: 80
18 name: web
19 #使用volume
20 volumeMounts:
21 - name: www
22 subPath: nginx-pvc #远程子路径
23 mountPath: /usr/share/nginx/html
24 volumes:
25 - name: www
26 persistentVolumeClaim:
27 claimName: nfs-pvc-pvcname
注意:
- Storage 10Gi 1Gi 这都是骗鬼玩儿呢,根本不起任何作用!!!