前提準備
一套 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/exportsecho '/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.gztar xvf sersync2.5.4_64bit_binary_stable_final.tar.gzmv GNU-Linux-x86/ sersynccd sersync/# 修改配置文件
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xmlsed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/nfs/data">#g' confxml.xmlsed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.32.30" name="data"/>#g' confxml.xmlsed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xmlsed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="data" passwordfile="/etc/rsync.pass"/>#g' confxml.xmlsed -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 2weight -30fall 5rise 5
}# 定義主機信息
vrrp_instance VI_1 {state MASTER # 主機填寫MASTERinterface ens192 # 設置實例綁定的網卡garp_master_delay 1virtual_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 PASSauth_pass zuanlan1437xi
}
virtual_ipaddress {#192.168.112.210 dev ens33 label ens33:0192.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 2weight -30fall 5rise 5
}# 定義主機信息
vrrp_instance VI_1 {state BACKUP # 主機填寫MASTERinterface ens192 # 設置實例綁定的網卡garp_master_delay 1virtual_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 PASSauth_pass zuanlan1437xi
}
virtual_ipaddress {#192.168.112.210 dev ens33 label ens33:0192.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/nullif [ $? -ne 0 ];then###如果服務狀態不正常,先嘗試重啟服務/sbin/service nfs restart/sbin/service nfs status &>/dev/nullif [ $? -ne 0 ];then# 如服務仍不正常,停止 keepalivedsystemctl stop keepalived.servicefifisleep $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 = "" ];thenumount /qiyuesuodatamount mount -t nfs 192.168.32.116:/data /qiyuesuodatafisleep $step
done
加入定時任務
chmod 777 /usr/local/sbin/check_mount.sh
crontab -e
# 輸入定時任務
* * * * * /usr/local/sbin/check_nfs.sh &> /dev/null
未完待續。。。