我提前为长度道歉 - 但这很有趣,特别是对于建筑师和 Traefik 巫师而言。
挑战:
最重要的是,我希望有一个设置,我们可以利用traefik
动态配置功能来:
自动检测容器何时停止,并知道回退到开发机器/外部主机上的外部服务。
或者 - 当启动本地数据库容器时,知道优先选择它而不是来自外部源的数据库服务。
完整情况
我需要为几个团队优化工作流程。
限制条件:
- 开发人员致力于多层复杂的微服务网格
- 网格中的服务数量约为 50 个,其中一些是内存密集型的
- 本地演示和验收测试需要从最终用户的角度展示整个网络的工作原理
- 现在要求开发人员在本地运行所有网格,除了一些具有实时数据副本的共享数据库 - 这些数据库有时也可以在本地运行。
这需要在开发人员机器上运行绝对最低要求。当前解决方案依赖于docker-compose和[email protected]
,我被要求保留这一点,但是,我相信升级到[email protected]
会被接受。
追求的用例
我实际上在这里与您一起探讨两个用例,我相信它们有相同的解决方案 - 至少在理论上......
用例一——多个微服务的本地开发
Dev-Mode = running a process in debug mode, with IDE, file-watch live reloads, etc.
AS A - developer of services in mid layers of the service mesh
I WANT - to be able to direct traffic to services under development to
native processes on my machine, and keep the rest in the compose
network
SO THAT - I can run in Dev-Mode only services under development,
while all the rest in the mesh run using production-level docker
images in docker-compose.
用例二——本地开发和外部数据库
AS A - developer of data brokers in the mesh
I WANT - to control if containers get to the shared db or to local
db container using traefik
SO THAT - I can keep applications in the containers completely agnostic to
the topography in which they run
那么缺少了什么?
首先,由于 Traefik 是所有容器间通信都通过的服务总线,我正在寻找一种配置方法traefik
来使用来自外部docker-compose 网络。
第一个用例意味着用作traefik
服务总线 - 知道每个服务在哪里运行的唯一实体,可以是容器,也可以是 docker-compose 网络外部的服务。
第二个用例意味着设置traefik
将流量引导到在 docker-compose 网络之外运行的进程,但具体是在开发人员的机器上,而该进程又使用来自 compose 网络的服务(为此,开发与生产环境不同,compose 为网格中的每个节点公开一个入口点,包括仅在生产内部使用的服务)。
两个一个的价格
我知道这里有两个问题,但我想不出另一种方法来分别提出每个问题并得到与全局相关的答案......
我希望有一个设置,我们可以利用traefik
动态配置功能来:
自动检测容器何时停止,并知道回退到开发人员机器或任何其他主机上的外部服务。或者 - 当数据库容器启动时,知道优先使用它而不是外部数据库服务。
我们可以要求开发人员将记录添加到他们的hosts
文件,但基于 DNS 的解决方案更可取,特别是如果我们可以使用 docker 内置的 DNS :)
帮助 ?
如能得到任何帮助或指明正确的方向,我们将不胜感激!
答案1
我已经做了。
查看此处演示的单独解决方案:
https://github.com/osher/lcdev-using-compose-and-traefik
总结:
- 开发人员主机位于 docker-compose 网络内部
host.docker.internal
。 - 文件提供商为团队维护的每个服务提供服务和路线。文件提供商中的路线设置为低优先级。
- docker provider 为每个 docker-compose 容器提供服务和路由。通过这种方式创建的路由被设置为高优先级。
结果:
- 当容器存在时-它就会被使用。
- 当容器停止时-
traefik
将尝试开发机器。