通过覆盖网络对跨节点的 Docker Swarm cURL docker 服务进行故障排除

通过覆盖网络对跨节点的 Docker Swarm cURL docker 服务进行故障排除

我已经设置了一个 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 点是我正在尝试解决的。

  1. 我可以 ping 主机 A 到主机 B
  2. 我可以从主机 A 到主机 B 进行 curl
  3. 我可以从主机 A 上运行的容器内部 ping 到主机 B
  4. 我可以从主机 A 上运行的容器内部 curl 到主机 B
  5. 我可以从主机 A 上运行的容器内 ping 一个 Docker 服务,该容器的 DNS 解析为主机 B 上运行的容器
  6. 我无法从主机 A 上运行的容器内 curl docker 服务,而该容器的 DNS 解析为主机 B 上运行的容器
  7. 我无法从主机 A 上运行的容器中 curl 主机 B 上运行的容器的 DNS 解析 IP(第 5 点)
  8. 我可以从另一个 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 文档网页。

相关内容