Keepalived簡介
說到Keepalived,首先介紹一下什么是VRRP(Virtual Router Redundancy Protocol)協議,即虛擬器路由冗余協議,是為了解決局域網內默認網關單點失效的問題。
VRRP 將局域網內的一組路由器組成一個虛擬路由器組,每個路由器都有自己的局域網地址, 根據設置的優先級最高決定那個是master路由器。然后網關地址賦給該主路由器, 該主路由器定時發送VRRP報文向虛擬路由器組公布健康狀況, 備份的路由器根據波紋判斷Master路由器是否工作正常,從而決定是否要接替它. VRRP說白了就是實現IP地址漂移的,是一種容錯協議。在下圖中,Router A(10.100.10.1)、Router B(10.100.10.2)和Router C(10.100.10.3) 組成一個虛擬路由器。各虛擬路由器都有自己的IP地址。局域網內的主機將虛擬路由器設置為缺省網關。 Router A、Router B和Router C中優先級最高的那台路由器作為Master路由器,比如A,承擔網關的功能。局域網內的服務 只知道這台主master路由器A的存在,將自己缺省路由下一跳地址設置為該路由的ip地址10.100.10.1, 其余兩台路由器作為Backup路由器。當master路由器出故障后, backup路由器會根據優先級重新選舉出新的master路由器承擔網關功能。Master路由器周期性地發送VRRP報文, 在虛擬路由器中公布其配置信息(優先級等)和工作狀況。Backup路由器通過接收到VRRP報文的情況來判斷Master路由器是否工作工常。
![]()
Keepalived是基於vrrp協議的一款高可用軟件,它是作用在主機上,而不是路由器上。Keepailived把多台主機虛擬在一起,提供一個虛擬IP對外提供服務,它擁有一台master服務器和多台backup服務器,當主服務器出現故障時,虛擬IP地址會自動漂移到備份服務器,實現故障轉移的高可用可能,即雙機熱備。注意:服務器的時間一定要一致。
Haproxy簡介
HAProxy 提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是開源、快速並且可靠的一種解決方案。HAProxy 特別適用於那些負載特大的 web 站點, 這些站點通常又需要會話保持或七層處理(和Nginx比較有優勢的地方)。HAProxy 運行在當前的硬件上,完全可以支持數以萬計的並發連接。並且它的運行模式使得它可以很簡單安全的整 合進您當前的架構中, 同時可以保護你的 web 服務器不被暴露到網絡上。
它在kubernetes高可用集群中的作用如下圖,負責接收各節點發送給API Server的消息,然后負載均衡到任一個主節點,保證了數據的一致性:
思路大致就是lb這個集群中vip地址所在的節點負責監聽kubernetes集群的各組件發送給api的消息,然后haproxy利用負載均衡實現消息分發到各個kubernetes的master節點,keepalived則保證這個接收請求的“大門“保持敞開。
備注:一般推薦使用Haproxy+Keepalived來實現LB集群,不過本人對Nginx比較熟悉,所以我選擇Nginx+Keepalived來實現LB集群。
環境規划
LB(Master) 192.168.248.202 Nginx Keepalived LB(Backup) 192.168.248.206 Nginx Keepalived nfs-server VIP:192.168.248.209
安裝Keepalived
192.168.248.202服務器:
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
! 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 127.0.0.1 #郵箱服務器 smtp_connect_timeout 30 router_id 192.168.248.202 #主機名,每個節點不同 vrrp_skip_check_adv_addr # vrrp_strict 注釋,不然嚴格遵守vvrp,訪問不了vip vrrp_garp_interval 0 vrrp_gna_interval 0 }
#nginx配置 vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state MASTER #主服務器 interface ens32 #VIP 漂移到的網卡 virtual_router_id 51 #多個節點必須相同 priority 100 #優先級,備服務器比這個低 advert_int 1 #指定VRRP 心跳包通告間隔時間,默認1秒 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.248.209/26 #vip } }
192.168.248.206服務器:
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
! 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 127.0.0.1 smtp_connect_timeout 30 router_id linsrv2 } #nginx配置 vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state MASTER interface em1 virtual_router_id 51 priority 90 #優先級,備份服務器比這個低 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.248.209/26 } }
然后在192.168.248.202、192.168.248.206節點執行下列命令啟動Keepalived
systemctl start keepalived systemctl enable keepalived
現在你可以嘗試關閉主節點,看看vip是否漂移到其他節點去了,然后再打開主節點,vip又重新綁定到主節點的網卡上。
安裝Nginx
192.168.248.202、192.168.248.206服務器:
rpm -vih http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.0-1.el7.ngx.x86_64.rpm
vim /etc/nginx/nginx.conf
#配置文件最后一行追加如下內容 stream { log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent'; access_log /var/log/nginx/k8s-access.log main; upstream k8s-apiserver { server 192.168.248.161:6443; server 192.168.248.162:6443; } server { listen 6443; proxy_pass k8s-apiserver; } }
啟動nginx
systemctl start nginx systemctl enable nginx
Nginx+keepalived高可用配置
cat /etc/keepalived/check_nginx.sh
#!/bin/bash count=$(ps -ef |grep nginx |egrep -cv "grep|$$") if [ "$count" -eq 0 ];then exit 1 else exit 0 fi
並將此腳本加入到keepalived配置文件中(上面keepalived配置文件已加入)
vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" }
至此Nginx+Keepalived搭建完畢。