我已经设置了一个 3 节点 Docker Swarm。我可以 ping 通但无法 curl 最终部署在主机 B 上的 Docker 服务,该服务来自主机 A 上的 Docker 容器。我遗漏了什么?我还能做什么来排除故障?
主机环境:一个管理器,两个工作者。通过 OpenStack 进行配置(它在后台的基础设施中具有虚拟化元素)。群集在 CentOS 7 上运行。SELinux 已禁用。docker 服务全部通过以下方式位于覆盖网络上:
docker network create --driver=overlay --opt com.docker.network.driver.mtu=1200 --attachable proxy-overlay
管理节点通过:
docker swarm init --advertise-addr <manager-public-ip> --data-path-port 8091
并通过工人加入:
docker swarm join --token <token-from-init> --advertise-addr <worker-ip> <manager-public-ip>:2377
这是我尝试过的不同的事情,我希望它们都能起作用。第 6 点和第 7 点是我正在尝试解决的。
- 我可以 ping 主机 A 到主机 B
- 我可以从主机 A 到主机 B 进行 curl
- 我可以从主机 A 上运行的容器内部 ping 到主机 B
- 我可以从主机 A 上运行的容器内部 curl 到主机 B
- 我可以从主机 A 上运行的容器内 ping 一个 Docker 服务,该容器的 DNS 解析为主机 B 上运行的容器
- 我无法从主机 A 上运行的容器内 curl docker 服务,而该容器的 DNS 解析为主机 B 上运行的容器
- 我无法从主机 A 上运行的容器中 curl 主机 B 上运行的容器的 DNS 解析 IP(第 5 点)
- 我可以从另一个 docker 容器 curl docker 服务,前提是容器位于同一主机上
最终的错误是:
curl:(7)无法连接到端口 80:连接超时
我探索过的一些领域:
- 删除所有 iptable 规则
- 将 MTU 降低到 1200(在 /etc/docker/daemon.json 中设置,然后
docker_gwbridge
按照 docker 文档中概述的步骤手动创建网络。) - 确保安全组入口/出口开放(OpenStack)
- 确保 MTU 更改在所有节点上传播(因此不会在网络级别丢失
- 确保覆盖网络在所有节点上都是正确的/传播的
- 将上述步骤中的 IP 与来自各种 docker 检查的 IP 进行匹配。
- 我看到一些虚拟基础设施有时使用端口 4789 进行通信,所以我将 docker 端口更改为 8091,但已经尝试了两个端口。
如果时间允许,我会去整理并链接上面信息中引用的几十个 github 问题页面和 docker 文档网页。