隔离群集上连接到traefik覆盖网络的容器

时间:2019-05-06 19:05:55

标签: docker docker-swarm traefik docker-swarm-mode

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

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

docker network create --driver overlay traefik-net

stack1:

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

  service2:
    networks:
      - default
      - traefik-net

networks:
  traefik-net:
    external: true

stack2:

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

networks:
  traefik-net:
    external: true

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

我假设服务可以通过在堆栈名称前加上服务名称(ping http // stack2_service1)来击中另一个堆栈中的服务。但是我了解到,由于有了traefik-net覆盖网络,他们显然可以在没有堆栈名称前缀的情况下相互调用。

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

或者可能有针对该问题的traefik解决方案?

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

2 个答案:

答案 0 :(得分:0)

我发现了一个类似的问题:Docker DNS with Multiple Projects Using the Same Network

除了总是按stack_service而不是service之外,似乎没有其他解决方法。

答案 1 :(得分:0)

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

默认情况下,连接在同一覆盖网络中的所有服务都可以彼此通话/解析。

因此,让我们可视化您当前的实现。现在您有了一个traefik-net网络,并且已将所有服务连接到那里,因此您的设计如下所示:

enter image description here

要隔离不同堆栈上的服务但使traefik能够访问它们,您需要做的是在每个堆栈文件中创建一个不同的覆盖网络,并将traefik服务连接到这些网络,方法是将它们定义为traefik堆栈文件中的外部。您将最终像这样:

enter image description here

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