在 swarm 上隔离连接到 traefik overlay 网络的容器

Isolate containers connected to traefik overlay network on swarm

我有多个堆栈 运行在 docker swarm 中使用 traefik,其中每个堆栈中的服务都连接到覆盖网络 (traefik-net),因此 traefik 可以与它​​们通信。

如果我在每个堆栈中都有一个名为相同服务名称 (service1) 的服务,然后在任一堆栈中都有另一个服务 (service2),请尝试通过服务名称访问它 (ping http://service1) ,它有时会命中另一个堆栈中的 service1,有时会命中同一堆栈中的 service1。

docker network create --driver overlay traefik-net

堆栈 1:

services:
  service1:
    networks:
      - default
      - traefik-net

  service2:
    networks:
      - default
      - traefik-net

networks:
  traefik-net:
    external: true

堆栈 2:

services:
  service1:
    networks:
      - default
      - traefik-net

networks:
  traefik-net:
    external: true

我希望 service2 只命中同一堆栈中的 service1。

我假设一个服务可以命中另一个堆栈中的服务,方法是将堆栈名称作为服务名称的前缀 (ping http//stack2_service1)。但是我了解到,由于 traefik-net 覆盖网络,它们显然可以在没有堆栈名称前缀的情况下相互调用。

有没有办法在没有堆栈名称前缀的情况下关闭跨堆栈的服务通信?

或者也许有针对该问题的 traefik 特定解决方案?

如果有人运行遇到这个问题,我将不胜感激。

我发现了一个类似的问题:

除了总是点击 stack_service 而不是 service 之外似乎没有任何解决方案。

是的,有一个解决方案可以解决您想要实现的目标,您只需要正确使用覆盖网络即可。

默认情况下,同一覆盖网络中连接的所有服务都可以 talk/resolve 彼此。

让我们想象一下您当前的实施。现在你有一个网络 traefik-net 并且你已经连接了所有的服务所以你的设计看起来像这样:

为了隔离不同堆栈上的服务但让 traefik 可以访问它们,您需要做的是在每个堆栈文件中创建一个不同的覆盖网络,并通过在 traefik 堆栈中将它们定义为外部网络来将 traefik 服务连接到这些网络文件。你将以这样的方式结束:

在此实现中,不同堆栈之间的所有流量只能通过 traefik 服务而不是直接进行。