Kubernetes上的PGadmin4:使用ELB

时间:2019-02-11 15:56:10

标签: flask kubernetes pgadmin-4 flask-session

我对PGAdmin4有一个奇怪的问题。

我的设置

  • pgadmin 4.1使用kubernetes映像部署在chorss/docker-pgadmin4上。一个POD只是为了简化故障排除;
  • Nginx ingress controller作为集群上的反向代理;
  • Classic ELB位于前面,以平衡群集中传入的流量。

ELB <=> NGINX <=> PGADMIN

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

问题

可以正确访问应用程序,用户可以登录并且一切正常。问题是,大约两到三分钟后,该会话无效,并且要求用户再次登录。无论是否积极使用pgadmin,都将发生这种情况。

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

事实上,我尝试过:

  • 通过直接连接到k8s service的节点端口直接连接到Pod =>会话不会过期;
  • 直接连接到nginx(绕过ELB)=>会话不会过期;
  • 在主机文件=>会话中映射ELB的IP地址之一不会过期。

鉴于以上测试,我得出的结论是,在更改主机名的远程地址后,Flask应用程序(显然是PGAdmin4是Python Flask应用程序)认为我的cookie无效。

任何Flask开发人员可以帮助我解决此问题吗?关于我可能会丢失的东西还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

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

  

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

https://www.pgadmin.org/docs/pgadmin4/dev/code_overview.html

Flask-Security似乎使用Flask-Login:

  

通过集成各种Flask扩展和库,使其中许多功能成为可能。它们包括:   烧瓶登录   ...

https://pythonhosted.org/Flask-Security/

烧瓶登录似乎具有一个称为“会话保护”的功能:

  

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

https://flask-login.readthedocs.io/en/latest/#session-protection

我认为设置login_manager.session_protection = None可以解决此问题,但是不幸的是,我不知道如何在PGadmin中进行设置。希望它能以某种方式对您有所帮助。

答案 1 :(得分:1)

对于那些寻求解决方案的人,您需要在下面添加到config.pyconfig_distro.pyconfig_local.py

config_local.py

SESSION_PROTECTION = None