简介

Keepalived是一个基于VRRP协议来实现服务器的高可用方案,可以利用其来避免单点故障。至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),其他为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会通过组播的方式发送消息给各个备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,各个备份服务器就会根据它们的优先级选举出来一个MASTER来接管虚拟IP,继续提供服务,从而保证了高可用性。

vrrp概念

keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。
在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。
Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。

VRRP协议过程简述

VRRP 将局域网的一组路由器(包括一个Master 即活动路由器和若干个Backup 即备份路由器)组织成一个虚拟路由器,称之为一个备份组。这个虚拟的路由器拥有自己的IP 地址10.100.10.1(这个IP 地址可以和备份组内的某个路由器的接口地址相同,相同的则称为ip拥有者),备份组内的路由器也有自己的IP 地址(如Master的IP 地址为10.100.10.2,Backup 的IP 地址为10.100.10.3)。局域网内的主机仅仅知道这个虚拟路由器的IP 地址10.100.10.1,而并不知道具体的Master 路由器的IP 地址10.100.10.2 以及Backup 路由器的IP 地址10.100.10.3。[1]它们将自己的缺省路由下一跳地址设置为该虚拟路由器的IP 地址10.100.10.1。于是,网络内的主机就通过这个虚拟的路由器来与其它网络进行通信。如果备份组内的Master 路由器坏掉,Backup 路由器将会通过选举策略选出一个新的Master 路由器,继续向网络内的主机提供路由服务。从而实现网络内的主机不间断地与外部网络进行通信。

VRRP原理

一个VRRP路由器有唯一的标识:VRID,范围为0—255该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]主控路由器负责对ARP请求用该MAC地址做应答这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少了切换对终端设备的影响[3]
VRRP控制报文只有一种:VRRP通告(advertisement)它使用IP多播数据包进行封装,组地址为224.0.0.18

发布范围只限于同一局域网内这保证了VRID在不同网络中可以重复使用为了减少网络带宽消耗只有主控路由器才可以周期性的发送VRRP通告报文备份路由器在连续三个通告间隔内收不到VRRP或收到优先级为0的通告后启动新的一轮VRRP选举[3]
在VRRP路由器组中,按优先级选举主控路由器,VRRP协议中优先级范围是0—255若VRRP路由器的IP地址和虚拟路由器的接口IP地址相同,则称该虚拟路由器作VRRP组中的IP地址所有者;IP地址所有者自动具有最高优先级:255优先级0一般用在IP地址所有者主动放弃主控者角色时使用可配置的优先级范围为1—254优先级的配置原则可以依据链路的速度和成本路由器性能和可靠性以及其它管理策略设定主控路由器的选举中,高优先级的虚拟路由器获胜,因此,如果在VRRP组中有IP地址所有者,则它总是作为主控路由的角色出现对于相同优先级的候选路由器,按照IP地址大小顺序选举VRRP还提供了优先级抢占策略,如果配置了该策略,高优先级的备份路由器便会剥夺当前低优先级的主控路由器而成为新的主控路由器[3]
为了保证VRRP协议的安全性,提供了两种安全认证措施:明文认证和IP头认证明文认证方式要求:在加入一个VRRP路由器组时,必须同时提供相同的VRID和明文密码适合于避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码IP头认证的方式提供了更高的安全性,能够防止报文重放和修改等攻击。

安装

yum install keepalived

配置文件格式

分为两部分:全局配置、实例配置

全局配置在global_defs {} 

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

global_defs {
     notification_email {
     acassen@firewall.loc                                #出问题时接收邮件的地址
     sysadmin@firewall.loc
   }
   smtp_server              192.168.200.1                #邮件服务器地址
   smtp_connect_timeout     30                            #连接超时时间
   router_id                 keepalive-node-1            #服务器标识名称,建议为主机名
   vrrp_mcast_group4        224.24.24.18                 #多播地址段,默认为224.0.0.18.可以自设置地址
}

View Code

实例配置

