👨🏻‍🎓博主介绍:大家好!我是李大白,一名运维容器运维工程师,热爱分享知识🌟 

🌈擅长领域:云原生、数据库、自动化运维

🙏🏻如果本文章对小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏!

🤝如果在文章描述时如有错,恳请各位大佬指正,在此感谢!!!

🍂 落叶而知秋,博闻而强识!

📕  精品专栏:Harbor大白话(企业级)


1、Keepalived概述

Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。负载平衡框架依赖于著名且广泛使用的Linux 虚拟服务器 (IPVS) 内核模块,提供第 4 层负载平衡。Keepalived 实现了一组检查器,以根据其健康状况动态和自适应地维护和管理负载平衡的服务器池。。

主要包括基于LVS的负载均衡器、以VRRP(虚拟路由冗余协议)实现的HA虚拟IP两种服务。


2、Keepalive功能

  • 设置IP:包括设置静态ip、静态路由以及虚拟ip
  • failover: 主从互备
  • 健康检查
  • Smtp通知
  • 集成ipvs的负载均衡


3、Keepalived原理

keepalived检测服务节点的服务状态,如果服务节点出现异常,keepalived会将异常节点从集群系统中剔除。故障节点恢复后,Keepalived再将节点重新加入到集群系统中。所以工作由keepalived自动完成,无需人工干预。


4、架构及组成

高可用架构设计:Keepalived实现高可用集群_nginx

  • Control Plane:

主要负责配置文件keepalived.conf的解析,通过解析该文件后,存放到内存中。

  • Scheduler - I/O Multiplexer

进程的事件调度机制处理

  • Memory Management

负责内存的申请、使用以及释放。

  • Core Components

核心组件,包括各种常用的公共程序,比如List/Vector,以及字符串解析等等。

  • Watch Dog

主要用于父进程检查子进程,通过socket发送hello消息,如果子进程没接收到或者没回应。那么父进程认为子进程宕掉了,需要做重启处理。

  • Checkers

负责RealServer的健康检查。健康检查包括layer4到layer7的检查,包括TCP_CHECK/HTTP_GET等健康检查。

  • VRRP Stack

VRRP协议的实现。该协议是keepalived一个功能,可以单独使用,而不依赖LVS

  • System Call

对系统调用、脚本执行进行了封装。

  • SMTP

内部实现了邮件发送通知。

  • IPVS Wrapper

对linux内核ipvs的一层包装程序。相当于keepalived和ipvs中间的一层传输介质。Keepalived有内部的数据表现形式,通过调用ipvs wrapper层,将keepalived的内部数据表现,转换成ipvs最终所需要的数据格式。

  • Netlink Reflector

对linux内核netlink的封装。


5、Keepalived安装

CentOS系统在本地yum源中已经存在安装包,可以直接进行安装。

5.1 yum一键安装

[root@master1 ~]# yum  install  -y keepalived
[root@master1 ~]# rpm -qa | grep keepalived #查看是否安装成功
keepalived-1.3.5-6.el7.x86_64

5.2 源码安装

1)下载源码包并编译安装

$ yum install gcc-c++  gcc openssl openssl-devel   #安装依赖包
$ wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
$ tar –zxvf keepalived-1.2.19.tar.gz
$ cd keepalived-1.2.19
$ ./configure --prefix=/usr/local/keepalived
$ make && make install

使用yum安装会安装固定的版本,实际场景中可能无法满足我们的需要。根据configure –prefix的路径,我们安装在了/usr/local/keepalived路径下

bin目录:主要包含genhash脚本,用于生产成md5的digest字符串;

etc:包含了默认配置文件以及samples,以及rc.d等;

sbin: 包含了keepalived的可执行文件;

2)配置keepalived

$ cd /usr/local/keepalived
$ cp sbin/keepalived /usr/local/bin/ #拷贝二进制可执行文件到$PATH
$ cp etc/sysconfig/keepalived /etc/sysconfig/
$ cp etc/rc.d/init.d/keepalived /etc/init.d/
$ mkdir /etc/keepalived
$ cp etc/keepalived/keepalived.conf /etc/keepalived #拷贝配置文件

