第1章 keepalived服务说明
1.1 keepalived是什么?
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
keepalived官网http://www.keepalived.org
1.2 keepalived服务的三个重要功能
管理LVS负载均衡软件
实现LVS集群节点的健康检查中
作为系统网络服务的高可用性(failover)
1.3 Keepalived高可用故障切换转移原理
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
那么,什么是VRRP呢?
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。
1.4 keepalived 原理
1.4.1keepalived高可用架构示意图
1.4.2 文字,表述
Keepalived的工作原理:
Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。
3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。
4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。
5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:
Keepalived高可用对之间是通过 VRRP进行通信的, VRRP是遑过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。
第2章 keepalived软件使用
2.1 软件的部署
实验环境: [root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@k8s-master ~]# sestatus SELinux status: disabled [root@k8s-master ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) [root@k8s-master ~]# systemctl status iptables ● iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) Active: inactive (dead)
2.1.1 第一个里程碑 keepalived软件安装
yum install keepalived -y
/etc/keepalived /etc/keepalived/keepalived.conf #keepalived服务主配置文件 /etc/rc.d/init.d/keepalived #服务启动脚本 /etc/sysconfig/keepalived /usr/bin/genhash /usr/libexec/keepalived /usr/sbin/keepalived
第二个里程碑: 进行默认配置测试
2.1.2 配置文件说明
1-13行表示全局配置
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 LVS_DEVEL #定义路由标识信息,相同局域网唯一 }
15-30行 虚拟ip配置 brrp
vrrp_instance VI_1 { #定义实例 state MASTER #状态参数 master/backup 只是说明 interface eth0 #虚IP地址放置的网卡位置 virtual_router_id 51 #主从ID一致 priority 100 # 优先级决定是主还是备 越大越优先 advert_int 1 #主备通讯时间间隔 authentication { # ↓ auth_type PASS #↓ auth_pass 1111 #认证 } #↑ virtual_ipaddress { #↓ 192.168.200.16 设备之间使用的虚拟ip地址 192.168.200.17 192.168.200.18 } }
配置管理LVS
2.1.3 最终配置文件
主负载均衡服务器配置
! Configuration File for keepalived global_defs { # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。 router_id k8s-master } # 检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等 vrrp_script chk_http_port { # 这里通过命令或脚本监测
# script "</dev/tcp/127.0.0.1/22"
script "/usr/local/sbin/chk_nginx_pid.sh" # 脚本执行间隔,每2s检测一次 interval 2 # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 #weight 2 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) #fall 2 # 检测1次成功就算成功。但不修改优先级 #rise 1 } vrrp_instance VI_1 { # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER state MASTER # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的 interface ens33 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 virtual_router_id 51 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 priority 150 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 # 设置验证类型和密码。主从必须一样 authentication { # 设置vrrp验证类型,主要有PASS和AH两种 auth_type PASS # 设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } # VRRP HA 虚拟地址 如果有多个VIP,继续换行填写 virtual_ipaddress { 192.168.12.233 }
# 执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
chk_http_port
}
}
备负载均衡服务器配置
! Configuration File for keepalived global_defs { # 运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。 router_id k8s-node2 } # 检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等 vrrp_script chk_http_port { # 这里通过脚本监测 script "/usr/local/sbin/chk_nginx_pid.sh" # 脚本执行间隔,每2s检测一次 interval 2 # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 #weight 2 # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) #fall 2 # 检测1次成功就算成功。但不修改优先级 #rise 1 } vrrp_instance VI_1 { # 指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER state BACKUP # 指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的 interface ens33 # 虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的 virtual_router_id 51 # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级 priority 100 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 # 设置验证类型和密码。主从必须一样 authentication { # 设置vrrp验证类型,主要有PASS和AH两种 auth_type PASS # 设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } # VRRP HA 虚拟地址 如果有多个VIP,继续换行填写 virtual_ipaddress { 192.168.12.233 }
# 执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
track_script {
# 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
chk_http_port
}
}
2.1.4 启动keepalived
[root@k8s-master ~]# systemctl start keepalived [root@k8s-master ~]# systemctl status keepalived ● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2020-05-26 12:27:49 CST; 1s ago Process: 36759 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 36760 (keepalived) Tasks: 3 Memory: 1.4M CGroup: /system.slice/keepalived.service ├─36760 /usr/sbin/keepalived -D ├─36761 /usr/sbin/keepalived -D └─36762 /usr/sbin/keepalived -D May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Registering Kernel netlink command channel May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Registering gratuitous ARP shared channel May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Opening file '/etc/keepalived/keepalived.conf'. May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: WARNING - default user 'keepalived_script' for script execution does not exist - please create. May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: SECURITY VIOLATION - scripts are being executed but script_security not enabled. May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Instance(VI_1) removing protocol VIPs. May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: Using LinkWatch kernel netlink reflector... May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)] May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Script(chk_http_port) succeeded May 26 12:27:49 k8s-master Keepalived_vrrp[36762]: VRRP_Instance(VI_1) Transition to MASTER STATE
2.1.5 测试web站点
[root@k8s-master ~]# curl 192.168.12.233 192.168.12.222 master [root@k8s-master ~]# systemctl stop nginx [root@k8s-master ~]# curl 192.168.12.233 192.168.12.224 backup
2.1.6 查看虚拟ip状态
[root@k8s-master ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:e2:cc:80 brd ff:ff:ff:ff:ff:ff inet 192.168.12.222/24 brd 192.168.12.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.12.233/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fee2:cc80/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:b5:91:d3:e9 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever
2.1.7 Nginx进程检测脚本
[root@k8s-master ~]# cat /usr/local/sbin/chk_nginx_pid.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ] then echo 'nginx server is died' systemctl stop keepalived fi
2.1.8 大坑
注意:keepalived默认使用端口122进行通讯,必须开放112端口,或者停用防火墙.保证各个主机之间112端口的连通性
# CentOS6中iptables配置开放112端口 iptables -I INPUT -p 112 -j ACCEPT service iptables save service iptables restart
# 查看端口开放情况
iptables -L -n --line-numbers
参考文章:https://www.cnblogs.com/clsn/p/8052649.html