作者:Grey
操作系統
- CentOS 8
相關工具
- keepalived
- ipvsadm
- httpd
准備工作
准備四個節點,如上圖,Node01 ~ Node04, 本文默認你會在VMWare上安裝Linux並配置相關信息,如果這塊內容不清楚,可以參考Linux安裝,快照,克隆(基於CentOS 8)
實驗效果
我們會在Node01和Node02上配置LVS,且Node01和Node02是主備關系,Node01是主,Node02是備,Node01掛了,Node02可以自動頂上。Node01和Node02是接收請求的入口,接下來,會將請求以負載均衡的方式請求后端的Node04和Node05服務。
示例圖
操作步驟
准備Node03和Node04的服務
在Node03和Node04上分別執行如下命令:
yum install -y httpd
安裝好httpd以后,在Node03上的/var/www/html
位置
新建一個名為index.html頁面,並且在index.html
中輸入如下內容:
<h>from node03</h>
在Node04同樣的位置,也建立一個index.html
文件,且文件內容為:
<h>from node04</h>
可以通過如下方式快速將Node03的index.html
復制到Node04, 在Node03的var/www/html
目錄下,執行
scp index.html root@192.168.98.139:`pwd`
其中
root@192.168.98.139
是對應你的node03的信息,然后就可以把node03的index.html
復制到node04的對應位置了。
然后改一下Node04的index.html
信息即可。
准備好index.html頁面后,因為httpd服務的默認端口是80,所以我們需要打開Node03和Node04上的80端口的訪問權限,在Node03和Node04上分別執行如下的兩條命令:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
我們可以啟動Node04和Node03上的httpd服務,在Node03和Node04上分別執行:
systemctl start httpd
驗證是否啟動成功
配置Node03和Node04內核參數
arp_ignore和arp_announce兩個內核參數的配置說明如下:
arp_ignore
定義接收到ARP請求時的響應級別
- 0:只要本地配置的有相應地址,就給予響應;
- 1:僅在請求的目標(MAC)地址配置請求到達的接口上的時候,才給予響應;
arp_announce
定義將自己地址向外通告時的通告級別
- 0:將本地任何接口上的任何地址向外通告;
- 1:試圖僅向目標網絡通告與其網絡匹配的地址;
- 2:僅向與本地接口上地址匹配的網絡進行通告;
由於,Node03和Node04上要實現對IP的對外隱藏和對內可見,所以我們需要在Node03和Node04上配置如下參數:
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
PS:CentOS8的默認網卡名稱是 ens33
可以通過ifconfig命令查看到
配置Node03和Node04的環路接口
要實現IP的對內可見,對外隱藏,還需要在Node03和Node04上配置環路接口, 在Node04和Node03上分別執行
ifconfig lo:3 192.168.98.100 netmask 255.255.255.255
然后在Node03和Node04分別執行
ifconfig
查看是否添加成功
自此,Node03和Node04上的所有東西都配置好了。
接下來開始配置Node01和Node02。
安裝ipvsadm
在Node01和Node02上執行如下命令
yum install -y ipvsadm
安裝keepalived
在CentOS8下,我嘗試用yum安裝keepalived,配置完畢后,啟動了keepalived,但是客戶端始終無法請求過來。
無奈,嘗試編譯安裝keepalived,問題解決。
步驟如下,在Node01和Node02上分別執行, 安裝一些前置工具
yum install curl gcc openssl-devel libnl3-devel net-snmp-devel make tar ipvsadm -y
然后下載最新的keepalived源碼
curl --progress https://www.keepalived.org/software/keepalived-2.2.2.tar.gz | tar xz
cd keepalived-2.2.2
./configure --prefix=/usr/local/keepalived-2.2.2
make
make install
修改keepalived配置
在Node01上,先備份默認的keepalived配置,執行如下命令
cd /usr/local/keepalived-2.2.2/etc/keepalived
cp keepalived.conf keepalived.conf.bak
然后開始編輯keepalived.conf文件, 將其配置成如下信息
Node01上:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.98.100/24 dev ens33 label ens33:3
}
}
virtual_server 192.168.98.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.98.138 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.98.139 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
Node02上
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.98.100/24 dev ens33 label ens33:3
}
}
virtual_server 192.168.98.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.98.138 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.98.139 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
指定keepalived配置文件,在Node01和Node02上分別執行:
cd /usr/local/keepalived-2.2.2/etc/sysconfig
修改keepalived文件
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf"
在KEEPALIVED_OPTIONS中增加了-f選項,指定了keepalived.conf的位置
然后打開Node01和Node02的80端口訪問權限,分別在Node01和Node02上執行如下命令
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
啟動keepalived
在Node01上執行
systemctl start keepalived
驗證:通過瀏覽器訪問:http://192.168.98.100
並且時不時刷新以下頁面,可以顯示如下結果:
在Node01上執行
ipvsadm -lnc
可以看到
在Node02上執行
systemctl start keepalived
然后在Node02上執行
ipvsadm -lnc
內容是空的,說明Node02是備用節點
此時,我們停掉Node01,在Node01上,執行
systemctl stop keepalived
繼續訪問瀏覽器,服務依舊可以訪問
驗證了主節點(Node01)掛了,備用節點(Node02)頂上這個情況
此時,在Node02上執行
ipvsadm -lnc
可以看到連接情況
說明備機正常提供了服務。
此時,再把主節點(Node01)啟動起來,在Node01上執行:
systemctl restart keepalived
服務正常
在主節點(Node01)上執行
ipvsadm -lnc
顯示出了連接
說明主節點已經恢復正常。