3)启动Keepalived

$ sysetmctl start  keepalived.service
$ sysetmctl enable keepalived.service
$ sysetmctl status keepalived.service
$ ps aux | grep keepalived


6、Keepalived配置文件解析

  • keepalived的配置文件在/etc/keepalived/keepalived.conf

一个功能比较完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。

[root@master1 ~]# man keepalived.conf   #查看配置的解释说明
[root@master1 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局定义块
notification_email { #指定告警收件人邮箱列表
lidabai@qq.com
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 #设置路由ID号(全局唯一)
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 { #vrrp实例
state MASTER #主服务器为MASTER、备服务器为BACKUP
interface eth0 #定义网络接口
virtual_router_id 51 #虚拟路由ID号(主备必须一致)
priority 100 #服务器优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #密码(主备服务器必须一致)
}
virtual_ipaddress { #虚拟IP地址(VIP)
192.168.200.16
192.168.200.17
192.168.200.18
}
}
##########虚拟服务定义块###############
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

vrrp_script check_running {
script “/usr/local/bin/check_running” #检测脚本位置
interval 10 #脚本执行间隔(即每多少秒执行1次检测脚本)
weight -10 #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
fall 2 #如果script执行失败2次,那么表示次实例失败,需要进行切换主备。
}


7、Keepalived+Nginx实现高可用

主:master1、192.168.2.91

备:master2、192.168.2.92


7.1 安装nginx和keepalived

[root@master1 ~]# yum install  -y nginx keepalived
[root@master1 ~]# yum install -y nginx keepalived


7.2 配置nginx服务

1)修改nginx配置文件,主备一致

$ vim  /etc/nginx/nginx.conf
http {
upstream k8s-apiserver { #在http全局块添加这3行内容
server 192.168.2.91:16443;
server 192.168.2.92:16443;
}


2)启动nginx服务

$ systemctl start nginx && systemctl enable nginx
$ systemctl status nginx



7.3 配置Keepalived

1)修改主备keepalived配置文件

[root@master1 ~]# vim  /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER #从节点改为NGINX_BACKUP
}


######定义虚拟路由#####
vrrp_instance VI_1 {
state MASTER #主节点(BACKUP为备节点)
interface ens33 #网卡名称
virtual_router_id 51 #虚拟路由ID号(主备必须一致),每个实例唯一
mcast_src_ip 192.168.2.91 #本机IP
priority 100 #优先级(备要比主小)备服务器设置 80
nopreempt #解决异常恢复后再次抢占的问题
advert_int 1 #广播周期(秒),主备一致
authentication {
auth_type PASS #VRRP认证方式(主备必须一致)
auth_pass 1111  #密码
}
virtual_ipaddress { #VIP,可多个
192.168.2.90
}
#将track_script块加入instance配置块
track_script {
chk_nginx #执行nginx监控服务
}
}
#######健康检查##########
vrrp_script chk_nginx { #chk_nginx #执行nginx监控服务
script "/etc/keepalived/check_nginx.sh" #健康检测脚本(检测nginx服务状态)
interval 2 #检测时间间隔
weight -20 #如果条件成立,权重减20
}

2)编写健康检查检测脚本

在主备节点进行同样操作

$ vim /etc/keepalived/check_nginx.sh 
#!/bin/bash
count=$(ps -ef |grep nginx | grep sbin | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then #判断nginx进程是否存在
systemctl stop keepalived
fi
$ chmod +x /etc/keepalived/check_nginx.sh


3)启动keepalived服务

主备操作

$ systemctl start keepalived && systemctl enable keepalived 


8、验证

$ ifconfig ens33   #查看网卡可以发现VIP地址绑定到master1节点了

然后停止master1的nginx服务,看VIP是否会漂移到master2(备节点)上。