访问 Docker Swarm 部署中的某些容器副本

问题描述 投票:0回答:1

我们有一个 Java 应用程序服务器在具有 2 个副本的容器中运行。容器网络堆栈是Traefik。此外,我们还有 Apache HTTP Server 和 GSSAPI 模块,用于 Kerberos SSO 身份验证。

Traefik 是这样配置的:

services:
  app:
    ...
    deploy:
      mode: replicated
      replicas: 2
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik-public"
        - "traefik.http.routers.app.entrypoints=web"
        - "traefik.http.routers.app.rule=Host(`www.example.com`) && PathPrefix(`/`)"
        - "traefik.http.services.app.loadbalancer.server.port=8080"
        - "traefik.http.services.app.loadBalancer.sticky.cookie"
        - "traefik.http.services.app.loadBalancer.sticky.cookie.name=AppCookie"

  apache:
    ...
    deploy:
      mode: replicated
      replicas: 2
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik-public"
        - "traefik.http.routers.apache.entrypoints=web"
        - "traefik.http.routers.apache.rule=Host(`www.example.com`) && Path(`/LogIn.form`)"
        - "traefik.http.services.apache.loadbalancer.server.port=80"
        - "traefik.http.services.apache.loadbalancer.server.port=8080"
        - "traefik.http.services.apache.loadBalancer.sticky.cookie"
        - "traefik.http.services.apache.loadBalancer.sticky.cookie.name=AppCookie"

身份验证机制预计将像这样工作:

  1. 客户端首次访问应用程序。
  2. 没有会话存在,应用程序服务器将客户端重定向到“/LogIn.form”。
  3. Apache 收到“/LogIn.form”请求并与客户端进行 GSSAPI 协商。
  4. Apache 将授权请求代理到添加 X-Remote-User 标头的应用程序服务器。
  5. 应用程序服务器通过 Apache 添加自己的 JSESSION cookie 进行回复,重定向到自己的应用程序 Web 上下文。
  6. 使用 JSESSION cookie 的客户端访问应用程序在会话内保持授权。

如果 Apache 可以与客户端访问同一应用程序服务器,则此机制非常有效。在 Kubernetes 中,一个 pod 中的多个容器共享网络地址,因此 Apache 代理登录页面为 http://localhost:8080,这就像一个魅力。但是 Docker Swarm 环境不同,我想知道是否有办法将 Apache 指向它重定向的同一主机。

以下哪种方法可行:

  1. 由于应用程序服务器仅限于节点上的一个,如果有一种方法可以调用同一节点上的应用程序服务器,我们可以将 Apache 实例与应用程序服务器实例配对。有吗
  2. 也许我们可以从 Traefik 的粘性 cookie 中获取一些信息来知道主机最初被称为什么。
  3. 也许 Apache 可以设置一些东西来通过 Traefik 调用正确的应用程序服务器?
docker apache docker-swarm traefik
1个回答
0
投票

是的,使用面向客户端的负载均衡器。负载均衡器具有称为“粘性”的功能,允许客户端在断开连接的情况下连接到同一前端。

NGINX 可能是一个很好的解决方案。它具有负载平衡功能,并具有名为“启用会话持久性”的选项。有许多供应商提供虚拟或物理负载均衡器,并提供付费维护和对本地解决方案的支持。

如果这是云解决方案,大多数云提供商还通过其负载均衡器实现会话持久性。

© www.soinside.com 2019 - 2024. All rights reserved.