使用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
posted @ 2020-07-31 18:09  名字很长容易被惦记  阅读(2879)  评论(1编辑  收藏  举报