本地Docker Swarm部署高可用性:Docker Manager虚拟IP配置咨询
为Docker Swarm Manager集群配置浮动虚拟IP,彻底解决网络层面单点故障
嘿,刚好我之前帮团队解决过几乎一模一样的问题!Docker Swarm本身已经帮你搞定了应用层的服务发现和负载均衡,但控制平面(Manager节点)的网络高可用确实需要额外配置——Swarm没有内置的集群VIP供外部访问,不过用Keepalived就能完美解决,这是本地部署场景下最成熟的方案,我给你一步步拆解:
先理清楚核心逻辑
Keepalived基于VRRP协议,能在一组节点之间维护一个浮动的虚拟IP(VIP):正常情况下VIP绑定在主节点上,一旦主节点故障(比如Docker服务挂了、节点宕机),VIP会自动切换到集群里健康的备份节点,外部只需要访问这个VIP就行,完全感知不到后端节点的变化。
前置准备
- 所有Manager节点在同一个局域网,互相能通信(要开放VRRP协议的IP层流量,协议号是112,别被防火墙挡住了)
- 提前找一个局域网里没人用的IP作为你的浮动VIP
步骤1:在所有Manager节点装Keepalived
根据你的操作系统来:
Ubuntu/Debian系
sudo apt update && sudo apt install -y keepalived
CentOS/RHEL系
sudo yum install -y keepalived
步骤2:配置Keepalived(每个节点都要弄)
先在任意一个Manager节点上创建/etc/keepalived/keepalived.conf,作为主节点的配置,其他节点改成备份节点配置就行:
主节点配置
global_defs { router_id SWARM_MANAGER_VIP # 随便起个标识,集群内一致就行 } # 这个脚本用来检查Docker服务是否正常,一旦Docker挂了,自动降低节点优先级 vrrp_script check_docker { script "/usr/bin/docker info > /dev/null 2>&1" interval 2 # 每2秒检查一次 weight -5 # 检查失败的话,优先级减5 fall 2 # 连续2次失败就算故障 rise 1 # 一次成功就恢复 } vrrp_instance VI_1 { state MASTER interface eth0 # 替换成你的局域网网卡!用`ip addr`命令能看到,比如ens33、wlan0 virtual_router_id 51 # 同一个集群必须一致,范围0-255 priority 100 # 主节点优先级要比备份节点高,比如备份设90 advert_int 1 # 每秒发一次心跳包 authentication { auth_type PASS auth_pass 1111 # 自定义密码,所有节点要一样 } virtual_ipaddress { 192.168.1.100/24 # 替换成你准备的浮动VIP和子网掩码 } # 绑定上面的Docker检查脚本 track_script { check_docker } }
备份节点配置
把主节点的配置复制过去,只改两个地方:
state BACKUPpriority 90(只要比主节点的100低就行)
步骤3:启动Keepalived并设为开机自启
sudo systemctl enable --now keepalived
步骤4:验证故障转移是否生效
- 先在主节点上执行
ip addr show eth0(替换成你的网卡),应该能看到你设置的浮动VIP已经绑定上去了 - 手动把主节点的Docker停掉:
sudo systemctl stop docker,或者直接关机 - 等个3-5秒,去任意一个备份节点上执行同样的
ip addr命令,看看VIP是不是已经切过来了 - 恢复主节点的Docker服务后,VIP会自动切回去(如果你不想让它切回去,可以在备份节点的配置里加
nopreempt参数,这样主节点恢复后不会抢回VIP)
一些额外的小提醒
- Swarm Manager节点数量最好是奇数(符合Raft共识的最佳实践),Keepalived要跟着Manager节点数量配,这样不管哪个Manager挂了,都有其他节点接VIP
- 所有Manager节点的时间要同步!VRRP对时间差很敏感,差太多会导致故障判断出错
- 以后Worker节点要加入集群,直接用这个浮动VIP就行:
docker swarm join --token <你的worker-token> 192.168.1.100:2377 - 如果是云环境,也可以用云厂商的负载均衡器指向所有Manager,但本地部署还是Keepalived最省心
这样配置完,你的Swarm控制平面就彻底解决了网络层面的单点故障——不管哪个Manager节点挂了,外部访问这个VIP都能正常连到健康的Manager上。
内容的提问来源于stack exchange,提问作者Saqib Ahmed
相关产品推荐
相关产品推荐