一个节点服务器配置文件中可以配置多个instance ,同一节点的每个instance 有一个唯一id ,keepalived 集群中同一虚拟机网络中节点id 一样(就是用同一个vip 的节点instance 一致),这样才能互相通讯。

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

vrrp_instance VI_1 {
    state                 MASTER    #必须大写,只有一个MASTER,其余都为BACKUP
    interface             eth0    #虚拟ip 绑定的网卡
    virtual_router_id     51        #vrid 同一虚拟路由组内的id 必须一致;同一主机上的其他虚拟路由id 区分开来
    priority             100        #优先级,MASTER为最大,范围:0-254
    advert_int             1        #发送组播的频率,默认为1s
    authentication {
        auth_type         PASS    #认证方式为密码
        auth_pass         1111    #同一虚拟路由组内的各个节点的密码必须一致,否则无法接收通讯,密码仅支持8位以内
    }
    virtual_ipaddress {
        192.168.1.200            #虚拟ip 地址
    }
    track_script {                #调用定义好的脚本,脚本中有判断条件,根据判断条件对权重更改
    chk_down                    #定义的脚本名
    }

####调用通知机制(非必要配置),当主机状态发生相应变化执行脚本进行邮件报警或其他操作######
    notify_master "/etc/keepalived/notify.sh master"    #notify_master 表示当当前主机为master时执行后面脚本操作。
    notify_backup "/etc/keepalived/notify.sh backup"    #状态为backup时的操作
    notify_fault "/etc/keepalived/notify.sh fault"        #状态为错误时的操作
}

View Code

keepalive 实现模式

单主模式

vrrp的地址转移实现。单主模式。一个虚拟路由vip

环境:172.16.253.95 做master

    172.16.253.96做backup

95 配置

vi /etc/keepalived/keepalived.conf

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

global_defs {
#   notification_email {
#     acassen@firewall.loc        #出问题时接收邮件的地址
#     sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc    #发邮件的地址
#   smtp_server 192.168.200.1                    #邮件服务器地址
#   smtp_connect_timeout 30                    #连接超时时间
   router_id         keepalive-node-1            #服务器标识名称,建议为主机名
   vrrp_mcast_group4 224.24.24.18                 #多播地址段,默认为224.0.0.18.可以自设置地址
}

vrrp_instance VI_1 {
    state         MASTER        #必须大写,只有一个MASTER,其余都为BACKUP
    interface         eth0        #虚拟ip 绑定的网卡
    virtual_router_id     51        #vrid 同一虚拟路由组内的id 必须一致;同一主机上的其他虚拟路由id 区分开来
    priority         100        #优先级,MASTER为最大,范围:0-254
    advert_int         1        #发送组播的频率,默认为1s
    authentication {
        auth_type     PASS        #认证方式为密码
        auth_pass     1111        #同一虚拟路由组内的各个节点的密码必须一致,否则无法接收通讯,密码仅支持8位以内
    }
    virtual_ipaddress {
        172.16.253.100            #虚拟ip 地址
    }

####调用通知机制(非必要配置),当主机状态发生相应变化执行脚本进行相应的邮件报警,当然也可配置其他操作,如zabbix 报警######
    notify_master "/etc/keepalived/notify.sh master"    #notify_master 表示当当前主机为master时执行后面脚本操作。
    notify_backup "/etc/keepalived/notify.sh backup"    #状态为backup时的操作
    notify_fault "/etc/keepalived/notify.sh fault"    #状态为错误时的操作
}

View Code

global_defs  为全局配置

96 配置

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

global_defs {
#   notification_email {
#     acassen@firewall.loc
#     failover@firewall.loc
#     sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
   router_id         keepalive-node-2
   vrrp_mcast_group4 224.24.24.18                              #多播地址段,默认为224.0.0.18.可以自设置地址
}

vrrp_instance VI_1 {
    state         BACKUP        #必须大写,只有一个MASTER,其余都为BACKUP
    interface         eth0        #虚拟ip 绑定的网卡
    virtual_router_id     51        #vrid 同一虚拟路由组内的id 必须一致
    priority         90        #优先级,MASTER为最大,范围:0-254
    advert_int         1        #发送组播的频率,默认为1s
    authentication {
        auth_type     PASS        #认证方式为密码
        auth_pass     1111        #同一虚拟路由组内的各个节点的密码必须一致,否则无法接收通讯
    }
    virtual_ipaddress {
        172.16.253.100            #虚拟ip 地址
    }
####调用通知机制(非必要配置),当主机状态发生相应变化执行脚本进行相应的邮件报警,当然也可配置其他操作,如zabbix 报警######
    notify_master "/etc/keepalived/notify.sh master"    #notify_master 表示当当前主机为master时执行后面脚本操作。
    notify_backup "/etc/keepalived/notify.sh backup"    #状态为backup时的操作
    notify_fault "/etc/keepalived/notify.sh fault"      #状态为错误时的操作
}

View Code

通知回调脚本(非必要配置)

vi notify.sh

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

contact='root@localhost'

notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
       notify master
                   ;;
backup)
       notify backup
                   ;;
fault)
       notify fault
                   ;;
*)
       echo "Usage: $(basename $0) {master|backup|fault}"
       exit 1
                   ;;
esac

View Code

测试

95 上停止keepalived 服务

service keepalived stop

96 上查看ip 是否已经切换过来

ip  a

总结:

单主模式:一个MASTER,其余都是BACKUP ,主的优先级最大,其余备的优先级小,正常请况下vip 绑定在主上,如果主服务器宕掉,那么备服务器根据优先级选举出来一个MASTER,当原来的主服务器正常后又会重新夺回VIP,成为MASTER。

通知回调功能:此功能就是当节点状态变化(MASTER/BACKUP/FAULT)时触发的一个脚本,这个脚本可以是邮件发送操作也可以自定义其他操作。此脚本触发的前提是keepalive 服务运行时触发,若停止则不触发。

双主模式

有两个服务各自通过不同的IP 地址对外提供服务,此时可以配置两个vip ,然后两个vip 的主备分别在两个主机上,形成双主模式,这样既负载均衡了,出故障也一样可以切换实现高可用。

95主机增加如下代码:

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

vrrp_instance VI_2 {

state BACKUP
interface eth0
virtual_router_id 02
priority 95
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}   
virtual_ipaddress {
172.16.253.200
}
}

View Code

96主机:
增加如下代码,相当于增加了另一组虚拟路由器vip2 172.16.253.200

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_运维

ecs k8s keepalived虚拟ip不通 keepalived 虚拟ip原理_服务器_02

vrrp_instance VI_2 {

state MASTER
interface eth0
virtual_router_id 02
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}
virtual_ipaddress {
172.16.253.200
}
}

View Code

重启服务,测试步骤省略。

脚本检测实现优先级的改变进而切换主备

此文件内有脚本的例子,以及如何调用
/usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck

脚本简述

1:在配置文件中定义脚本(可以放在全局配置区域,也可以与instance 一样单独配置)
vrrp_script chk_sshd {

script "ls /etc/keepalived/test.txt"        # cheaper than pidof
   interval 2                      # check every 2 seconds
   weight -4                       # default prio: -4 if KO fall 2 # require 2 failures for KO rise 2 # require 2 successes for OK

}

定义调用脚本 使用 vrrp_script 关键词,脚本名 chk_sshd

脚本内容解析:

script "ls /etc/keepalived/test.txt"
表示 此段代码返回0值则无任何操作,返回1,要执行一些关键指令比如配置文件中定义的weigt -4
测试:rm -rf  /etc/keepalived/

   weight -4   满足fall中定义的失败次数则权重 -4

fall 2        检测失败2次,才减去权重
rise -2     检查两次成功,则恢复权重,如果只有fall没有rise 配置那么即使脚本返回正常权重值也不会恢复原值

2:在配置文件中调用脚本(必须在instance 中调用脚本才会生效)
在 vrrp_instance中
使用track_script {

#可以有多个脚本调用来对权重值更改
   chk_haproxy weight 2
   chk_http_port
   chk_https_port
   chk_smtp_port
}