跳转至

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 10.95.22.231(原来在这)
2 10.95.22.2 10.95.22.230 10.95.22.231(原来在这)
3 10.95.22.3
4 10.95.22.4 10.95.22.231(要迁到这)
5 10.95.22.5 10.95.22.231(要迁到这)

操作系统和 keepalived 版本

CentOS Linux release 7.9.2009 (Core)
Keepalived v1.3.5

项目配置的 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 秒左右)。

  1. 把节点 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
2. 重启 VIP2 所在节点的服务systemctl restart keepalived

5,调心跳高优先级抢占切换✔️

即调 advert_int 的值,该值默认值为 1,本项目中设置成了 3。

心跳调成默认的 1 秒后,高优先级抢占方式掉 1 个包( 1 秒左右)。

advert_int 的值 VIP 组中成员要配置一致。

  1. 把 VIP 的组成员的 advert_int 都设置成 1 秒(不支持调成更小的了,比如 0.5 秒)并 reload 服务。
  2. 把节点 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. 优先级高于其它节点
  2. 设置成抢占模式
  3. 心跳时间设置成 1 秒。

6,去除和恢复配置

  1. 确认 VIP2 已经迁移走(不在 1 和 2 节点上)。
  2. 删除 1 和 2 节点关于 VIP2 的配置段,后重载配置systemctl reload keepalived
  3. 去掉 4 和 5 节点关于 VIP2 配置 unicast_peer 里关于 1 和 2 节点的配置,后重载配置systemctl reload keepalived
  4. 去掉 4 节点的抢占配置、恢复心跳值。

注意事项

在使用 ipvs 的 kubernetes 环境中,要注意 ipvs 的更新频率(syncPeriod,默认是 30 秒)。如果 VIP 切换后但 ipvs 相关的转发规则未更新,客户端发起的 TCP 连接会收到 RST ,导致连接被重置。

总结

节点优先级规划

要参与 VIP2 的 4 个节点的 VIP 优先级规划如下:

1节点 120
2节点 110
4节点 100
5节点 90

大概的步骤如下:

  1. 先规划好优先级,新加进来的 4、5 节点优先级要比原节点低。
  2. 原节点的 unicast_peer把新节点添加进来,重载配置。
  3. 新节点按原节点的配置参数配置好后,启动服务。
  4. 把全部成员的心跳调成 1 秒(项目配置的是 3 秒)并重载配置。
  5. 把一个新节点的优先级调高于其它节点并设置抢占模式。
  6. 重载要抢占 VIP 的节点配置把 VIP 抢占过来。对业务的影响在这个阶段,影响时间 1 秒左右(只影响抢占的 VIP,不影响原 VIP2。)。
  7. 原节点去掉 VIP 配置、新节点把原节点的相关配置项去除。
  8. 恢复抢占节点的优先级和去掉抢占模式。
创建时间: 2024-05-15 14:44 最后更新: 2024-05-23 09:09 更新次数: 3 浏览次数: