搭建nfs主要是用来给k8s集群做远程存储,把k8s中的数据远程保存到nfs中,实现数据持久化
用到的插件
nfs+keepalived 做高可用防止单点故障
rsync+inotify 实现主备间共享数据进行同步
原理:两台机器上配置要一致,keepalived监控nfs进程,master上的nfs主进程宕掉无法启动时由slave主机上的nfs继续工作,k8s的数据备份到slave上,同时master和slave数据用rsync和inotify实时同步,保证数据的完整性。
#master节点安装nfs
yum -y install nfs-utils
#创建nfs共享目录
mkdir -p /nfs/k8s/
#修改权限
chmod -R 777 /nfs/k8s/
#编辑export文件
vim /etc/exports
/nfs/k8s 10.0.0.0/16(rw,no_root_squash,sync)
#配置生效
exportfs -r
#查看生效
exportfs
#启动rpcbind、nfs服务
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs
#查看 RPC 服务的注册状况
rpcinfo -p localhost
#showmount测试
showmount -e 10.0.13.239
在k8s所有node节点安装nfs客户端,用于后续挂载master节点的共享目录
yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs
需要注意的是:由于只是测试,我们共享的这个/nfs/k8s目录默认是没有单独挂载硬盘的,
生产环境下最好是给这个共享目录单独挂载一块硬盘或者单独的磁盘分区
slave节点安装nfs
所有操作和master一致
#showmount测试
showmount -e 10.0.13.240
挂载nfs测试一下
mount -t nfs 10.0.13.239:/nfs/k8s /test 可以实现远程的/nfs/k8s和/test目录数据同步
master和slave都安装keepalived
yum -y install keepalived
master节点配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id master id可以随便设
}
vrrp_script chk_nfs {
script "/etc/keepalived/nfs_check.sh" 监控脚本
interval 2
weight -20 keepalived部署了两台所以设为20,如果三台就设为30
}
vrrp_instance VI_1 {
state BACKUP 两台主机都设为backup非抢占模式
interface ens160 网卡名写自己的,不要照抄
virtual_router_id 51
priority 100 master设为100,backup设为80,反正要比100小
advert_int 1
nopreempt 设置为非抢占模式必须要该参数
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nfs
}
virtual_ipaddress {
10.0.13.190 虚拟ip,注意该ip必须是没有别人使用的,设置之前先ping一下看有没有人使用
}
}
上面配置文件中需要关注的是我们设置成非抢占模式,如果设置成抢占模式会在不断的切换主备时容易造成nfs数据丢失
编辑监控脚本
vim /etc/keepalived/nfs_check.sh
#!/bin/bash
A=`ps -C nfsd --no-header | wc -l`
if [ $A -eq 0 ];then
systemctl restart nfs-server.service
sleep 2
if [ `ps -C nfsd --no-header| wc -l` -eq 0 ];then
pkill keepalived
fi
fi
重启keepalived
systemctl restart keepalived.service && systemctl enable keepalived.service
用ip a 查看是否出现vip,出现就部署成功
slave节点配置
vim /etc/keepalived/keepalived.conf
priority 80
其他配置的和master节点一样
脚本也是一样的
重启服务
systemctl restart keepalived.service && systemctl enable keepalived.service
测试一下keepalived
停掉master的keepalived,发现vip飘到backup上就算成功,当master的keepalived启动后,vip不会飘回去,要把slave的keepalived停掉才行,前面也说了,要设置成非抢占模式,如果是抢占模式,vip当master重启了会自动飘回去,但是这样一直切换可能会造成数据不完整,所以我们设置成非抢占模式手动调整vip
部署rsync+inofity
yum -y install rsync inotify-tools 两台机器都装
master上配置
vim /etc/rsyncd.conf
#rsync通用配置文件,配置的注释不要写在配置后面,否则会有问题
uid = root
gid = root
use chroot = 0
port = 873
##允许ip访问设置,请根据实际需要进行配置,这里为了方便设为全网段 *,生产环境下为了安全请指定ip或ip段
## hosts allow = 192.168.0.1/255.255.255.0 198.162.145.1 10.0.1.0/255.255.255.0
hosts allow = 10.0.0.0/16
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3
#方括号中为模块声明,对应命名,这里master_web对应了主web机配置,从服务器可都为[slave_web],方便inotify脚本配置
[master_web]
#指定当前模块在rsync服务器上的同步路径,该参数是必须指定的
path = /nfs/k8s/
#注释,可以同模块名一样,从服务器可都为slave_web
comment = master_web
ignore errors
##是否允许客户端上传文件
read only = no
list = no
##指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块
auth users = rsync
##保存密码和用户名文件,需要自己生成
secrets file = /etc/rsyncd.passwd
编辑密码文件
vim /etc/rsyncd.passwd
rsync:123456
vim /root/rsyncd.passwd
123456
/root/rsyncd.passwd中内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是rsync:123456,这里主服务器则写123456一个就可以了
chmod 600 /etc/rsyncd.passwd
chmod 600 /root/rsyncd.passwd
启动服务
systemctl restart rsyncd
systemctl enable rsyncd
master配置好了,现在我们配置slave
vim /etc/rsyncd.conf
其他的和master一样,
把master主机配置文件里的[master_web]改成[slave_web]
密码文件也设为一样
chmod 600 /etc/rsyncd.passwd
chmod 600 /root/rsyncd.passwd
重启服务
systemctl restart rsyncd
systemctl enable rsyncd
现在我们在master节点上手工同步一下,让slave节点同步master的数据
rsync -avzp --delete /nfs/k8s/ [email protected]::slave_web --password-file=/root/rsyncd.passwd
#[email protected]::slave_web # 10.0.13.240 为slave服务器的ip,
#slave_web 为slave服务器的 rsyncd.conf 中配置的模块名,
#rsync 为为slave服务器的中 rsyncd.passwd 中配置的用户名
上面命令的意思是把master主机上的/nfs/k8s目录同步到10.0.13.240主机slave_web模块里定义的路径,rsync不是主机用户,是slave服务器的中 rsyncd.passwd 中配置的用户名。
同步成功,我们再返回来去slave主机上执行上面的命令,看能否反着从slave同步到master,记得改命令中的地址为10.0.13.239,因为我们主从配置都一样,所以其他的都不用变。
为什么要反着同步呢,因为当master挂掉,数据转到了slave节点上,这时我们就要反过来把slave的数据备份到master
设置自动同步—(master上执行)
vim /root/inotify.sh
#!/bin/bash
host=10.0.13.240
src=/nfs/k8s/
des=slave_web
password=/root/rsyncd.passwd
user=rsync
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
nohup bash /root/inotify.sh & 设置后台运行脚本
现在我们在master的/nfs/k8s目录下创建个东西,slave主机上的/nfs/k8s/目录下应该也会出现了
设置脚本的开机自启动-----不一定要设置,因为数据到了slave上继续收集之后,master开机自启会自动同步,那slave不是白收集了,又被master同步回原来的了。所以在master挂掉再启动后,应该先在slave上做一次同步,master缺失的先补回来,然后在做slave对master的同步
chmod +x /etc/rc.d/rc.local
echo “nohup bash /root/inotify.sh” >> /etc/rc.d/rc.local
注意以上红色操作在master上执行,表示把master上的数据同步到slave,所以不能在slave上执行上述命令,因为要是salve上也执行了,那master同步到slave,slave再同步到master,这个是矛盾的,数据会无法正常写入,所以slave上不要执行,只有当master需要同步slave上的数据时,把master上的关了,再把slave上的启动执行备份。
到此部署成功,接下来其他客户端挂载的时候直接挂载vip,注意k8s创建pv时一定要挂载vip