我在 docker swarm 中使用 traefik 运行多个堆栈,其中每个堆栈中的服务都连接到覆盖网络 (traefik-net),以便 traefik 可以与它们通信。
如果我在每个堆栈中都有一个名为相同服务名称 (service1) 的服务,然后任一堆栈中都有另一个服务 (service2) 尝试通过服务名称 (ping http://service1 ) 访问它,它会有时会命中其他堆栈中的service1,有时会命中同一堆栈中的service1。
docker网络创建--驱动程序覆盖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 特定解决方案?
如果有人遇到这个问题,我将非常感谢解决方案。
最佳答案
是的,有一个解决方案可以满足您想要实现的目标,您只需要正确使用覆盖网络即可。
默认情况下,连接在同一覆盖网络中的所有服务都可以相互通信/解析。
那么让我们想象一下您当前的实现。现在您拥有一个网络 traefik-net
,并且您已将所有服务连接到该网络,因此您的设计如下所示:
为了隔离不同堆栈上的服务,但又能让 traefik 访问它们,您需要做的是在每个堆栈文件中创建不同的覆盖网络,并通过在 traefik 堆栈文件中将它们定义为外部网络,将 traefik 服务连接到这些网络。你最终会变成这样:
在此实现中,不同堆栈之间的所有流量只能通过 traefik 服务进行,而不是直接进行。
关于docker - 隔离 Swarm 上连接到 traefik 覆盖网络的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56010982/