我有几台机器正在Ubuntu Server 22.04.1 LTS
运行Docker version 20.10.17
。
我已经设置了一个包含这两台机器的集群。这些机器的端口tcp/2377
、udp/4789
、udp/7946
和tcp/7946
均已打开。我没有为此进行任何防火墙配置,Ubuntu Server 附带的防火墙服务已禁用。我分别使用这些命令nc -zv HOST PORT
和nc -zvu HOST PORT
对tcp
和进行了测试udp
。除了tcp/2377
从管理器节点到工作节点的查询外,所有查询都返回成功,大概这是没问题的,因为这个端口似乎是管理器特定的端口。
如果我在同一节点上运行堆栈中的几个服务,这些服务可以毫无问题地通信。但是,当服务分散到不同节点时,它们就无法再相互连接。
他们能够ping
在每个容器内使用对方服务的名称互相联系。
但是,它们无法curl service_name
运行任何 Web 服务器,例如在单独的机器上的容器上运行。
我尝试用谷歌搜索这个问题,并尝试过关闭数据包校验和通过在两台机器上运行sudo ethtool -K docker_gwbridge tx off; sudo ethtool -K docker0 tx off
,然后重新启动机器,但没有成功。
我正在寻找导致此问题的其他原因,或者可能是我误用了上述命令。在使用 Ubuntu Desktop 之前,我已经在这些节点上运行了 swarm,没有出现此问题,并且已经切换到 ubuntu 服务器。
谢谢。
PS 很高兴提供任何相关的附加信息。
答案1
将 ubuntu 从 18.04 版本更新到 22.04 后,我遇到了同样的问题。当前系统配置:docker 版本:20.10.17 ubuntu 版本:22.04.1 LTS
在建议关闭校验和后,我使用命令执行了此操作:
sudo ethtool --offload <NETWORK INTERFACE> tx off
我在这里找到了有关如何做到这一点的信息:如何禁用 UDP 校验和