我们有一个Java应用程序服务器运行在一个容器中,有2个副本。容器网络堆栈是Traefik。此外,我们有Apache HTTP服务器与GSSAPI模块的RISSSO身份验证。
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"
Auth机制应该像这样工作:
1.客户端访问应用程序第一次。
1.如果没有会话存在,应用服务器将客户端重定向到“/LogIn.form”。
- Apache接收到“/LogIn.form”的请求,并与客户端进行GSSAPI协商。
- Apache将授权请求代理到应用程序服务器,并添加X-Remote-User标头。
1.应用程序服务器通过Apache回复,添加自己的JSESSION cookie,重定向到自己的应用程序Web上下文。
1.使用JSESSION cookie的客户端访问应用程序在会话中保持授权。
如果Apache可以访问客户端访问的同一个应用程序服务器,那么这种机制就能很好地工作。在Kubernetes中,一个pod中的多个容器共享网络地址,因此Apache代理登录页面为http://localhost:8080,这是一个魅力。但是Docker Swarm环境是不同的,我想知道是否有一种方法可以将Apache指向它被重定向的同一个主机。
以下哪种方法有效:
1.由于应用服务器仅限于节点上的一个,如果有办法在同一节点上调用应用服务器,我们可以将Apache示例与应用服务器示例配对。有吗?
1.也许我们可以从Traefik的粘性饼干中得到一些东西来知道主机最初被称为什么。
1.也许Apache可以通过Traefik设置调用正确的应用服务器?
2条答案
按热度按时间0pizxfdo1#
我在JSESSION cookie中找到了答案,其中包含内部服务器名称。
这使得Apache能够感知集群,并让它遵循提供JSESSION的初始主机。Apache现在可能不会与应用程序容器配对,并且始终可以在集群环境中找到原始应用程序。
9lowa7mx2#
是的,使用面向客户端的负载均衡器。负载均衡器有一个叫做“粘性”的特性,它允许客户端在断开连接的情况下连接到同一个前端。
NGINX可能是一个很好的解决方案。它具有负载平衡功能,并带有一个名为“启用会话持久性”的选项。有很多供应商提供虚拟或物理负载均衡器,并为本地解决方案提供付费维护和支持。
如果这是一个云解决方案,大多数云提供商也有会话持久性与他们的负载平衡器。