特别说明:测试使用,不建议生产环境
1、在master节点配置(node1)
1)yum安装nfs
# yum -y install nfs-utils
NFS的关键工具包括:
主要配置文件:/etc/exports;
NFS文件系统维护命令:/usr/bin/exportfs;
共享资源的日志文件: /var/lib/nfs/*tab;
客户端查询共享资源命令: /usr/sbin/showmount;
端口配置: /etc/sysconfig/nfs。
2)新建共享目录
# mkdir -p /data/volunes
3)设置Nfs权限
# cat /etc/exports
权限参数说明:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async nfs在写入数据前可以响应请求
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 不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限(不安全)
anonuid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定nfs服务器/etc/passwd文件中匿名用户的GID
4)启动服务
# systemctl enable nfs.service
# systemctl start nfs.service
# exportfs -arv #不用重启nfs服务,配置文件就会生效
2、在节点node2和node3配置Nfs
1)安装
yum -y install nfs-utils
2)在node3和node2上挂载:
# mount -t nfs 172.160.45.160:/data/volunes/ /mnt
3、检查
1)#查看 RPC 服务的注册状况
rpcinfo -p localhost
2)#showmount测试
showmount -e 172.160.45.160
4、kubernetes使用NFS共享存储有两种方式:
#手动方式静态创建所需要的PV和PVC;
#通过创建PVC动态地创建对应PV,无需手动创建PV;
################静态创建#######################
1)静态申请PV卷
PersistentVolumes,是k8s抽象化的存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息.PV是k8s实际对接存储后端的真正入口;
#创建pv对应目录
# mkdir -p /data/volunes/v{1,2,3}
#配置exportrs
# cat /etc/exports
#立即生效
# exportfs -arv
2)创建pv文件
# vim nfs-pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv1
labels:
pv: nfs-pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/volunes/v1
server: 172.160.45.160
nfs-pv2.yaml类似
配置说明:
① capacity 指定 PV 的容量为 1G。
② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载;
ReadOnlyMany(ROX):只读权限,可以被多个节点挂载;
ReadWriteMany(RWX):读写权限,可以被多个节点挂载;
③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
Retain(保留)- 保留数据,不会再分配给pvc,需要管理员手工清理数据;
Recycle(回收)- 清除 PV 中的数据,保留pv资源,可以留供其他pvc使用;
Delete(删除)- 删除整个pv资源及内部的数据;
④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
⑤ 指定 PV 在 NFS 服务器上对应的目录。
#创建pv的pod
# kubectl create-f nfs-pv1.yaml
# kubectl get pv
状态Available,表示 pv就绪,可以被 PVC 申请;
3)创建PVC
PersistentVolumeClaims,是对PV资源的一种声明,pvc绑定实体资源pv后,pod通过绑定pvc来使用pv资源.PVC是k8s的一种抽象化的声明式绑定存储资源的管理模式的中间层,pod无法直接通过pv使用存储资源,必须经过pvc,而pvc必须要绑定pv实体后,才可被pod使用;
# vim nfs-pvc2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc2
spec:
accessModes:
- eadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs
selector:
matchLabels:
pv: nfs-pv2
执行yaml文件创建 pvc
# kubectl create -f nfs-pvc1.yaml
查看pv资源
备注:pv对应绑定的PVC
4)创建pod
[root@node1 yaml]# vim nfs-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-test
labels:
name: nignx-test
spec:
replicas: 3
selector:
name: nginx-test
template:
metadata:
labels:
name: nginx-test
spec:
containers:
- name: web01
image: docker.io/nginx:1.14.2
volumeMounts:
- mountPath: "/usr/share/nginx/html/"
name: nfs-pv1
- mountPath: "/var/log/nginx/"
name: nfs-pv2
ports:
- containerPort: 80
volumes:
- name: nfs-pv1
persistentVolumeClaim:
claimName: nfs-pvc1
- name: nfs-pv2
persistentVolumeClaim:
claimName: nfs-pvc2
备注:
# nfs-pv1存储网页文件,nfs-pv2日志文件
#执行文件
# kubectl create -f nfs-nginx.yaml
# kubectl get pods -o wide
#创建nfs-nginx-server文件
# cat nfs-nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-test
labels:
name: nginx-test
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
nodePort: 30088
selector:
name: nginx-test
#执行文件
# kubectl create -f nfs-nginx-svc.yaml
# kubectl get svc
5)验证 PV 是否可用
测试页面:
#内部
#外网
备注说明: nfs自身没有冗余能力,数据盘损坏易丢失数据;建议使用:glusterfs或cephfs分布式存储;