ka-header-new.png

本篇筆記參考:

Keepalived 是一套由 C 語言撰寫的路由軟體 (Routing software),主要目的是提供 Linux 設施簡單的高可用 (High-Availability) 以及平衡負載 (Loadbalancing) 方案。

HA 的部分使用 VRRP (Virtual Router Redundancy Protocol) 協議進行偵測/票選 (election) 由哪台 Linux 設施成為 Master/Primary node (主節點)

LB (平衡負載) 的部分是基於 Linux 核心模組 Linux Virtual Server (IPVS) 提供 Layer 4 Load Balance 解決辦法

不過本篇筆記只會使用到 keepalived 高可用的部分,負載平衡會交由 Nginx 負責

2022.12.26 整理更新:

關於 L4, L7 load blancer 差異可以參考 eBPF 相關文章:

安裝 keepalived 與 Nginx

1
2
3
yum install  keepalived.x86_64 -y
yum install nginx -y
systemctl enable --now  nginx.service

Nginx 網頁特徵化

此次實驗總共有兩台 VM 分別是:

  • Eric_Keepalived_1 192.168.207.111
  • Eric_Keepalived_2 192.168.207.112
  • Eric_Keepalived_VIP 192.168.207.120

特徵化主要目的是要辨識連到哪台 nginx server。預設情況下 nginx 網頁根目錄放在 /usr/share/nginx/html 下面

1
2
rm /usr/share/nginx/html/index.html  ## remove symbolic link
echo '<h1>This is keepalived 11111</h1>' > /usr/share/nginx/html/index.html 

sysctl 設定

這個設定允許 Linux 綁定本機不存在的 IP

1
2
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p

keepalived.conf

先行備份原本的設定檔

1
cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf.org

Primary Node keepalived.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
vrrp_script check_nginx {
    script "pidof nginx"
    interval 2
    weight -30
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 19
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 207207
    }
    track_script {
        check_nginx
    }
    virtual_ipaddress {
        192.168.207.120/24
    }
}

Secondary/BACKUP Node

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
vrrp_script check_nginx {
    script "pidof nginx"
    interval 2
    weight -30
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 19
    priority 190
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 207207
    }
    track_script {
        check_nginx
    }
    virtual_ipaddress {
        192.168.207.120/24
    }
}

vrrp_script <SCRIPT_NAME>

#VRRP_script

定義要被 vrrp_instance 執行的腳本內容,通常是檢測服務健康 (service health)。
script 後面可以直接接 <STRING> 或者 <QUOTED-STRING>,都用來表示腳本路徑 (path of script to execute)
以上面的範例就是去執行 /usr/sbin/pidof nginx。當 nginx 執行中的話 pidof 會 echo 出所有 pid (process id) 並且回傳值為 0
確認命令執行是否有錯誤都可以用回傳值判斷。當命令成功執行 return code=0,若失敗則為其它值

1
pidof nginx || echo $?

interval 定義幾秒執行腳本一次,預設是一秒鐘 (default: 1 second)
weight 定義腳本權重。範圍從 -253 ~ 253

當 weight 為 “正” 數:

(1) return code=0,則增加 instance 當中的優先權 (priority)。 priority = priority + weight
(2) return code !=0,則 優先權 (priority) 保持不變

當 weight 為 “負” 數:

(1) return code=0,則優先權 (priority) 保持不變
(2) ``return code !=0`,則 減少 instance 當中的優先權 (priority)。 priority = priority + weight (註: weight 為負數)

另外還有其它比較常用的參數:

rise <INTEGER> 腳本回傳 成功 (return code=0) 達到 <INTEGER> 次才將狀態轉成 OK。(required number of successes for OK transition)
fall <INTEGER> 腳本回傳 失敗 (return code!=0) 達到 <INTEGER> 次才將狀態轉成 KO。(required number of successes for KO transition)
user 以哪個使用者/群組 執行該腳本。其中群組為非必要選項 (user USERNAME [GROUPNAME])
timeout <INTEGER> 設定腳本執行 <INTEGER> 秒後沒有結束,直接判定失敗。
init_fail 預設腳本是失敗狀態。
好像把所有參數說完了 XD

vrrp_instance

#VRRP_instance

state 可以是 MASTER or BACKUP。也可以選擇不設定,因為當其他候選人 (在同個廣播域、設定相同 virtual_router_id) 上線後,就會舉辦選舉優先權最高者勝出成為 Master 拿到 VIP 使用權
interface 設定已取得內部 IP 的網卡,也是 VIP 綁定的目標網卡 (除非有另外設定)。
這張網卡同時也是 vrrp 綁定的對象。如果省略此設定,所有的 VIPs 與 eVIPs 就必須被指派使用哪張網卡。
virtual_router_id 同一個廣播域中用來辨識 (封包 vrid)。同一個 HA Cluster 內設定的值必須相同,設定的範圍從 1~255
priority 優先權。
advert_int VRRP 廣播間隔,單位是秒
authentication (區塊) auth_pass 使用密碼驗證 vrrp 封包真偽,keepalive 取前八位字元使用。

感覺沒什麼路用… 因為如果 auth_type PASS 的情況下,密碼是明文…
Louwrentius-Configuring, Attacking and Securing VRRP on Linux

track_script (區塊) SCRIPT_NAME 後面一樣可以設定權重 -253~253。預設值是 0
virtual_ipaddress (區塊) 設定 VIP 為何。
nopreempt 當 Master Node 恢復後不接受剝奪 VIP 使用權。若要使用 state 必須設定成 MASTER

其他參數:

track_interface (區塊) 可以對每個 interface 設定不同權重。當偵測到 interface down 就會由其他 interface 接手。
version <2 or 3> 使用的 VRRP 版本,預設值 ver.2。 IPv6 必定使用 ver.3

觀察 VRRP 封包 (可看優先權)

RFC 3768 - Virtual Router Redundancy Protocol (VRRP)
nixCraft-Verify: Keepalived IP Failover Working Or Not With tcpdump Command

VRRP 預設使用 224.0.0.18 做為群播地址。透過 tcpdump 可以觀察

1
tcpdump -vvv -n -i eth0 host 224.0.0.18

tcpdump Cheat Sheet