You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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 BACKUP
  • priority 90(只要比主节点的100低就行)

步骤3:启动Keepalived并设为开机自启

sudo systemctl enable --now keepalived

步骤4:验证故障转移是否生效

  1. 先在主节点上执行ip addr show eth0(替换成你的网卡),应该能看到你设置的浮动VIP已经绑定上去了
  2. 手动把主节点的Docker停掉:sudo systemctl stop docker,或者直接关机
  3. 等个3-5秒,去任意一个备份节点上执行同样的ip addr命令,看看VIP是不是已经切过来了
  4. 恢复主节点的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:19:30