docker - Docker swarm:节点未加入入口网络
问题描述
我正在玩 Docker swarm,
我有一个三节点集群、1 个管理器和 2 个工作节点。我正在使用我VIP
的所有服务。
我有一个奇怪的情况,我重新启动了工作节点。
我执行docker node ls
了,工作节点是Ready
.
docker service ls
会告诉我工人中容器的复制是好的。
问题:我无法通过入口网络加入节点。其他节点中的任何容器都无法访问该工作节点中的容器。
我检查了它们都加入入口网络的容器。
我从同一个节点内卷曲了容器,它们做出了响应。
我从一个容器中 ping 了服务名称(在同一个故障节点中)并且它起作用了。
我从经理那里将工人容器卷曲在工人中不起作用!
我用工人的 IP 地址蜷缩起来,他们回应了。
我重新启动了工作节点,但问题仍然存在,然后我重新启动了整个集群,它又工作了!
我刚才目睹的事情有什么解释吗?
我最担心这会发生在生产环境中。
先感谢您。
解决方案
当节点(工作人员和管理人员)之间未打开覆盖网络端口时,会发生这种情况。从Docker 的文档中,需要打开以下端口:
- 用于集群管理通信的 TCP 端口 2377
- TCP 和 UDP 端口 7946 用于节点之间的通信
- 覆盖网络流量的 UDP 端口 4789
这可能会被两端的 iptables、中间的网络路由器/防火墙,甚至像 VMWare NSX 这样的工具所阻止。要验证连接是否端到端工作,您可以在每个节点的选定端口上运行 tcpdump,并确保离开一个节点的请求到达另一个节点。
集群中每个节点的相关 iptables 规则是:
iptables -I INPUT -p tcp -m tcp --dport 2376 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 2377 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 7946 -j ACCEPT
iptables -I INPUT -p udp -m udp --dport 7946 -j ACCEPT
iptables -I INPUT -p tcp -m udp --dport 4789 -j ACCEPT
iptables -I INPUT -p 50 -j ACCEPT # allows ipsec when secure overlay is enabled
如果您无法调整防火墙设置,可能会使用与 4789 不同的覆盖网络端口配置 swarm 模式docker swarm init --data-path-port
推荐阅读
- amazon-web-services - MULTUS CNI 是否支持 AWS-CNI 类型?
- retrofit2 - 使用 RetroFit2 休息客户端时获取 java.lang.IllegalArgumentException
- html - 如何将 div 的背景与带有轻微色调的窗口背景颜色相匹配?
- oracle-apex - 使用 oracle apex 将数字签名或 iamge 签名添加到 pdf
- swiftui - 列表中的 SwiftUI 多个弹出框
- ios - 更好地修改标签栏或创建我自己的自定义标签栏?
- c++ - enable_shared_from_this 必须是第一个基类吗?
- python - 如何使用python从所有pptx文件幻灯片中提取所有图像和文本?
- bash - 无法在 postgres docker 容器中运行 psql 命令
- sql-server - 当 DataTypeCompatility 打开时,如何将 12/30/1899 参数化为 SQL Server 本机客户端?