k8s 创建nfs
一般步骤:搭建nfs>创建pv>创建pvc>创建pod
搭建nfs
#master节点安装nfs [root@k8s-master nginx]# yum -y install nfs-utils #创建nfs目录 [root@k8s-master nginx]# mkdir -p /nfs/data/ #修改权限 [root@k8s-master nginx]# chmod -R 777 /nfs/data #编辑export文件,这个文件就是nfs默认的配置文件,要共享多个文件就都在这里注册一下,并创建相应目录并给与权限,也可以将*改为指定的IP地址,多个ip就空格隔开 [root@k8s-master nginx]# vim /etc/exports /nfs/data *(rw,no_root_squash,sync) #配置生效 [root@k8s-master nginx]# exportfs -r #查看生效 [root@k8s-master nginx]# exportfs /nfs/data <world> #启动rpcbind、nfs服务 [root@k8s-master nginx]# systemctl restart rpcbind && systemctl enable rpcbind [root@k8s-master nginx]# systemctl restart nfs && systemctl enable nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. #查看 RPC 服务的注册状况 [root@k8s-master nginx]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper #showmount测试 [root@k8s-master nginx]# showmount -e 192.168.0.66 Export list for 192.168.0.66:
#挂载对应的nfs目录到本地, 挂载前要检查此目录是否存在
[root@k8s-master nginx]# mount -t nfs 10.10.14.52:/nfs/data /nfs/data
#取消挂载(对应的本地路径)
[root@k8s-master nginx]# umount /nfs/data
/etc/exports文件内容格式: <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] a. 输出目录: 输出目录是指NFS系统中需要共享给客户机使用的目录; b. 客户端: 客户端是指网络中可以访问这个NFS输出目录的计算机 客户端常用的指定方式 指定ip地址的主机:192.168.0.200 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0 指定域名的主机:david.bsmart.cn 指定域中的所有主机:*.bsmart.cn 所有主机:* c. 选项: 选项用来设置输出目录的访问权限、用户映射等。NFS主要有3类选项: 访问权限 设置输出目录只读:ro 设置输出目录读写:rw 用户映射 all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody); no_all_squash:与all_squash取反(默认设置); root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置); no_root_squash:与rootsquash取反; anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx); anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); 其它选项 secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置); insecure:允许客户端从大于1024的tcp/ip端口连接服务器; sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性; async:将数据先保存在内存缓冲区中,必要时才写入磁盘; wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置); no_wdelay:若有写操作则立即执行,应与sync配合使用; subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置); no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
固定nfs服务端口以便设置防火墙 vi /etc/sysconfig/nfs # uncomment the following options RQUOTAD_PORT=875 LOCKD_TCPPORT=32803 LOCKD_UDPPORT=32769 MOUNTD_PORT=892 STATD_PORT=662 # then stop nfs, stop prcbind, start rpcbind, start nfs # use "lsof -nPi" to check the listening ports
iptables中需要开放的端口 -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 662 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 662 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 892 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 892 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT
创建pvc
apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv namespace: default labels: pv: nfs-pv spec: capacity: storage: 100Mi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # storageClassName: nfs 可以不指定,但要指定前必须先创建,否则pvc会报错 nfs: server: 192.168.0.66 path: "/nfs/data" #NFS目录,需要该目录在NFS上存在
[root@k8s-master nfs]# kubectl apply -f pv.yaml
persistentvolume/nfs-pv created
[root@k8s-master nfs]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 100Mi RWX Retain Available
创建pvc
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 50Mi #容量 selector: matchLabels: pv: nfs-pv #关联pv 的label,key/value要一致,可以不指定,pvc会自动找到匹配的pv,否则会一直处于pending状态直到有合适的pv
创建pod
vim nginx.yaml #我们用nginx镜像进行验证,将html目录映射到nfs目录中 #deploy apiVersion: apps/v1 kind: Deployment metadata: name: nfs-nginx namespace: default spec: selector: matchLabels: app: nfs-nginx replicas: 2 template: metadata: labels: app: nfs-nginx spec: containers: - name: nginx-web image: nginx:latest ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: html volumes: - name: html persistentVolumeClaim: claimName: nfs-pvc --- #service apiVersion: v1 kind: Service metadata: name: nfs-nginx namespace: default spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 80 nodePort: 31681 selector: app: nfs-nginx
[root@k8s-master nfs]# kubectl apply -f nginx.yaml
[root@k8s-master nfs]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-nginx-7695b95db6-l74zx 1/1 Running 0 12s 10.244.2.93 k8s-node1 <none> <none>
nfs-nginx-7695b95db6-qcqp8 1/1 Running 0 12s 10.244.1.22 k8s-node2 <none> <none>
验证
各节点安装并启用nfs yum install nfs-utils systemctl start nfs & systemctl enable nfs systemctl start rpcbind & systemctl enable rpcbind
我们在/nfs/data/nginx目录创建了一个1.html文件 <html> <body>Test01</body> </html> 在容器1的/usr/share/nginx/html目录创建文件2.html <html> <body>Test02</body> </html> 在容器2的/usr/share/nginx/html目录创建文件3.html <html> <body>Test03</body> </html> 分别浏览器访问路由正常 此外我们进入容器查看,目录中文件是共享的: root@nfs-nginx-7695b95db6-l74zx:/usr/share/nginx/html# ls 1.html 2.html 3.html pod销毁重建 kubectl delete -f nginx.yaml kubectl apply -f nginx.yaml 再次访问1.html/2.html/3.html,依旧可以访问到,说明文件未丢失。 root@nfs-nginx-7695b95db6-78wml:/usr/share/nginx/html# ls 1.html 2.html 3.html #新创建的容器,依旧可以看到这些文件
使用kuboard方式:先创建nfs服务,步骤同上
再在pod里配置:
方法一:适合于配置了pvc的方式
前面的名字logs随便自定义,下面的存储卷声明选自己绑定的pvc
pod配置里添加挂载点,第一行是容器内路径,自定义,第二行是权限,第三行选你上图中自定义的名字,后面的子路径可以自定义。
方法二:没有配置pvc(更简便)
第一行第二个选NFS,下面第一行填你nfs服务端的ip,第二行填你nfs服务端的挂载路径
同样在pod配置的挂载点里添加容器内挂载路径,自定义的挂载卷名字以及子路径