首页 > 解决方案 > 指向外部 URL 以始终转到 Docker 容器的同一实例

问题描述

我有以下用例,我将不胜感激。我有一个运行着 Traefik 的 Docker Swarm,指向它的入口和路由。目前我将它作为一个服务定义为具有相同图像的 6 个副本,因此可以计算出两个容器,每个容器位于三个节点上。

这些容器基本上托管了一个 GraphQL 服务器,我的要求是根据请求来自哪个客户端,它总是转到同一个特定容器(即副本)。例如,假设我在 client1 有 user1 和 user2,在 client2 有 user3 和 user4,如果 user1 发出请求并转到副本 1,那么如果 user2 发出请求,它也必须转到副本 1。所以基本上,我可以对客户端 id (client1) 和 mod 6 进行数字哈希,并决定它转到哪个副本,并以这种方式确保来自该客户端 id 中任何用户的任何后续调用都转到同一个副本。此外,调用来自哪个客户端的信息被编码在用户在其请求中发送的 JWT 令牌中。

知道我将如何改变我的 Docker Swarm 来实现它吗?我最好的猜测是将 swarm 更改为不是 6 个副本,而是将每个容器定义为具有自己端口的单独服务。然后我可以将 Traefik 指向 nginx 或类似的东西,然后接收请求,获取 JWT,对其进行解码以找到客户端 ID,获取哈希,然后在内部将其路由到适当的节点:端口组合。

但我觉得必须有一种更优雅、更简单的方法来做到这一点。也许 Traefik 可以以某种方式直接促进这一点,或者 Docker Swarm 有一些我不知道的配置,可以使用。有任何想法吗?

编辑:只是为了澄清我的用例,不仅仅是寻找同一个用户总是去同一个容器,而是寻找相同类型的用户总是去同一个容器

标签: dockernginxdocker-swarmtraefik

解决方案


对于这种路由,您需要为粘性会话设置 Traefik

这是一个 Traefik 中间件,它将 cookie 添加到响应中,用于在后续请求中路由到同一服务。


推荐阅读