1. 程式人生 > 實用技巧 >lvs+keepalived實現k8s多master叢集負載均衡

lvs+keepalived實現k8s多master叢集負載均衡

介紹

lvs全名是Linux Virtual Server意思是linux虛擬機器,是一個虛擬的伺服器集群系統,有三種負載均衡模式和8中排程演算法,只能執行在4層做埠轉發。感興趣的自行度娘。一般情況用的都是經典的DR模式。另外CentOS7已經集成了LVS的核心,所以只需要安裝LVS的配置管理工具ipvsadm就可以了,要執行命令配置很麻煩。同時lvs叢集中如果有伺服器掛掉,控制器依舊會往這個壞掉的伺服器轉發,這時候就不舒爽了。
所以為了解決這個問題,Keepalived誕生啦,起初是專用來給LVS叢集,監控集群系統中各個伺服器健康狀態的。它可以從3.4.5層檢測,發現伺服器掛掉就從LVS叢集裡剔除。所以也可以從keepalived中配置lvs配置。
所以,一般的lvs+keepalived高可用架構,在centos7上只要安裝keepalived就可以了。安裝很方便,重點的配置檔案上,要花一些功夫。

安裝

yum install keepalived -y

systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived

配置檔案詳解

keepalive的配置檔案位置在/etc/keepalived/keepalived.conf
有三類配置區域,注意不是三種配置檔案,是一個配置檔案裡面三種不同類別的配置區域:
全域性配置(Global Configuration) ,配置郵件通知、真實服務資訊什麼的,雙網絡卡的要配這個
VRRPD配置,配置真實伺服器主機組,檢查規則,優先順序之類的資訊
LVS配置,配置虛擬主機組和虛擬主機,一般配虛擬主機就可以了

global_defs {
notification_email { #指定keepalived在發生切換時需要傳送email到的物件,一行一個
[email protected]
}
notification_email_from [email protected] #指定發件人
smtp_server stmp.3evip.cn #指定smtp伺服器地址
smtp_connect_timeout 30 #指定smtp連線超時時間
router_id LVS_DEVEL #執行keepalived機器的一個標識
}

vrrp_sync_group VG_1{ #監控多個網段的例項
group {
inside_network #例項名
outside_network
}
notify_master /path/xx.sh #指定當切換到master時,執行的指令碼
netify_backup /path/xx.sh #指定當切換到backup時,執行的指令碼
notify_fault "path/xx.sh VG_1" #故障時執行的指令碼
notify /path/xx.sh 
smtp_alert #使用global_defs中提供的郵件地址和smtp伺服器傳送郵件通知
}

