keepalived

实验环境:

主机 ipaddress 服务 备注
k8s-master1 10.0.0.63 nginx
k8s-master2 10.0.0.64 nginx
k8s-node1 10.0.0.65 keepalived
k8s-node2 10.0.0.66 keepalived

拓扑图:

VRRP协议理解

VRRP协议是一款网关冗余备份协议,由主备组成,目的是能实现业务冗余能力,在服务器出现故障出现和恢复时做到自动切换主备的一种技术,它利用vrrp发送组播包,进行主备竞选.完成竞选后实现主备切换能力.

后端节点配置[nginx]

k8s-master1配置:
  yum install -y nginx
  systemctl start nginx
  echo "master1 10.0.0.63" >/usr/share/nginx/html/index.html 
  
k8s-master2配置:
  yum install -y nginx
  systemctl start nginx
  echo "master2 10.0.0.64" >/usr/share/nginx/html/index.html
  
检查:
[root@k8s-master1 ~]# curl 10.0.0.63
master1 10.0.0.63
[root@k8s-master1 ~]# curl 10.0.0.64
master2 10.0.0.64

前端nginx负载均衡配置:

 # 10.0.0.65配置:
 yum install -y nginx
 egrep -v "^$|#" /etc/nginx/nginx.conf.default >/etc/nginx/nginx.conf
 systemctl start nginx
 
 修改/etc/nginx/nginx.conf为如下内容:
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream leilei_poll {
        server 10.0.0.63;
        server 10.0.0.64;
        }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://leilei_poll;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试:
[root@k8s-node1 ~]# curl 10.0.0.65
master1 10.0.0.63
[root@k8s-node1 ~]# curl 10.0.0.65
master2 10.0.0.64

-------------------------------------------------------------------------

 # 10.0.0.66配置:
 直接拷贝10.0.0.65的配置文件
 worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream leilei_poll {
        server 10.0.0.63;
        server 10.0.0.64;
        }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://leilei_poll;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

#测试:
[root@k8s-node1 ~]# curl 10.0.0.66
master1 10.0.0.63
[root@k8s-node1 ~]# curl 10.0.0.66
master2 10.0.0.64
网页访问效果一样.它默认是轮询算法.

keepalived原理:

Keepalived对服务器运行状态和故障隔离的工作原理:
Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层(5):,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

keepalived部署

10.0.0.65
10.0.0.66  两台安装 keepalived

安装keepalived:
yum install -y keepalived

keepalived配置:

keepalived主配置文件: /etc/keepalived/keepalived.conf

精简后配置文件如下[未配置]:
! Configuration File for keepalived

global_defs {
        router_id lb01            #唯一标识,如果有两台或多台,他们的ID不能够冲突.
}

vrrp_instance VI_1 {
    state MASTER               #定义master 状态.
    interface eth0             #定义网卡名
    virtual_router_id 51       #虚拟ID需要一样.否则无法交互.
    priority 100               # 优先级,优先最高,就会成为主 主的服务器中会生成 虚拟IP地址
    advert_int 1               # 发送组播包的时间间隔
    authentication {           #认证信息
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {        #vip虚拟地址.
        10.0.0.100             #需要相同.
    }
}

配置文件需要在两台负载上都修改

主:
keppalived配置10.0.0.65:

! Configuration File for keepalived

global_defs {
        router_id lb01
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.100
    }
}


#------------------------------------------------------------------------#

备:
keppalived配置10.0.0.66:

! Configuration File for keepalived

global_defs {
   router_id lb02
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.100
    }
}

两台lb配置完毕后都需要进行重启:
systemctl start keepalived.service


此时通过访问:
10.0.0.100 就可以完成访问. 注意: 配置了keepalived之后,web服务器就是10.0.0.100了.

keepalived 主备检查:

在10.0.0.65服务器中使用 ip a 进行IP查看,会发现生成了一个虚拟IP为 10.0.0.100 
如果这台服务器优先级不够,虚拟IP就不存在.

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a2:e0:50 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.65/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.100/32 scope global eth0           <<---------虚拟IP10.0.0.100 生成了.
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea2:e050/64 scope link 
       valid_lft forever preferred_lft forever
       
 通过查看10.0.0.66的IP信息,无法发现 10.0.0.100 ,说明此时,10.0.0.65就是主. 
 另外注意,如果有域名,则需要绑定域名和IP 他们绑定的IP必须是虚拟IP.

故障转移:

在有主备的情况下,测试down掉主看是否会进行主备切换.
 
 
 如果其中一台keep挂了 就会切换到另一台
 如果其中一台lib挂了 也会切换到另一组

检查keepalived:

10.0.0.66优先级配置的100 10.0.0.65优先级默认150 如果两台keepalived同时开启,从访问日志能看到的应该是 10.0.0.65

如果关闭10.0.0.65keepalived,那么他会自动切换到10.0.0.66的keepalived

如果关闭10.0.0.63nginx,则访问keepalived的出现的结果一定会是10.0.0.64,且不会切换
image-20200508150449121

如果关闭10.0.0.64nginx,则访问keepalived的出现的结果一定会是10.0.0.63,且不会切换
image-20200508151212455

keepalived脑裂

1.高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
  因心跳线坏了(包括断了,老化)。
  因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
  因心跳线间连接的设备故障(网卡及交换机)。
  因仲裁的机器出问题(采用仲裁的方案)。
  
2.高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
3.高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
4.其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
5.Keepalived配置里同一 VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。

开启iptables防火墙后会阻止组播包,一旦开启后 就会产生脑裂

keepalived脑裂解决办法

需要在备用机上进行监控,用于发现备机在主还没down的情况下切换为了主.
> 备机上出现 虚拟 vip情况.  如: 脑裂,正常切换 等信息

在非主中配置脚本,来监控脑裂的发生,并及时通知管理员
通过shell脚本来监控脑裂:
echo '/proc/sys/net/ipv4/ip_nonlocal_bind =1' >>/etc/sysctl.conf
sysctl -p



10.0.0.66备用服务器配置:

  1. 配置脚本[放在备用服务器中,在备用服务器出现漂移IP时通知管理员]
    chmod a+x check_keepalived.sh
    vim keepalived.sh

!/bin/bash

if [ ip a s eth0|grep 10.0.0.100|wc -l -ne 0 ]
then
echo "keepalived is error!!"
else
echo "keepalived is ok" #这里也可以配置email
fi

  1. 配置定时任务调用脚本[备用服务器配置]
    echo '* * * * * bash check_keepalived.sh' >>/var/spool/cron/root
    systemctl restart crond.service
    crontab -l

  2. 添加解析记录,将域名解析到虚拟ip中,两台主备均需要配置解析记录.
    10.0.0.100 leilei.com

posted @ 2021-10-09 13:22  陈雷雷  阅读(195)  评论(0编辑  收藏  举报