Flask Kubernetes上的PGadmin4:使用ELB时会话无效

Flask Kubernetes上的PGadmin4:使用ELB时会话无效,flask,kubernetes,pgadmin-4,flask-session,Flask,Kubernetes,Pgadmin 4,Flask Session,我对PGAdmin4有一个奇怪的问题 我的设置 pgadmin4.1使用chorss/docker-pgadmin4图像部署在kubernetes上。一个吊舱仅用于简化故障排除 Nginx入口控制器作为集群上的反向代理 Classic ELB位于前端,用于负载平衡集群上的传入流量 ELB NGINX PGADMIN 从DNS的角度来看,pgadmin的主机名是指向ELB的CNAME 问题 应用程序可以正确访问,用户可以登录,一切正常。问题是,在几分钟(大约2-3分钟)后,会话无效,用户被要求

我对PGAdmin4有一个奇怪的问题

我的设置

  • pgadmin
    4.1使用
    chorss/docker-pgadmin4
    图像部署在
    kubernetes
    上。一个吊舱仅用于简化故障排除
  • Nginx入口控制器
    作为集群上的反向代理
  • Classic ELB
    位于前端,用于负载平衡集群上的传入流量
ELB NGINX PGADMIN

从DNS的角度来看,pgadmin的主机名是指向ELB的CNAME

问题

应用程序可以正确访问,用户可以登录,一切正常。问题是,在几分钟(大约2-3分钟)后,会话无效,用户被要求再次登录。无论是否积极使用pgadmin,都会发生这种情况

经过无数个小时的故障排除,我发现问题发生在ELB的CNAME的DNS解析切换到另一个IP地址时

事实上,我试过:

  • 通过直接连接到
    k8s服务的节点端口直接连接到pod=>会话不会过期
    
  • 直接连接到
    nginx
    (绕过ELB)=>会话不会过期
  • 在my hosts file=>会话中映射ELB的一个IP地址不会过期
考虑到上面的测试,我认为Flask应用程序(PGAdmin4显然是一个Python Flask应用程序)在主机名的远程地址更改后认为我的cookie无效


有谁能帮我解决这个问题?关于我可能遗漏的内容,还有其他想法吗?

PGadmin 4似乎使用Flask Security进行身份验证:

pgAdmin使用Flask安全模块管理应用程序安全和用户,并提供自助密码重置和密码更改等选项

Flask Security似乎使用Flask登录:

通过集成各种Flask扩展和库,这些特性中的许多都成为可能。这些措施包括: 烧瓶登录

Flask登录似乎有一个名为“会话保护”的功能:

当会话保护处于活动状态时,每个请求都会生成用户计算机的标识符(基本上是IP地址和用户代理的安全哈希)。如果会话没有关联的标识符,则将存储生成的标识符。如果它有一个标识符,并且它与生成的标识符匹配,那么请求是OK的


我假设设置
login\u manager.session\u protection=None
可以解决这个问题,但不幸的是,我不知道如何在PGadmin中设置它。希望它能对您有所帮助。

对于那些正在寻找解决方案的人,您需要将以下内容添加到
config.py
config\u distro.py
config\u local.py

config_local.py

会话保护=无

对我完全有意义,我会尽快尝试一下。Thank@Pampyan另一种方法是,这取决于Flask Login为客户端获取IP的方式:如果您使用ELB(带有TCP),则可以启用代理协议()-如果您使用带有HTTP或ALB的ELB,则默认情况下应该启用代理协议。这应该在X-Forwarded-For报头中设置客户端IP。如果启用了该功能,会话也应保持有效,即使在切换ELB IP时也是如此。你用的是哪个ELB?经典负载均衡器还是应用负载均衡器?目标是如何定义的(TCP/HTTP/HTTPS?)经典ELB与TCP目标这可能是原因。如果没有其他理由使用TCP,您应该切换到HTTP/HTTPS。或者,您可以尝试启用代理协议或切换到ALB。一些反馈。我尝试将
session\u protection=None
添加到pod内的代码库中,但没有成功。我很确定这就是问题所在,所以我可能犯了一些错误(这里是python新手)。我无法更改ELB类型,因为它是自动处理的,我需要一个用于系统其他部分的经典ELB。尽快更新。