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

生产环境Docker Swarm动态修改MTU的可行方法咨询

解决Docker Swarm跨节点通信MTU不匹配问题(保留栈和存储卷)

问题根源

核心矛盾是Docker默认MTU(1500)与主机eth1网卡MTU(1450)不匹配,导致跨节点容器通信时数据包被截断,进而引发Portainer卡顿、请求失败。你之前的方法无效原因如下:

  • 直接给dockerd加--mtu参数可能与daemon.json配置冲突,导致服务启动失败;
  • Swarm的Overlay网络创建后无法修改MTU,仅修改docker-compose配置不重建网络不会生效;
  • daemon.json的MTU配置只对新创建的网络生效,旧的Overlay网络(包括默认ingress和栈自定义网络)仍使用旧MTU。

解决方案(10-15分钟停机窗口,保留所有栈和存储卷)

1. 临时切换回单节点Swarm(启动停机)

先让所有服务回到原有单节点运行,避免跨节点通信干扰:

  • 在第二个节点执行强制退出Swarm:
    docker swarm leave --force
    
  • 验证所有服务均在第一个节点正常运行:
    docker service ps --all $(docker service ls -q)
    

2. 统一配置Docker Daemon的MTU

确保所有节点的Docker默认MTU与网卡一致:

  • 编辑第一个节点的/etc/docker/daemon.json(若文件不存在则创建),添加MTU配置(注意JSON格式正确,已有其他配置需合并):
    {
      "mtu": 1450
    }
    
  • 重启Docker服务:
    systemctl restart docker
    
  • 验证MTU生效:
    docker network inspect bridge | grep MTU
    
    输出应显示"MTU": 1450。
  • 对第二个节点重复上述配置步骤(先确认eth1 MTU确实为1450)。

3. 重建Swarm核心Overlay网络

处理默认ingress网络

ingress是Swarm跨节点通信的核心网络,必须重建为MTU1450:

  • 创建临时过渡ingress网络:
    docker network create --driver overlay --ingress --subnet 10.11.0.0/16 --gateway 10.11.0.1 --mtu 1450 temp-ingress
    
  • 等待Docker完成网络切换后,删除旧ingress网络:
    docker network rm ingress
    
  • 创建新的正式ingress网络:
    docker network create --driver overlay --ingress --subnet 10.10.0.0/16 --gateway 10.10.0.1 --mtu 1450 ingress
    
  • 删除临时过渡网络:
    docker network rm temp-ingress
    

重建各栈的自定义Overlay网络

每个栈的自定义网络也需重建为MTU1450,无需删除栈,只需重新部署:

  • 编辑每个栈的docker-compose.yml,在networks部分添加MTU配置:
    networks:
      default:
        driver: overlay
        driver_opts:
          mtu: 1450
    
  • 重新部署每个栈(服务会重启,但存储卷完全保留):
    docker stack deploy -c docker-compose.yml <你的栈名>
    

4. 重新加入第二个节点到Swarm

  • 在第一个节点获取Worker节点加入命令:
    docker swarm join-token worker
    
  • 在第二个节点执行该命令,完成Swarm集群重建:
    # 替换为你获取的实际命令
    docker swarm join --token <你的worker-token> <节点1IP>:2377
    
  • 验证节点状态:
    docker node ls
    

5. 验证修复效果

  • 测试跨节点容器通信:在节点1的任意容器内ping节点2的容器IP,或调用跨节点服务接口,确认请求正常;
  • 访问Portainer,检查卡顿问题是否消失。

内容的提问来源于stack exchange,提问作者Eddie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:27:25