搭建高可用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搭建完毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构