k8s-MongoDB 副本集部署

前提准备

一套 k8s 集群

worker 节点上的 /nfs/data 目录挂载到磁盘

一、NFS 高可用方案(NFS+keepalived+Sersync)

本方案 NFS 的高可用方案,应用服务器为 Client ,两台文件服务器分别 Master 和 Slave,使用 keepalived 生成一个虚拟 IP,使用 Sersync 进行 Master 与 Slave 之间文件相互同步,确保高可用。

安装前准备

|------------|----------------|----------------|
| 角色 | 系统版本 | IP |
| 虚拟 ip(Vip) | 无 | 192.168.32.116 |
| Client | CentOS Linux 8 | 192.168.32.50 |
| Master | CentOS Linux 8 | 192.168.32.30 |
| Slave | CentOS Linux 8 | 192.168.32.40 |

在 Master 和 Slave 上创建共享目录

复制代码
mkdir /nfs/data
chmod 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 数据

复制代码
# 安装 rsync
yum -y install rsync.x86_64

# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.30

# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass

# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -R nfsnobody:nfsnobody /data/

# 启动服务
 rsync --daemon --config=/etc/rsyncd.conf 

在 Master 上测试

复制代码
yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /nfs/data/
echo "data123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 创建测试文件,测试推送
cd /nfs/data/
echo "This is test file" > file.txt
rsync -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#<delete start="true"/>#<delete start="false"/>#g' confxml.xml

sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/nfs/data">#g' confxml.xml

sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.32.30" name="data"/>#g' confxml.xml

sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml

sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="data" passwordfile="/etc/rsync.pass"/>#g' confxml.xml

sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#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 数据

复制代码
# 安装 rsync
yum -y install rsync.x86_64

# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 slave ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.40

# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass

# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -R nfsnobody:nfsnobody /data/

# 启动服务
 rsync --daemon --config=/etc/rsyncd.conf 

在 Slave 上测试

复制代码
yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /nfs/data/
echo "data123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 创建测试文件,测试推送
cd /nfs/data/
echo "This is test file" > test.txt
rsync -arv /nfs/data/ data@192.168.32.40::data --password-file=/etc/rsync.pass

# 在 master 上测试
ls /nfs/data 

# 出现 test.txt 即可

在 Slave 上配置自动同步

复制代码
# 安装 rsync
yum -y install rsync.x86_64

# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /nfs/data
auth users = data
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.32.30

# 生成认证文件
echo 'data:data123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass

# 修改 文件夹权限
groupadd nfsnobody
useradd -g nfsnobody nfsnobody
chown -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 # 本机ip
unicast_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 # 本机ip
unicast_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 上查看 vip
ip 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 < 60; i=(i+step) )); do 
  ###检查nfs可用性:进程和是否能够挂载
  /sbin/service nfs status &>/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.sh
crontab -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.sh
crontab -e
# 输入定时任务
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null

未完待续。。。

相关推荐
想你依然心痛41 分钟前
嵌入式容器:Docker与BalenaOS在边缘设备上的实践——容器运行时与OTA
运维·docker·容器
zx78541 小时前
Kubernetes 生产级实战:从零部署 LNMP 架构 ECShop 商城(完整指南)
容器·架构·kubernetes
IT大白鼠1 小时前
K8S发展历史及未来展望
云原生·容器·kubernetes
运维大师2 小时前
【云原生与DevOps】08-多云容灾架构设计:跨Region自动切换实践
运维·云原生·devops
weixin_439930642 小时前
Kubernetes(K8s)入门实践
云原生·容器·kubernetes·k8s
阿里云云原生16 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉16 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情18 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海1 天前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色1 天前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入