我正在使用 keepalived 在两个虚拟机之间切换浮动 IP。
/etc/keepalived/keepalived.conf 在 VM 1 上:
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 101
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
1.2.3.4
}
}
Run Code Online (Sandbox Code Playgroud)
/etc/keepalived/keepalived.conf 在 VM 2 上:
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 101
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
1.2.3.4
}
}
Run Code Online (Sandbox Code Playgroud)
这基本上可以正常工作,但有一个例外:每次 systemd 更新(它运行的是 Ubuntu 18.04)时,它都会重新加载它的网络组件,从而导致丢弃浮动 IP,因为它没有在系统中配置。由于两个keepalived实例仍然可以互相ping通,他们都没有看到任何错误,也没有人对此做出反应,导致浮动IP保持不变。
我发现您可以使用这样的简单脚本检查 IP:
vrrp_script chk_proxyip {
script "/sbin/ip addr |/bin/grep 1.2.3.4"
}
vrrp_instance VI_1 {
# [...]
track_script {
chk_proxyip
}
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是一种可行的方法。
如果我理解正确,如果我在 VM1 上配置此脚本,则会发生以下情况:
FAULT状态并停止广播 vrrp 包此时 IP 再次在 VM2 上工作,但 VM1 将保持此状态,因为 IP 永远不会在 VM1 上再次出现。如果 VM2 出现故障(无论出于何种原因)VM1 将不会接管它,因为它仍处于FAULT状态。
如何确保浮动 IP 始终在其中一台 VM 上运行?
进一步测试:
我尝试 ping 浮动 IP 而不是检查它是否在 check_script 中的特定主机上处于活动状态:
vrrp_script chk_proxyip {
script "/bin/ping -c 1 -w 1 1.2.3.4"
interval 2
}
Run Code Online (Sandbox Code Playgroud)
在节点 2 上配置此脚本导致以下结果:
BACKUP为FAULTMASTER结果:IP 保持关闭。
在节点 1 上配置脚本导致以下结果:
MASTER为FAULTBACKUP变为MASTER,配置节点2的浮动IP嗯,然后……
Feb 13 10:11:26 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:27 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:29 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:32 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:33 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:36 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:38 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:39 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
Feb 13 10:11:41 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 13 10:11:44 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 13 10:11:45 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 13 10:11:47 node2 Keepalived_vrrp[3486]: VRRP_Instance(VI_1) Received advert with higher priority 150, ours 100
...
Run Code Online (Sandbox Code Playgroud)
我不得不在 node1 上重新启动 keepalived 以停止节点之间的乒乓游戏。
我们遇到了这个问题,并认为这是现在使用 netplan 的 ubuntu 18.04 中的 systemd-networkd 的问题。更新版本的 keepalived 应该解决这个问题,因为它可以检测到导致故障转移的浮动 IP 的删除,请参阅https://github.com/acassen/keepalived/issues/836。
更新版本的 keepalived 在 18.04 中不可用,我们决定继续使用 ubuntu 16.04 并等到 ubuntu 20.04 用于使用 keepalived 的服务器,而不是尝试向后移植。
小智 5
此问题已在 2018-05-26 的 keepalived 2.0.0 中修复,请参阅keepalived 的更新日志
- 监控 VIP/eVIP 删除并转换到备份,如果 VIP/eVIP 被删除,则它被配置为无跟踪选项。
| 归档时间: |
|
| 查看次数: |
8175 次 |
| 最近记录: |