在 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 服务而不是直接进行。
我有多个堆栈 运行在 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 服务而不是直接进行。