vrrp_instance inside_network {
state BACKUP #指定那個為master,那個為backup,如果設定了nopreempt這個值不起作用,主備考priority決定
interface eth0 #設定例項繫結的網絡卡
dont_track_primary #忽略vrrp的interface錯誤(預設不設定)
track_interface{ #設定額外的監控,裡面那個網絡卡出現問題都會切換
eth0
eth1
}
mcast_src_ip #傳送多播包的地址,如果不設定預設使用繫結網絡卡的primary ip
garp_master_delay #在切換到master狀態後,延遲進行gratuitous ARP請求
virtual_router_id 50 #VPID標記
priority 99 #優先順序,高優先順序競選為master
advert_int 1 #檢查間隔,預設1秒
nopreempt #設定為不搶佔 注:這個配置只能設定在backup主機上,而且這個主機優先順序要比另外一臺高
preempt_delay #搶佔延時,預設5分鐘
debug #debug級別
authentication { #設定認證
auth_type PASS #認證方式
auth_pass 111111 #認證密碼
}
virtual_ipaddress { #設定vip
192.168.36.200
}
}
virtual_server 192.168.36.99 80 {
delay_loop 6 #健康檢查時間間隔
lb_algo rr #lvs排程演算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #負載均衡轉發規則NAT|DR|RUN
persistence_timeout 5 #會話保持時間
protocol TCP #使用的協議
persistence_granularity <NETMASK> #lvs會話保持粒度
virtualhost <string> #檢查的web伺服器的虛擬主機(host:頭) 
sorry_server<IPADDR> <port> #備用機,所有realserver失效後啟用
real_server 192.168.200.5 23 {
weight 1 #預設為1,0為失效
inhibit_on_failure #在伺服器健康檢查失效時,將其設為0,而不是直接從ipvs中刪除 
notify_up <string> | <quoted-string> #在檢測到server up後執行指令碼
notify_down <string> | <quoted-string> #在檢測到server down後執行指令碼
TCP_CHECK {
connect_timeout 3 #連線超時時間
nb_get_retry 3 #重連次數
delay_before_retry 3 #重連間隔時間
connect_port 23 健康檢查的埠的埠
bindto <ip> 
}
HTTP_GET | SSL_GET{
url{ #檢查url,可以指定多個
path /
digest <string> #檢查後的摘要資訊
status_code 200 #檢查的返回狀態碼
}
connect_port <port> 
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}

SMTP_CHECK{
host{
connect_ip <IP ADDRESS>
connect_port <port> #預設檢查25埠
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> #smtp helo請求命令引數,可選
}
MISC_CHECK{
misc_path <string> | <quoted-string> #外部指令碼路徑
misc_timeout #指令碼執行超時時間
misc_dynamic #如設定該項,則退出狀態碼會用來動態調整伺服器的權重,返回0 正常,不修改;返回1,檢查失敗,權重改為0;返回2-255,正常,權重設定為:返回狀態碼-2
}
}
}

state:state指定instance(Initial)的初始狀態,就是說在配置好後,這臺伺服器的初始狀態就是這裡指定的,但這裡指定的不算,還是得要通過競選通過優先順序來確定,裡如果這裡設定為master,但如若他的優先順序不及另外一臺,那麼這臺在傳送通告時,會發送自己的優先順序,另外一臺發現優先順序不如自己的高,那麼他會就回搶佔為master

interface:例項繫結的網絡卡,因為在配置虛擬IP的時候必須是在已有的網絡卡上新增的

dont track primary:忽略VRRP的interface錯誤

track interface:跟蹤介面,設定額外的監控,裡面任意一塊網絡卡出現問題,都會進入故障(FAULT)狀態,例如,用nginx做均衡器的時候,內網必須正常工作,如果內網出問題了,這個均衡器也就無法運作了,所以必須對內外網同時做健康檢查

mcast src ip:傳送多播資料包時的源IP地址,這裡注意了,這裡實際上就是在那個地址上傳送VRRP通告,這個非常重要,一定要選擇穩定的網絡卡埠來發送,這裡相當於heartbeat的心跳埠,如果沒有設定那麼就用預設的繫結的網絡卡的IP,也就是interface指定的IP地址

garp master delay:在切換到master狀態後,延遲進行免費的ARP(gratuitous ARP)請求

virtual router id:這裡設定VRID,這裡非常重要,相同的VRID為一個組,他將決定多播的MAC地址

priority 100:設定本節點的優先順序,優先順序高的為master

advert int:檢查間隔,預設為1秒

virtual ipaddress:這裡設定的就是VIP,也就是虛擬IP地址,他隨著state的變化而增加刪除,當state為master的時候就新增,當state為backup的時候刪除,這裡主要是有優先順序來決定的,和state設定的值沒有多大關係,這裡可以設定多個IP地址

virtual routes:原理和virtual ipaddress一樣,只不過這裡是增加和刪除路由

lvs sync daemon interface:lvs syncd繫結的網絡卡

authentication:這裡設定認證

auth type:認證方式,可以是PASS或AH兩種認證方式

auth pass:認證密碼

nopreempt:設定不搶佔,這裡只能設定在state為backup的節點上,而且這個節點的優先順序必須別另外的高。當主mysql恢復後不搶佔資源

preempt delay:搶佔延遲

debug:debug級別

notify master:和sync group這裡設定的含義一樣,可以單獨設定,例如不同的例項通知不同的管理人員,http例項發給網站管理員,mysql的就發郵件給DBA

k8s例項

配置檔案
keepalived.conf


! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"
    interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface em1
    mcast_src_ip 10.61.150.16
    virtual_router_id 51
    priority 50
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.61.150.188
    }
    track_script {
       chk_apiserver
    }
}

檢測指令碼
check_apiserver.sh

#!/bin/bash
# if check error then repeat check for 12 times, else exit
err=0
for k in $(seq 1 6)
do
    check_code=$(ps -ef | grep kube-apiserver | grep -v color | grep -v grep | wc -l)
    if [[ $check_code == "0" ]]; then
        err=$(expr $err + 1)
        sleep 5
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi

check_k8s_master.sh

#!/bin/bash
count=`ss -tnl | grep 7443 | wc -l`

if [ $count = 0 ]; then
    exit 1
else
    exit 0
fi

故障收集

1、腦裂現象