LVS/IPVS和Keepalived在云原生环境中扮演着不可或缺的角色,特别是在构建高可用负载均衡架构方面。即使有云厂商提供的负载均衡器,掌握LVS/IPVS和Keepalived仍然是云原生运维人员的必备技能。
一、LVS/IPVS基础理论
1.1 LVS/IPVS概述
LVS/Linux Virtual Server(Linux虚拟服务器)是一个基于Linux内核的高性能负载均衡框架,由章文嵩博士于1998年创立。LVS由两个核心组件构成:ipvs(内核模块)和ipvsadm(用户空间管理工具)。ipvs是LVS的核心,工作在Linux内核的网络栈中,实现四层(传输层)负载均衡 ;而ipvsadm是管理IPVS规则的命令行工具。
在Kubernetes环境中,kube-proxy组件从v1.8版本开始支持IPVS模式 (初始为alpha状态,v1.11进入beta),通过监听API Server的Service和Endpoint变化,动态更新IPVS规则,将流量从Service的ClusterIP转发到后端Pod。截至Kubernetes v1.34,IPVS模式仍未成为默认模式 ------kube-proxy的默认模式仍然是iptables 。需显式配置--proxy-mode=ipvs参数启用IPVS模式。社区虽长期讨论将IPVS设为默认(KEP-1390),但因兼容性和稳定性考量,该计划已被搁置。在生产环境中,应始终以官方文档为准,目前所有Kubernetes版本的默认代理模式均为iptables。
1.2 LVS三种工作模式详解
LVS有三种主要工作模式,每种模式适用于不同的网络拓扑:
NAT模式(Network Address Translation)
- 工作原理 : Director将请求的源IP(CIP)替换为自身IP(DIP) ,目标IP(VIP)保持不变,转发给RS。RS处理后,将响应返回给Director,由Director将源IP改回VIP后转发给客户端。
- 适用场景:小规模集群,Director和RS可跨网络。
- 优势:配置简单,RS无需特殊配置。
- 劣势:所有流量(请求+响应)均经过Director,易成瓶颈。
DR模式(Direct Routing)
- 工作原理 : Director仅修改请求的目标MAC地址为RS的MAC ,IP地址不变。RS处理后直接响应给客户端(不经过Director)。
- 适用场景:大规模集群,Director和RS必须在同一二层网络。
- 优势:仅请求流量经过Director,性能最佳。
- 劣势 :需在RS配置VIP到lo接口,并设置
net.ipv4.conf.all.arp_ignore=1和net.ipv4.conf.all.arp_announce=2抑制ARP响应。
TUN模式(IP Tunneling)
- 工作原理 : Director将请求封装在IP隧道(如IPIP) 中发送给RS。RS解封装后处理请求,响应数据包由RS直接返回给客户端(不经过Director,无需隧道封装)。
- 适用场景:跨物理网络(如多云、混合云)的负载均衡。
- 优势:RS可位于任意网络,且响应流量不经过Director,扩展性好。
- 劣势 :需在RS配置隧道接口(如
ip tunnel add),并确保内核支持隧道协议(如IPIP模块)。
1.3 IPVS调度算法
IPVS提供多种调度算法:
- 静态算法 :
- 轮询(
rr):顺序分配请求。 - 加权轮询(
wrr):按权重分配请求。 - 目标地址哈希(
dh):根据目标IP哈希绑定服务器。 - 源地址哈希(
sh):根据客户端IP哈希实现会话保持。
- 轮询(
- 动态算法 :
- 最少连接(
lc):分配给当前连接数最少的服务器。 - 加权最少连接(
wlc):结合权重和连接数分配(生产环境推荐)。 - 基于局部性的最少连接(
lblc):提高相同目标IP的缓存命中率。 - 带复制的局部性最少连接(
lblcr):在lblc基础上增加服务器组冗余。
- 最少连接(
1.4 核心命令与配置
ipvsadm v1.31 2019/12/24 (使用 popt 和 IPVS v1.2.1 编译)
用法:
ipvsadm -A|E 虚拟服务 [-s 调度算法] [-p [超时时间]] [-M 网络掩码] [--pe 持久化引擎] [-b 调度标志]
ipvsadm -D 虚拟服务
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e 虚拟服务 -r 服务器地址 [选项]
ipvsadm -d 虚拟服务 -r 服务器地址
ipvsadm -L|l [虚拟服务] [选项]
ipvsadm -Z [虚拟服务]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon {master|backup} [守护进程选项]
ipvsadm --stop-daemon {master|backup}
ipvsadm -h
命令:
长选项或短选项均可使用。
--add-service -A 添加带选项的虚拟服务
--edit-service -E 编辑带选项的虚拟服务
--delete-service -D 删除虚拟服务
--clear -C 清空整个表
--restore -R 从标准输入恢复规则
--save -S 将规则保存到标准输出
--add-server -a 添加带选项的真实服务器
--edit-server -e 编辑带选项的真实服务器
--delete-server -d 删除真实服务器
--list -L|-l 列出表内容
--zero -Z 清零服务或所有服务的计数器
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动连接同步守护进程
--stop-daemon 停止连接同步守护进程
--help -h 显示此帮助信息
虚拟服务:
--tcp-service|-t 服务地址 服务地址格式为 主机[:端口]
--udp-service|-u 服务地址 服务地址格式为 主机[:端口]
--sctp-service 服务地址 服务地址格式为 主机[:端口]
--fwmark-service|-f fwmark fwmark 是大于零的整数
选项:
--ipv6 -6 fwmark 条目使用 IPv6
--scheduler -s 调度算法 可选:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,
默认调度算法是 wlc。
--pe 引擎 可选的持久化引擎,可以是 sip,
默认未设置。
--persistent -p [超时时间] 持久化服务
--netmask -M 网络掩码 持久化粒度掩码
--real-server -r 服务器地址 服务器地址格式为 主机(和端口)
--gatewaying -g 网关模式(直接路由)(默认)
--ipip -i ipip 封装(隧道)
--masquerading -m 伪装模式(NAT)
--tun-type 类型 可选:ipip|gue|gre,
默认隧道类型是 ipip。
--tun-port 端口 隧道目标端口
--tun-nocsum 无校验和的隧道封装
--tun-csum 带校验和的隧道封装
--tun-remcsum 带远程校验和的隧道封装
--weight -w 权重 真实服务器的容量
--u-threshold -x 上限阈值 连接数上限阈值
--l-threshold -y 下限阈值 连接数下限阈值
--connection -c 输出当前 IPVS 连接
--timeout 输出超时值(tcp tcpfin udp)
--daemon 输出守护进程信息
--stats 输出统计信息
--rate 输出速率信息
--exact 展开数字(显示精确值)
--thresholds 输出阈值信息
--persistent-conn 输出持久化连接信息
--tun-info 输出隧道信息
--nosort 禁用服务/服务器条目的排序输出
--sort 无操作,为了向后兼容
--ops -o 单包调度
--numeric -n 以数字形式输出地址和端口
--sched-flags -b 标志 调度标志(逗号分隔)
守护进程选项:
--syncid sid 连接同步的 syncid(默认=255)
--sync-maxlen 长度 最大同步消息长度(默认=1472)
--mcast-interface 接口 连接同步的多播接口
--mcast-group 地址 IPv4/IPv6 组地址(默认=224.0.0.81)
--mcast-port 端口 UDP 端口(默认=8848)
--mcast-ttl ttl 多播 TTL(默认=1)
1.4.1 集群管理
1.4.1.1 增加集群
命令解读
创建集群
命令格式
ipvsadm -A -t|u|f service_address:port [-s scheduler] [-p [timeout]]
格式详解
-
-A:增加LVS集群 -
-t:指定LVS集群服务主机的TCP端口 -
-u:指定LVS集群服务主机的UDP端口 -
-f:指定LVS集群服务主机采用的防火墙自定义规则的标记 -
-s:指定LVS集群的调度策略(默认为wlc) -
-p:设置持久化超时时间
示例
ipvsadm -A -t 192.168.8.14:80
ipvsadm -A -t 192.168.8.15:80
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.14:80 wlc
TCP 192.168.8.15:80 wlc
1.4.1.2 编辑集群
命令格式
ipvsadm -E -t service_address:port [-s scheduler] [-p [timeout]]
格式详解
-E:编辑LVS集群信息- 其他参数同增加集群
示例
ipvsadm -E -t 192.168.8.15:80 -s lc
ipvsadm -E -t 192.168.8.14:80 -p 30
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.14:80 wlc persistent 30
TCP 192.168.8.15:80 lc
1.4.1.3 删除集群
命令格式
ipvsadm -D -t service_address:port # 删除指定集群
ipvsadm -C # 删除所有集群
示例
ipvsadm -D -t 192.168.8.14:80
ipvsadm -D -t 192.168.8.15:80
ipvsadm -C
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
1.4.2 主机管理
1.4.2.1 查看主机
查看方式
ipvsadm -Ln
cat /proc/net/ip_vs
cat /proc/net/ip_vs_conn
示例
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
1.4.2.2 增加主机
命令格式
ipvsadm -a -t service_address:port -r server-address:port -g|m|i [options]
格式详解
-a:给LVS集群增加一个真实主机RS-r:指定真实主机的地址信息(格式:IP:[Port])-g:采用DR模式(默认)-m:采用NAT模式-i:采用TUN模式-w:指定真实主机的权重
示例
ipvsadm -A -t 192.168.8.14:80
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.16
ipvsadm -a -t 192.168.8.14:80 -r 192.168.16
ipvsadm -a -t 192.168.8.14:80 -r 192.168
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.14:80 wlc
-> 192.0.0.168:80 Route 1 0 0
-> 192.168.0.16:80 Route 1 0 0
-> 192.168.8.16:80 Route 1 0 0
1.4.2.3 编辑主机
命令格式
ipvsadm -e -t service_address:port -r server-address:port [options]
格式详解
-e:修改真实主机的属性信息-m:设定真实主机的转发模型为NAT模式
示例
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.15:88
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.15:88 -m
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.15:89 -m -w 3
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.14:80 wlc
-> 192.0.0.168:80 Route 1 0 0
-> 192.168.0.16:80 Route 1 0 0
-> 192.168.8.15:80 Route 1 0 0
-> 192.168.8.15:88 Masq 1 0 0
-> 192.168.8.15:89 Masq 3 0 0
-> 192.168.8.16:80 Route 1 0 0
1.4.2.4 删除主机
命令格式
ipvsadm -d -t service_address:port -r server-address:port
示例
ipvsadm -d -t 192.168.8.14:80 -r 192.168.8.15:89
ipvsadm -d -t 192.168.8.14:80 -r 192.168.8.16
ipvsadm -d -t 192.168.8.14:80 -r 192.168.16
ipvsadm -d -t 192.168.8.14:80 -r 192.168
1.4.3 规则管理
1.4.3.1 查看规则
命令格式
ipvsadm -Sn # 以数字格式显示规则
ipvsadm -S # 以主机名格式显示规则
示例
ipvsadm -A -t 192.168.8.14:80
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.16
ipvsadm -a -t 192.168.8.14:80 -r 192.168.16
ipvsadm -a -t 192.168.8.14:80 -r 192.168
查看效果
root@ubuntu24-13:~# ipvsadm -Sn
-A -t 192.168.8.14:80 -s wlc
-a -t 192.168.8.14:80 -r 192.0.0.168:80 -g -w 1
-a -t 192.168.8.14:80 -r 192.168.0.16:80 -g -w 1
-a -t 192.168.8.14:80 -r 192.168.8.16:80 -g -w 1
1.4.3.2 保存规则
两种方式保存规则
ipvsadm-save > /etc/ipvsadm.rules
ipvsadm-save -n > /etc/ipvsadm.rules
示例
root@ubuntu24-13:~# ipvsadm-save -n > n-ipvsadm
root@ubuntu24-13:~# ipvsadm-save > non-ipvsadm
查看效果
root@ubuntu24-13:~# cat non-ipvsadm
-A -t lvs-server:http -s wlc
-a -t lvs-server:http -r 192.0.0.168:http -g -w 1
-a -t lvs-server:http -r 192.168.0.16:http -g -w 1
-a -t lvs-server:http -r 192.168.8.16:http -g -w 1
root@ubuntu24-13:~# cat n-ipvsadm
-A -t 192.168.8.14:80 -s wlc
-a -t 192.168.8.14:80 -r 192.0.0.168:80 -g -w 1
-a -t 192.168.8.14:80 -r 192.168.0.16:80 -g -w 1
-a -t 192.168.8.14:80 -r 192.168.8.16:80 -g -w 1
1.4.3.3 清空规则
命令格式
ipvsadm -C
示例
ipvsadm -C
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
1.4.3.4 导入规则
命令格式
ipvsadm-restore < 规则文件
示例
ipvsadm-restore < n-ipvsadm
检查效果
root@ubuntu24-13:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.14:80 wlc
-> 192.0.0.168:80 Route 1 0 0
-> 192.168.0.16:80 Route 1 0 0
-> 192.168.8.16:80 Route 1 0 0
1.4.3.5 规则保存
1.4.3.5.1 默认规则重启后丢失
- 通过命令行设置的规则在重启后会丢失
1.4.3.5.2 通过规则服务文件保存
# 清理旧规则
ipvsadm -D -t 192.168.8.14:80
ipvsadm -D -t 192.168.8.15:80
# 定制新规则
ipvsadm -A -t 192.168.8.14:80
ipvsadm -A -t 192.168.8.15:80
ipvsadm -a -t 192.168.8.15:80 -r 192.168.8.17
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.18
1.4.3.5.3 开机自动加载规则
-
方法1:使用系统服务
service ipvsadm save
-
方法2:修改配置文件
vim /etc/default/ipvsadm
将AUTO="false"改为AUTO="true"
-
方法3:修改rc.local
vim /etc/rc.local
添加:ipvsadm-restore < /etc/ipvsadm.rules
chmod +x /etc/rc.local
1.4.4 防火墙标识
1.4.4.1 功能简介
FWM(FireWall Mark):通过防火墙标识实现对一个IP多端口的调度
命令格式
ipvsadm -A -f fwmark -s scheduler
实现方式
- 通过iptables将多个端口标记为同一个防火墙标识
- ipvsadm通过此标识关联,实现对一个IP多个端口的调度
示例
# iptables规则
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.8.14:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.8.14:80
# ipvsadm规则
ipvsadm -A -f 1 -s wlc
ipvsadm -a -f 1 -r 192.168.8.15 -g
在Kubernetes环境中,kube-proxy通过ConfigMap配置IPVS模式和调度算法:
bash
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-proxy
namespace: kube-system
data:
config.conf: |
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
# 启用严格的ARP配置(推荐)
strictARP: true
# 调度算法:wrr (加权轮询)
scheduler: "wrr"
# 最小同步间隔
minSyncPeriod: 0s
# 最大同步间隔
maxSyncPeriod: 30s
# 启用IPVS代理模式
supportIPVSProxyMode: true
# 连接超时设置(可选)
tcpTimeout: 900s
tcpFinTimeout: 120s
udpTimeout: 300s
# 其他重要配置
clusterCIDR: "10.244.0.0/16" # 根据你的集群CIDR修改
bindAddress: "0.0.0.0"
healthzBindAddress: "0.0.0.0:10256"
metricsBindAddress: "0.0.0.0:10249"
应用配置的步骤
bash
# 1. 应用ConfigMap配置
kubectl apply -f kube-proxy-configmap.yaml
# 2. 重启kube-proxy使配置生效
kubectl rollout restart daemonset/kube-proxy -n kube-system
# 3. 验证配置是否生效
kubectl logs -l k8s-app=kube-proxy -n kube-system | grep -i "ipvs"
验证IPVS模式
bash
# 在任意节点上检查IPVS规则
ipvsadm -ln
# 应该能看到类似这样的输出:
# IP Virtual Server version 1.2.1 (size=4096)
# Prot LocalAddress:Port Scheduler Flags
# -> RemoteAddress:Port Forward Weight ActiveConn InActConn
# TCP 10.96.0.1:443 wrr
# -> 192.168.1.101:6443 Masq 1 0 0
重要注意事项
-
集群CIDR必须匹配 :
clusterCIDR字段必须与你集群的Pod网络CIDR一致,否则网络会中断。 -
节点要求:所有节点必须加载IPVS内核模块:
bash# 检查IPVS模块 lsmod | grep ip_vs # 如果没有,需要加载 modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_lc modprobe ip_vs_wlc -
常见调度算法选择:
rr:轮询(Round Robin)- 适合性能相近的节点wrr:加权轮询(Weighted Round Robin)- 适合不同性能的节点lc:最少连接(Least Connections)- 适合长连接服务wlc:加权最少连接(Weighted Least Connections)- 最常用
二、Keepalived原理与配置
2.1 Keepalived概述
Keepalived是一种实现服务器高可用的开源软件,基于虚拟路由冗余协议(VRRP, Virtual Router Redundancy Protocol) 。Keepalived通过VRRP协议,将多台服务器虚拟为一个逻辑路由器,实现虚拟IP(VIP)的高可用漂移 。当主节点(MASTER)故障时,备份节点(BACKUP)会接管VIP,确保服务连续性 。
Keepalived的核心功能包括:
主备切换:通过优先级(Priority)和虚拟路由器ID(VRID)确定主备角色
健康检查:支持TCP、HTTP、自定义脚本等多种健康检查方式 3
通知机制:通过邮件或日志记录状态变更,便于运维监控 3
在云原生环境中,Keepalived通常用于保障关键服务(如Kubernetes API Server)的高可用性,确保集群控制平面的连续性。
2.2 VRRP协议工作原理
VRRP协议是Keepalived的核心,其工作原理如下:
虚拟路由器组:多台物理服务器组成一个虚拟路由器组,共享同一个虚拟IP地址(VIP)和虚拟MAC地址(VMAC)
主备选举:组内节点通过发送VRRP广告包(组播地址224.0.0.18,IP协议号112)进行主备选举,优先级(Priority)最高的节点成为MASTER
VIP管理:只有MASTER节点拥有VIP,负责处理所有流向VIP的流量
故障检测:BACKUP节点定期检测MASTER节点的心跳,若在超时时间内未收到心跳,则触发主备切换
VIP绑定:当切换发生时,新MASTER节点会在其网络接口上绑定VIP,确保服务连续性
其他注意事项
-
关于云环境部署的建议:
- "确保SELinux配置允许VRRP通信",因为可以通过配置SELinux策略来允许VRRP通信,而不需要完全关闭SELinux。
- "禁用防火墙或配置允许VRRP组播(
iptables -A INPUT -p 112 -j ACCEPT)": - 避免与云厂商负载均衡器的VIP冲突
-
优先级规则补充:
- 除了优先级,VRRP还规定"如果优先级相同,则IP地址较大的成为Master"。
2.3 Keepalived配置详解
Keepalived是一个基于VRRP协议实现服务高可用性的开源项目,通过虚拟IP地址(VIP)和健康检查机制,确保关键服务在服务器故障时能够快速切换,提供不间断的服务访问。以下是对keepalived.conf配置文件的详细注释,帮助理解各配置项的功能和意义。
一、全局定义配置 (global_defs)
全局定义部分是Keepalived的基础配置,设置整个系统的通用参数和通知机制。
bash
global_defs {
# 管理员通知邮箱列表,当Keepalived状态发生变化时,会向这些邮箱发送通知
notification_email {
acassen@firewall.loc # 默认管理员邮箱
failover@firewall.loc # 故障转移通知邮箱
sysadmin@firewall.loc # 系统管理员邮箱
}
# 通知邮件的发件人地址,Keepalived将以此地址发送状态变化通知
notification_email_from Alexandre.Cassen@firewall.loc # 默认发件人地址
# SMTP服务器地址,用于发送通知邮件,可配置为本地或远程邮件服务器
smtp_server 192.168.200.1 # SMTP服务器IP地址
# 连接SMTP服务器的超时时间,单位为秒
smtp_connect_timeout 30 # SMTP连接超时时间
# 路由器标识,用于Keepalived日志和VRRP实例识别,需保证集群内唯一
router_id LVS_DEVEL # 节点唯一标识,通常设置为服务器主机名
# 以下为VRRP协议相关配置
vrrp_skip_check_adv_addr # 忽略VRRP通告地址检查,避免因地址不匹配导致的问题
vrrp_strict # 严格遵循VRRP协议标准,增强协议兼容性
vrrp_garp_interval 0 # VIP绑定后发送ARP更新的间隔时间(秒),0表示不发送
vrrp_gna_interval 0 # VIP移除后发送ARP更新的间隔时间(秒),0表示不发送
}
二、VRRP实例配置 (vrrp_instance)
VRRP实例是Keepalived的核心配置,定义了虚拟路由冗余协议的工作参数和虚拟IP地址。
bash
vrrp_instance VI_1 {
# 节点角色设置,MASTER表示主节点,BACKUP表示备节点
# 实际主备由priority值决定,但建议明确设置state
state MASTER # 主节点状态
# 指定VRRP通告使用的物理网卡,必须与虚拟IP地址在同一网段
interface eth0 # 绑定的物理网卡
# 虚拟路由ID,用于区分不同的VRRP实例
# 同一集群内的主备节点必须设置相同的VRID
virtualRouterID 51 # 虚拟路由ID(0-255)
# 优先级值,决定主备选举,值越大优先级越高
# 建议主节点设置为100,备节点设置为50或更低
priority 100 # 优先级(1-255)
# VRRP通告间隔时间,单位为秒,主备节点应设置相同
advert_int 1 # 心跳间隔时间(默认1秒)
# VRRP认证配置,确保主备节点间通信安全
# 认证密码只识别前8位字符
authentication {
auth_type PASS # 认证类型,PASS表示密码认证
auth_pass 1111 # 认证密码,主备节点必须一致
}
# 虚拟IP地址配置,主节点正常时绑定VIP,故障时由备节点接管
virtual_ipaddress {
192.168.200.16 # 虚拟IP地址
192.168.200.17 # 可配置多个VIP地址
192.168.200.18 # VIP地址需与interface网卡在同一子网
}
}
三、虚拟服务器配置 (virtual_server)
虚拟服务器定义了负载均衡的前端服务地址和后端真实服务器池,以及负载均衡策略和健康检查机制。
1. HTTPS虚拟服务器配置
bash
virtual_server 192.168.200.100 443 {
# 健康检查间隔时间,单位为秒
delay_loop 6 # 健康检查间隔(默认6秒)
# 负载均衡算法,rr表示轮询,wrr表示加权轮询
# 其他可选值:lc(最小连接)、wlc(加权最小连接)等
lb_algo rr # 负载均衡算法
# LVS工作模式,NAT表示网络地址转换模式
# 其他可选值:DR(直接路由)、TUN(隧道模式)
# NAT模式:流量从负载均衡器转发到真实服务器
# DR模式:流量直接发送到真实服务器,需共用同一子网
# TUN模式:通过隧道将流量转发到真实服务器
lbKind NAT # LVS工作模式
# 会话保持超时时间,单位为秒
# 同一客户端的请求会被持续发送到同一真实服务器
persistence_timeout 50 # 会话保持超时时间(默认50秒)
# 服务协议类型,支持TCP和UDP
protocol TCP # 服务协议类型
# 真实服务器配置
real_server 192.168.201.100 443 {
weight 1 # 服务器权重值,用于加权负载均衡算法
# SSL健康检查配置,用于检测HTTPS服务状态
SSL_GET {
# 检测路径配置
url {
path / # 检测路径
# 响应内容哈希值,用于验证检测结果是否正常
# 可使用md5sum命令生成:echo -n "响应内容" | md5sum
digest ff20ad2481f97b1754ef3e12ecd3a9cc # 响应内容哈希值
}
# 多路径检测配置,所有检测路径均正常时服务器才被视为健康
url {
path /mrtg/ # 另一检测路径
digest 9b3a0c85a887a256d6939da88aabd8cd # 响应内容哈希值
}
# 连接超时时间,单位为秒
connect_timeout 3 # 连接超时时间(默认3秒)
# 检测失败后的重试次数
retry 3 # 重试次数(默认3次)
# 两次重试之间的间隔时间,单位为秒
delay_before_retry 3 # 重试间隔时间(默认3秒)
}
}
}
2. HTTP虚拟服务器配置
bash
virtual_server 10.10.10.2 1358 {
# 健康检查间隔时间,单位为秒
delay_loop 6 # 健康检查间隔(默认6秒)
# 负载均衡算法,rr表示轮询
lb_algo rr # 负载均衡算法
# LVS工作模式,NAT表示网络地址转换模式
lbKind NAT # LVS工作模式
# 会话保持超时时间,单位为秒
persistence_timeout 50 # 会话保持超时时间(默认50秒)
# 服务协议类型
protocol TCP # 服务协议类型
# 备用服务器配置,当所有真实服务器不可用时,流量将转发到此服务器
sorry_server 192.168.200.200 1358 # 备用服务器地址和端口
# 真实服务器1配置
real_server 192.168.200.2 1358 {
weight 1 # 服务器权重值
# HTTP健康检查配置
HTTPᐈET {
# 检测路径配置
url {
path /testurl/test.jsp # 检测路径
# 响应内容哈希值
digest 640205b7b0fc66c1ea91c463fac6334d # 响应内容哈希值
}
# 多路径检测配置
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
# 连接超时时间
connect_timeout 3 # 连接超时时间(默认3秒)
# 检测失败后的重试次数
retry 3 # 重试次数(默认3次)
# 两次重试之间的间隔时间
delay_before_retry 3 # 重试间隔时间(默认3秒)
}
}
# 真实服务器2配置
real_server 192.168.200.3 1358 {
weight 1 # 服务器权重值
# HTTP健康检查配置
HTTPᐈET {
# 检测路径配置
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
# 连接超时时间
connect_timeout 3 # 连接超时时间(默认3秒)
# 检测失败后的重试次数
retry 3 # 重试次数(默认3秒)
# 两次重试之间的间隔时间
delay_before_retry 3 # 重试间隔时间(默认3秒)
}
}
}
3. 另一HTTP虚拟服务器配置
bash
virtual_server 10.10.10.3 1358 {
# 健康检查间隔时间,单位为秒
# 此处设置为3秒,比默认值更短,响应更快
delay_loop 3 # 健康检查间隔(默认6秒)
# 负载均衡算法,rr表示轮询
lb_algo rr # 负载均衡算法
# LVS工作模式,NAT表示网络地址转换模式
lbKind NAT # LVS工作模式
# 会话保持超时时间,单位为秒
persistence_timeout 50 # 会话保持超时时间(默认50秒)
# 服务协议类型
protocol TCP # 服务协议类型
# 真实服务器1配置
real_server 192.168.200.4 1358 {
weight 1 # 服务器权重值
# HTTP健康检查配置
HTTPᐈET {
# 检测路径配置
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
# 连接超时时间
connect_timeout 3 # 连接超时时间(默认3秒)
# 检测失败后的重试次数
retry 3 # 重试次数(默认3次)
# 两次重试之间的间隔时间
delay_before_retry 3 # 重试间隔时间(默认3秒)
}
}
# 真实服务器2配置
real_server 192.168.200.5 1358 {
weight 1 # 服务器权重值
# HTTP健康检查配置
HTTPᐈET {
# 检测路径配置
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
# 连接超时时间
connect_timeout 3 # 连接超时时间(默认3秒)
# 检测失败后的重试次数
retry 3 # 重试次数(默认3次)
# 两次重试之间的间隔时间
delay_before_retry 3 # 重试间隔时间(默认3秒)
}
}
}
四、配置文件关键点说明
1. 全局配置注意事项
- 邮件通知:需确保SMTP服务器可访问,通知邮箱列表用于接收故障转移通知
- router_id:节点唯一标识,建议设置为服务器主机名,便于日志识别
- VRRP严格模式:vrrp_strict确保协议符合标准,避免因配置不一致导致的问题
2. VRRP实例配置注意事项
- VRID唯一性:同一网络内不同VRRP实例的VRID必须唯一
- 优先级设置:主节点优先级应比备节点高至少50,确保主备切换可靠
- 认证一致性:主备节点的认证类型和密码必须完全一致
- 网卡选择:interface必须指定与虚拟IP地址在同一子网的物理网卡
3. 虚拟服务器配置注意事项
- 健康检查路径:建议使用轻量级的健康检查路径,避免影响真实业务性能
- 多路径检测:多个url检测路径需全部正常,服务器才被视为健康
- 权重值设置:weight值影响负载均衡算法,权重越高,分配的请求越多
- 会话保持:persistence_timeout设置会话保持时间,确保同一客户端请求保持一致性
- 备用服务器:sorry_server仅在所有真实服务器不可用时启用,作为最后保障
五、Keepalived高可用原理
Keepalived通过VRRP协议实现高可用性,主节点 定期发送VRRP心跳包,备节点监听这些包以确认主节点状态。当主节点故障或健康检查失败时,备节点会接管VIP地址,继续提供服务 。
VRRP心跳机制:主节点通过指定网卡(如eth0)发送VRRP通告包,默认每1秒一次。备节点收到通告包后,确认主节点存活。
虚拟IP地址管理:正常状态下,VIP地址绑定在主节点上。当主节点故障时,VIP地址自动漂移至备节点,实现无缝切换。
健康检查机制:Keepalived通过check模块定期检测后端真实服务器的状态。如果检测到服务器异常,会将其标记为不可用,并从负载均衡池中移除。
负载均衡算法:根据lb_algo配置的算法,将客户端请求分发到不同的健康真实服务器上,实现流量均衡。
会话保持:persistence_timeout参数确保同一客户端的请求在会话保持时间内被持续发送到同一真实服务器,维持应用状态一致性。
六、配置文件优化建议
- 邮件通知优化:生产环境中建议配置有效的通知邮箱,便于及时接收故障转移通知
- 优先级设置:主节点优先级建议设置为150-200,备节点设置为50-100,确保主备切换可靠
- 健康检查路径:使用轻量级、专用的健康检查路径,避免影响真实业务
- 多路径检测:配置多个检测路径,提高检测的准确性和可靠性
- 权重值调整:根据服务器性能和资源情况,合理设置weight值,优化负载均衡效果
- 会话保持时间:根据应用特点调整persistence_timeout值,平衡会话一致性和资源利用率
- 备用服务器:合理配置sorry_server作为最后保障,避免服务完全中断
- 日志记录:建议在配置文件中添加日志记录配置,便于故障排查
- 脚本监控:可添加vrrp_script配置,通过自定义脚本进行更复杂的健康检查
- 网络配置:确保防火墙允许VRRP协议(默认224.0.0.18)和健康检查端口的流量
通过理解并合理配置这些参数,可以构建一个高可用、高性能的服务集群,确保关键业务的连续性和可靠性。
传送门:LVS/IPVS与Keepalived在云原生环境中的深度学习与实践(二)