作者:Grey
環境
- VMware 16
- CentOS8
相關軟體
- keepalived
- ipvsadm
- httpd
準備工作
準備四個節點,如上圖,Node01 ~ Node04, 本文預設你會在VMWare上安裝Linux並配置相關資訊,如果這塊內容不清楚,可以參考Linux學習筆記
實驗效果
我們會在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
顯示出了連線
說明主節點已經恢復正常。