k8s-MongoDB 副本集部署
前提准备
一套 k8s 集群
worker 节点上的 /nfs/data 目录挂载到磁盘
一、NFS 高可用方案(NFS+keepalived+Sersync)
本方案 NFS 的高可用方案,应用服务器为 Client ,两台文件服务器分别 Master 和 Slave,使用 keepalived 生成一个虚拟 IP,使用 Sersync 进行 Master 与 Slave 之间文件相互同步,确保高可用。
安装前准备
虚拟 ip(Vip)
无
Client
Master
-
在 Master 和 Slave 上创建共享目录
mkdir /nfs/datachmod 777 -R /nfs/data
-
在 Client 上创建挂载目录
mkdir /qiyuesuodata
-
关闭 Client 、Master 和 Slave 服务器上的防火墙
# 关闭防火墙systemctl stop firewalld# 关闭开机自启systemctl disable firewalld
-
在 Client 、Master 和 Slave 服务器上安装 NFS 服务
yum -y install nfs-utils rpcbind
-
配置 NFS 共享目录
在 Master、Slave 上执行
# 其中/data 为共享的目录,192.168.32.50 为 Client ip,如有多个私有云服务集群可用空格分隔# 如 echo \'/nfs/data 192.168.32.50(rw,sync,all_squash) 192.168.32.40(rw,sync,all_squash)\' >> /etc/exports echo \'/nfs/data 192.168.32.50(rw,sync,all_squash) 192.168.32.40(rw,sync,all_squash) 192.168.32.30(rw,sync,all_squash) 192.168.32.20(rw,sync,all_squash) 192.168.32.10(rw,sync,all_squash)\' >> /etc/exports# 开启服务 systemctl start rpcbind && systemctl start nfs-server.service# 设置开机自启 systemctl enable rpcbind && systemctl enable nfs-server.service# 出现:Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.即成功
-
在 Client 上执行挂载测试
# 测试 Master # 其中 ip 为 Master 的 ip,/nfs/data为 Master 共享的目录,/qiyuesuodata 为需要挂载至 Client 的目录 mount -t nfs 192.168.32.30:/nfs/data /qiyuesuodata# 检查 df -Th # 出现 192.168.32.30:/nfs/data nfs4 29G 7.6G 22G 27% /qiyuesuodata 即为成功# 去除挂载umount /qiyuesuodata# 测试 Slave# 其中 ip 为 Slave 的 ip,/nfs/data为 Slave 共享的目录,/qiyuesuodata 为需要挂载至 Client 的目录 mount -t nfs 192.168.32.40:/nfs/data /qiyuesuodata# 检查 df -Th # 出现 192.168.32.40:/nfs/data nfs4 29G 7.6G 22G 27% /qiyuesuodata 即为成功# 去除挂载umount /qiyuesuodata
-
在 Slave 进行同步 Master 数据
# 安装 rsyncyum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ipuid = nfsnobodygid = nfsnobodyport = 873pid file = /var/rsyncd.pidlog file = /var/log/rsyncd.loguse chroot = nomax connections = 200read only = falselist = falsefake super = yesignore errors[data]path = /nfs/dataauth users = datasecrets file = /etc/rsync_salve.passhosts allow = 192.168.32.30# 生成认证文件echo \'data:data123\' > /etc/rsync_salve.passchmod 600 /etc/rsync_salve.pass# 修改 文件夹权限groupadd nfsnobodyuseradd -g nfsnobody nfsnobodychown -R nfsnobody:nfsnobody /data/# 启动服务 rsync --daemon --config=/etc/rsyncd.conf
-
在 Master 上测试
yum -y install rsync.x86_64chown -R nfsnobody:nfsnobody /nfs/data/echo \"data123\" > /etc/rsync.passchmod 600 /etc/rsync.pass# 创建测试文件,测试推送cd /nfs/data/echo \"This is test file\" > file.txtrsync -arv /nfs/data/ data@192.168.32.30::data --password-file=/etc/rsync.pass# 在 slave 上测试ls /nfs/data # 出现 file.txt 即可
-
在 Master 上配置自动同步
cd /usr/local/ wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz mv GNU-Linux-x86/ sersync cd sersync/# 修改配置文件sed -ri \'s###g\' confxml.xmlsed -ri \'24s###g\' confxml.xmlsed -ri \'25s###g\' confxml.xmlsed -ri \'30s###g\' confxml.xmlsed -ri \'31s###g\' confxml.xmlsed -ri \'33s###g\' confxml.xml#启动Sersync/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
-
测试
# 在 master 中的/nfs/data 目录创建文件touch test# 查看 salve 中的 /nfs/data 是否有该文件
以上就做完了 salve 同步 master 的文件,但是当 master 宕机后恢复,master 无法同步 salve 文件,所以要配置 master 同步 salve 文件
-
在 Master 进行同步 slave 数据
# 安装 rsyncyum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 slave ipuid = nfsnobodygid = nfsnobodyport = 873pid file = /var/rsyncd.pidlog file = /var/log/rsyncd.loguse chroot = nomax connections = 200read only = falselist = falsefake super = yesignore errors[data]path = /nfs/dataauth users = datasecrets file = /etc/rsync_salve.passhosts allow = 192.168.32.40# 生成认证文件echo \'data:data123\' > /etc/rsync_salve.passchmod 600 /etc/rsync_salve.pass# 修改 文件夹权限groupadd nfsnobodyuseradd -g nfsnobody nfsnobodychown -R nfsnobody:nfsnobody /data/# 启动服务 rsync --daemon --config=/etc/rsyncd.conf
-
在 Slave 上测试
yum -y install rsync.x86_64chown -R nfsnobody:nfsnobody /nfs/data/echo \"data123\" > /etc/rsync.passchmod 600 /etc/rsync.pass# 创建测试文件,测试推送cd /nfs/data/echo \"This is test file\" > test.txtrsync -arv /nfs/data/ data@192.168.32.40::data --password-file=/etc/rsync.pass# 在 master 上测试ls /nfs/data # 出现 test.txt 即可
-
在 Slave 上配置自动同步
# 安装 rsyncyum -y install rsync.x86_64# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ipuid = nfsnobodygid = nfsnobodyport = 873pid file = /var/rsyncd.pidlog file = /var/log/rsyncd.loguse chroot = nomax connections = 200read only = falselist = falsefake super = yesignore errors[data]path = /nfs/dataauth users = datasecrets file = /etc/rsync_salve.passhosts allow = 192.168.32.30# 生成认证文件echo \'data:data123\' > /etc/rsync_salve.passchmod 600 /etc/rsync_salve.pass# 修改 文件夹权限groupadd nfsnobodyuseradd -g nfsnobody nfsnobodychown -R nfsnobody:nfsnobody /data/# 启动服务 rsync --daemon --config=/etc/rsyncd.conf
至此我们已经做好了主从相互同步的操作
-
安装 Keepalived
在 Master 上执行
yum -y install keepalived.x86_64# 修改 /etc/keepalived/keepalived.conf# 其中 ens192 为绑定网卡名称,可以使用 ip addr 命令查看# 其中 192.168.32.116 为虚拟 ip ,注意不要和其它 ip 冲突global_defs { router_id master # 一般是主机名称,通过hostname获取 }#定义脚本。固定间隔时间执行vrrp_script chk_mysql { script \"killall -0 mysqld\" # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用 interval 2 weight -30 fall 5 rise 5}# 定义主机信息vrrp_instance VI_1 { state MASTER # 主机填写MASTER interface ens192 # 设置实例绑定的网卡 garp_master_delay 1 virtual_router_id 10 # 虚拟路由器id号。主从必须一致 priority 100 # 定义优先级,数字越大,优先级越高 advert_int 1 # 心跳频率unicast_src_ip 192.168.32.30 # 本机ipunicast_peer { 192.168.32.40 # 对端ip}authentication { auth_type PASS auth_pass zuanlan1437xi}virtual_ipaddress { #192.168.112.210 dev ens33 label ens33:0 192.168.32.116 # 虚拟 ip(vip)}#执行上面定义的脚本track_script { chk_mysql}}# 启动服务systemctl start keepalived.service && systemctl enable keepalived.service
在 Slave 上执行
global_defs { router_id salve # 一般是主机名称,通过hostname获取}#定义脚本。固定间隔时间执行vrrp_script chk_mysql { script \"killall -0 mysqld\" # 检测haproxy状态,若无对应进程,则权重降级,备用keepalived启用 interval 2 weight -30 fall 5 rise 5}# 定义主机信息vrrp_instance VI_1 { state BACKUP # 主机填写MASTER interface ens192 # 设置实例绑定的网卡 garp_master_delay 1 virtual_router_id 10 # 虚拟路由器id号。主从必须一致 priority 90 # 定义优先级,数字越大,优先级越高 advert_int 1 # 心跳频率unicast_src_ip 192.168.32.40 # 本机ipunicast_peer { 192.168.32.30 # 对端ip}authentication { auth_type PASS auth_pass zuanlan1437xi}virtual_ipaddress { #192.168.112.210 dev ens33 label ens33:0 192.168.32.116 # 虚拟 ip(vip)}#执行上面定义的脚本track_script { chk_mysql}}# 启动服务systemctl start keepalived.service && systemctl enable keepalived.service
-
在 Master 上执行 查看 vip
ip a | grep ens# 出现# inet 192.168.32.116/32 scope global enp0s3# 即成功
-
vip 漂移、抢占 测试
# 关闭 master 上的 keepalive 服务systemctl stop keepalived# 在 salve 上查看 vipip a | grep ens出现 32.116 即为漂移成功# 测试抢占模式,启动 master 上的 keepalive 服务systemctl start keepalive# 查看 vip 是否回到本机ip a | grep ens出现 32.116 即为抢占成功
-
VIP 挂载测试,在 Client 上通过 vip 挂载测试
mount -t nfs 192.168.32.116:/nfs/data /qiyuesuodata# 如 /qiyuesuodata 目录中有共享目录中文件则说明挂载成功umount /qiyuesuodata/
-
设置 keepalived 脚本
因为 ip 的漂移是根据 keepalived 的存活来判断的,所以在 nfs 宕机之后需要手动停止 keepalived 服务来进行 ip 的切换,这里在 Master 上编写一个定时任务来检测 nfs 服务是否宕机
cd /usr/local/sbin# 生成文件check_nfs.sh#!/bin/sh# 每秒执行一次step=1 #间隔的秒数,不能大于60 for (( i = 0; i /dev/null if [ $? -ne 0 ];then ###如果服务状态不正常,先尝试重启服务 /sbin/service nfs restart /sbin/service nfs status &>/dev/null if [ $? -ne 0 ];then # 如服务仍不正常,停止 keepalived systemctl stop keepalived.service fi fi sleep $step done
-
加入定时任务
chmod 777 /usr/local/sbin/check_nfs.shcrontab -e# 输入定时任务* * * * * /usr/local/sbin/check_nfs.sh &> /dev/null
-
在 Client 添加定时任务,当 Master 宕机时进行重新挂载
cd /usr/local/sbin# 生成文件check_mount.sh#!/bin/sh# 每秒执行一次step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do mount=`df -Th|grep qiyuesuodata` if [ $mount = \"\" ];then umount /qiyuesuodata mount mount -t nfs 192.168.32.116:/data /qiyuesuodata fi sleep $step done
-
加入定时任务
chmod 777 /usr/local/sbin/check_mount.shcrontab -e# 输入定时任务* * * * * /usr/local/sbin/check_nfs.sh &> /dev/null
未完待续。。。