keepalived vip 平滑迁移
场景和需求
有 5 个节点的集群,1 和 2 节点上跑着 keepalived 维护着 VIP1、VIP2,现需要把 VIP2 平滑迁移到 4 和 5 节点上,即迁移过程中对 VIP1 和 VIP2 无业务影响。
节点 | IP | VIP1 | VIP2 |
---|---|---|---|
1 | 10.95.22.1 | 10.95.22.230 | |
2 | 10.95.22.2 | 10.95.22.230 | |
3 | 10.95.22.3 | ||
4 | 10.95.22.4 | 10.95.22.231(要迁到这) | |
5 | 10.95.22.5 | 10.95.22.231(要迁到这) |
操作系统和 keepalived 版本
项目配置的 advert_int
为 3。
验证和测试
1 节点 keepalived.conf(变更前)
global_defs {
router_id lb-master
}
vrrp_script check-app {
script "killall -0 dockerd"
interval 5
#weight -20
fall 2
}
vrrp_instance VI-kube-master {
#state MASTER
state BACKUP
priority 120
nopreempt
unicast_src_ip 10.95.22.1
unicast_peer {
10.95.22.2
}
dont_track_primary
track_interface {
eth0
}
interface eth0
virtual_router_id 230
advert_int 3
track_script {
check-app
}
virtual_ipaddress {
10.95.22.230 dev eth0 label eth0:1
}
}
vrrp_instance VIP2 {
#state MASTER
state BACKUP
priority 120
nopreempt
unicast_src_ip 10.95.22.1
unicast_peer {
10.95.22.2
}
dont_track_primary
track_interface {
eth0
}
interface eth0
virtual_router_id 231
advert_int 3
track_script {
check-app
}
virtual_ipaddress {
10.95.22.231 dev eth0 label eth0:2
}
}
2 节点 keepalived.conf(变更前)
global_defs {
router_id lb-backup-10.95.22.2
}
vrrp_script check-app {
script "killall -0 dockerd"
interval 5
#weight -20
fall 2
}
vrrp_instance VI-kube-master {
state BACKUP
priority 86
nopreempt
unicast_src_ip 10.95.22.2
unicast_peer {
10.95.22.1
}
dont_track_primary
track_interface {
eth0
}
interface eth0
virtual_router_id 230
advert_int 3
track_script {
check-app
}
virtual_ipaddress {
10.95.22.230 dev eth0 label eth0:1
}
}
vrrp_instance VIP2 {
#state MASTER
state BACKUP
priority 110
nopreempt
unicast_src_ip 10.95.22.2
unicast_peer {
10.95.22.1
}
dont_track_primary
track_interface {
eth0
}
interface eth0
virtual_router_id 231
advert_int 3
track_script {
check-app
}
virtual_ipaddress {
10.95.22.231 dev eth0 label eth0:2
}
}
注意
4 节点进行以下配置,启动服务后就把 VIP 抢过来了。
原因是它的优先级比 1、2 节点高且此时 1、2 节点还没有变更配置。
vrrp_instance VIP2 {
#state MASTER
state BACKUP
priority 130
nopreempt
unicast_src_ip 10.95.22.4
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.5
}
dont_track_primary
track_interface {
eth0
}
interface eth0
virtual_router_id 231
advert_int 3
track_script {
check-app
}
virtual_ipaddress {
10.95.22.231 dev eth0 label eth0:2
}
}
1,修改 1 和 2 节点配置
- 节点 1 增加配置,增加配置后重载配置
systemctl reload keepalived
。VIP 不会切换,业务无影响。
priority 120
nopreempt
unicast_src_ip 10.95.22.1
unicast_peer {
10.95.22.2
10.95.22.4
10.95.22.5
}
advert_int 3
- 节点 2 增加配置,增加配置后重载配置
systemctl reload keepalived
。VIP 不会切换,业务无影响。
priority 110
nopreempt
unicast_src_ip 10.95.22.2
unicast_peer {
10.95.22.1
10.95.22.4
10.95.22.5
}
advert_int 3
2,4 和 5 节点配置
- 节点 4 配置,增加配置后启动
systemctl start keepalived
。
节点 4 主要配置
priority 100
nopreempt
unicast_src_ip 10.95.22.4
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.5
}
advert_int 3
- 节点 5 配置,增加配置后启动
systemctl start keepalived
。
节点 5 主要配置
priority 90
nopreempt
unicast_src_ip 10.95.22.5
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.4
}
advert_int 3
3,高优先级抢占
通过 ping VIP2 发现掉 6 个包( 最多 6 秒左右,因为心跳是 3 秒)。
把节点 4 的优先级调到 130(比别的节点都高),同时配置抢占模式,后重载配置。
priority 130
preempt
unicast_src_ip 10.95.22.4
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.5
}
advert_int 3
4,重启服务切换
通过 ping VIP2 发现掉 4 个包( 4 秒左右)。
- 把节点 4 的优先级调到 130(比别的节点都高),重载配置
systemctl reload keepalived
。
priority 130
nopreempt
unicast_src_ip 10.95.22.4
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.5
}
advert_int 3
systemctl restart keepalived
。
5,调心跳高优先级抢占切换✔️
即调
advert_int
的值,该值默认值为 1,本项目中设置成了 3。心跳调成默认的 1 秒后,高优先级抢占方式掉 1 个包( 1 秒左右)。
advert_int
的值 VIP 组中成员要配置一致。
- 把 VIP 的组成员的
advert_int
都设置成 1 秒(不支持调成更小的了,比如 0.5 秒)并 reload 服务。 - 把节点 4 的优先级调到 130(比别的节点都高),同时配置抢占模式,后重载配置,重载配置就会把 VIP2 抢过来,影响 1 秒左右。
priority 130 #(1)!
preempt #(2)!
unicast_src_ip 10.95.22.4
unicast_peer {
10.95.22.1
10.95.22.2
10.95.22.5
}
advert_int 1 #(3)!
- 优先级高于其它节点
- 设置成抢占模式
- 心跳时间设置成 1 秒。
6,去除和恢复配置
- 确认 VIP2 已经迁移走(不在 1 和 2 节点上)。
- 删除 1 和 2 节点关于 VIP2 的配置段,后重载配置
systemctl reload keepalived
。 - 去掉 4 和 5 节点关于 VIP2 配置
unicast_peer
里关于 1 和 2 节点的配置,后重载配置systemctl reload keepalived
。 - 去掉 4 节点的抢占配置、恢复心跳值。
注意事项
在使用 ipvs 的 kubernetes 环境中,要注意 ipvs 的更新频率(syncPeriod
,默认是 30 秒)。如果 VIP 切换后但 ipvs 相关的转发规则未更新,客户端发起的 TCP 连接会收到 RST ,导致连接被重置。
总结
大概的步骤如下:
- 先规划好优先级,新加进来的 4、5 节点优先级要比原节点低。
- 原节点的
unicast_peer
把新节点添加进来,重载配置。 - 新节点按原节点的配置参数配置好后,启动服务。
- 把全部成员的心跳调成 1 秒(项目配置的是 3 秒)并重载配置。
- 把一个新节点的优先级调高于其它节点并设置抢占模式。
- 重载要抢占 VIP 的节点配置把 VIP 抢占过来。对业务的影响在这个阶段,影响时间 1 秒左右(只影响抢占的 VIP,不影响原 VIP2。)。
- 原节点去掉 VIP 配置、新节点把原节点的相关配置项去除。
- 恢复抢占节点的优先级和去掉抢占模式。
创建时间: 2024-05-15 14:44
最后更新: 2024-05-23 09:09
更新次数: 3
浏览次数: