搭建高可用Kubernetes集群之Nginx+Keepalived集群搭建(二)

Keepalived简介

说到Keepalived,首先介绍一下什么是VRRP(Virtual Router Redundancy Protocol)协议,即虚拟器路由冗余协议,是为了解决局域网内默认网关单点失效的问题。

VRRP 将局域网内的一组路由器组成一个虚拟路由器组,每个路由器都有自己的局域网地址, 根据设置的优先级最高决定那个是master路由器。然后网关地址赋给该主路由器, 该主路由器定时发送VRRP报文向虚拟路由器组公布健康状况, 备份的路由器根据波纹判断Master路由器是否工作正常,从而决定是否要接替它. VRRP说白了就是实现IP地址漂移的,是一种容错协议。在下图中,Router A(10.100.10.1)、Router B(10.100.10.2)和Router C(10.100.10.3) 组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。 Router A、Router B和Router C中优先级最高的那台路由器作为Master路由器,比如A,承担网关的功能。局域网内的服务 只知道这台主master路由器A的存在,将自己缺省路由下一跳地址设置为该路由的ip地址10.100.10.1, 其余两台路由器作为Backup路由器。当master路由器出故障后, backup路由器会根据优先级重新选举出新的master路由器承担网关功能。Master路由器周期性地发送VRRP报文, 在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作工常。


 

Keepalived是基于vrrp协议的一款高可用软件,它是作用在主机上,而不是路由器上。Keepailived把多台主机虚拟在一起,提供一个虚拟IP对外提供服务,它拥有一台master服务器和多台backup服务器,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器,实现故障转移的高可用可能,即双机热备。注意:服务器的时间一定要一致。

Haproxy简介

HAProxy 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是开源、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理(和Nginx比较有优势的地方)。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。

它在kubernetes高可用集群中的作用如下图,负责接收各节点发送给API Server的消息,然后负载均衡到任一个主节点,保证了数据的一致性:

思路大致就是lb这个集群中vip地址所在的节点负责监听kubernetes集群的各组件发送给api的消息,然后haproxy利用负载均衡实现消息分发到各个kubernetes的master节点,keepalived则保证这个接收请求的“大门“保持敞开。

备注:一般推荐使用Haproxy+Keepalived来实现LB集群,不过本人对Nginx比较熟悉,所以我选择Nginx+Keepalived来实现LB集群。

环境规划

1
2
3
LB(Master)  192.168.248.202 Nginx Keepalived 
LB(Backup)  192.168.248.206 Nginx Keepalived nfs-server
VIP:192.168.248.209

安装Keepalived

192.168.248.202服务器:

1
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
! 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 192.168.248.202  #主机名,每个节点不同
   vrrp_skip_check_adv_addr
   # vrrp_strict  注释,不然严格遵守vvrp,访问不了vip
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
<br>#nginx配置
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
 
vrrp_instance VI_1 { 
    state MASTER  #主服务器
    interface ens32  #VIP 漂移到的网卡
    virtual_router_id 51  #多个节点必须相同
    priority 100  #优先级,备服务器比这个低
    advert_int 1  #指定VRRP 心跳包通告间隔时间,默认1秒
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.248.209/26 #vip
    }
}

192.168.248.206服务器:

1
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
! 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 linsrv2
}
 
#nginx配置
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
 
vrrp_instance VI_1 {
    state MASTER
    interface em1
    virtual_router_id 51
    priority 90  #优先级,备份服务器比这个低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.248.209/26
    }
}

然后在192.168.248.202、192.168.248.206节点执行下列命令启动Keepalived

1
2
systemctl start keepalived
systemctl enable keepalived

现在你可以尝试关闭主节点,看看vip是否漂移到其他节点去了,然后再打开主节点,vip又重新绑定到主节点的网卡上。

安装Nginx

192.168.248.202、192.168.248.206服务器:

1
rpm -vih http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.0-1.el7.ngx.x86_64.rpm
vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#配置文件最后一行追加如下内容
stream {
 
    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
 
    access_log  /var/log/nginx/k8s-access.log  main;
 
    upstream k8s-apiserver {
                server 192.168.248.161:6443;
                server 192.168.248.162:6443;
            }
 
    server {
       listen 6443;
       proxy_pass k8s-apiserver;
    }
}

启动nginx

1
2
systemctl start nginx
systemctl enable nginx

Nginx+keepalived高可用配置 

cat /etc/keepalived/check_nginx.sh 

1
2
3
4
5
6
7
8
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
 
if [ "$count" -eq 0 ];then
    exit 1
else
    exit 0
fi

 并将此脚本加入到keepalived配置文件中(上面keepalived配置文件已加入)

1
2
3
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
} 

至此Nginx+Keepalived搭建完毕。

参考:https://www.jianshu.com/p/7a41f0294f32

posted @   人艰不拆_zmc  阅读(1044)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示