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

未完待续。。。

相关推荐
Most663 小时前
kubesphere安装使用
kubernetes
Kentos(acoustic ver.)4 小时前
云原生 —— K8s 容器编排系统
云原生·容器·kubernetes·云计算·k8s
贺贺丿5 小时前
Docker4-容器化企业级应用
linux·nginx·docker·云原生·eureka·tomcat·ssh
sanggou6 小时前
Zookeeper的分布式事务与原子性:深入解析与实践指南
分布式·zookeeper·云原生
Linux运维技术栈6 小时前
从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南
运维·docker·容器
竹竿袅袅7 小时前
Keepalived 原理及配置(高可用)
运维·云原生·lvs·keepalived·haproxy·高可用
哈里谢顿10 小时前
Kubernetes 简介
kubernetes
Jy_062210 小时前
k8s 中的 deployment,statefulset,daemonset 控制器的区别
云原生·容器·kubernetes
fire-flyer10 小时前
云原生可观测-日志观测(Loki)最佳实践
云原生·logging·loki·可观测