使用kubeadm部署k8s多master集群(二)lvs+keepalived


介紹

簡單說lvs負責負載均衡,keepalived負責服務冗余即故障遷移。
lvs全名是Linux Virtual Server意思是linux虛擬機,是一個虛擬的服務器集群系統,有三種負載均衡模式和8中調度算法,只能運行在4層做端口轉發,一般情況用的都是經典的DR模式。
另外CentOS7已經集成了LVS的核心,所以只需要安裝LVS的配置管理工具ipvsadm就可以配置lvs,但命令行配置很麻煩。而且lvs集群中如果有服務器掛掉,控制器依舊會往這個壞掉的服務器轉發。
為了解決這個問題,Keepalived誕生啦,起初是專用來給LVS集群,監控集群系統中各個服務器健康狀態的。可以從3.4.5層檢測,發現服務器掛掉就從LVS集群里剔除。而且在keepalived中可以配置lvs,所以一般情況,我們安裝、配置好keepalived就可以實現lvs+keepalived架構。

安裝

yum install keepalived -y

systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived

配置文件詳解

keepalive的配置文件位置在/etc/keepalived/keepalived.conf
有三類配置區域,注意不是三種配置文件,是一個配置文件里面三種不同類別的配置區域:

  1. 全局配置(Global Configuration) ,配置郵件通知、真實服務信息什么的,雙網卡的要配這個
  2. VRRPD配置,配置真實服務器主機組,檢查規則,優先級之類的信息
  3. LVS配置,配置虛擬主機組和虛擬主機,一般配虛擬主機就可以了
global_defs {
	notification_email { #指定keepalived在發生切換時需要發送email到的對象,一行一個
		monitor@3evip.cn
	}
	notification_email_from monitor@3evip.cn #指定發件人
	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.x.x
    virtual_router_id 51
    priority 50
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       10.61.x.x
    }
    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM