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