K8S持久化存储之NFS
一、NFS文件存储服务器部署
1)安装服务端:
# yum install -y nfs-utils rpcbind
2)修改配置文件(编辑写入要共享的目录):
# vim /etc/exports
// 共享的目录 白名单网段(权限)
/data_nfs 10.50.0.0/24(rw,no_root_squash,sync,all_squash,anonuid=666,anongid=666)
// 载入配置
# exportfs -rv
// 令格式如下:
// exportfs [-aruv]
// -a :全部mount或者unmount /etc/exports中的内容
// -r :重新mount /etc/exports中分享出来的目录
// -u :umount目录
// -v :在export的时候,将详细的信息输出到屏幕上。
// 如果后续需要新加挂载点目录,直接在/etc/exports文件增加即可。无需重载配置和重启服务。
nfs配置参数:
rw 共享目录的权限是 可读 可写
sync 同时将数据写入内存和磁盘,增强数据的安全性,保证数据不丢失
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩
all_squash 无论使用什么用户上传或者访问,一律压缩成 nfs的匿名用户
anonuid 指定一个匿名用户,必须是系统存在的uid
anongid 指定一个匿名用户组,必须是系统存在的gid
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
ro 只读权限
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
Hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
3)nfs自带用户:nfsnobody 65534,创建自定义用户:
# groupadd nfsserver -g 666
# useradd nfsserver -u 666 -g 666 -s /sbin/nologin -M
// 创建共享的目录并设置属主
# mkdir -p /data_nfs
# chown -R nfsserver.nfsserver /data_nfs
4)启动服务:
# systemctl enable rpcbind nfs-server
# systemctl start rpcbind nfs-server
# systemctl status rpcbind nfs-server
5)客户端部署和挂载:
// 安装nfs包
# yum -y install nfs-utils
// 显示共享目录(这个ip是服务端的ip)
# showmount -e 10.50.0.40
// 挂载
# mount -t nfs 10.50.0.40:/data_nfs /mnt
// 开机挂载
# vim /etc/fstab
10.50.0.40:/data_nfs /mnt nfs defaults 0 0
// 增加挂载的安全性,通过mount -o指定挂载参数,禁止使用suid,exec,增加安全性能
# mount -t nfs -o nosuid,noexec,nodev 10.50.0.40:/data_nfs /mnt
二、K8S对接:
// 需要在k8s集群中部署nfs-client-provisioner
# helm install --name nfs-client-provisioner --namespace storage --set nfs.server=10.50.0.40 --set nfs.path=/data_nfs --debug .
# # helm list
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
nfs-client-provisioner 1 Wed Oct 28 11:55:24 2020 DEPLOYED nfs-client-provisioner-1.2.8 3.1.0 storage
# kubectl patch storageclass managed-nfs-storage -p '{"parameters": {"archiveOnDelete": "true"}}'
The StorageClass "managed-nfs-storage" is invalid: parameters: Forbidden: updates to parameters are forbidden.
// 如果在修改sc时报如上错误,使用以下方式修改
# kubectl replace -f managed-nfs-storage.yaml –force
# kubectl -n storage get sc managed-nfs-storage -o yaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
creationTimestamp: "2020-10-28T03:55:24Z"
labels:
app: nfs-client-provisioner
chart: nfs-client-provisioner-1.2.8
heritage: Tiller
release: nfs-client-provisioner
name: nfs-client
resourceVersion: "1352213462"
selfLink: /apis/storage.k8s.io/v1/storageclasses/nfs-client
uid: e6c5b9aa-25c3-41cd-8843-472d8ef02c52
parameters:
archiveOnDelete: "true"
provisioner: cluster.local/nfs-client-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
// 创建pvc即可
# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
pv.kubernetes.io/bind-completed: "yes"
pv.kubernetes.io/bound-by-controller: "yes"
volume.beta.kubernetes.io/storage-provisioner: cluster.local/nfs-client-provisioner
finalizers:
- kubernetes.io/pvc-protection
name: pvc-test
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50G
storageClassName: nfs-client
// 或者pod直接通过nfs引用
# cat demo-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-demo
spec:
containers:
- image: nginx
name: nfs-demo
volumeMounts:
- mountPath: /data_WebRoot
name: data-nfs-webroot
volumes:
- name: data-nfs-webroot
nfs:
server: 10.50.0.40
path: "/data_nfs"