kubernetes session会话保持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes session会话保持相关的知识,希望对你有一定的参考价值。

参考技术A

基于kubernetes部署Java项目,发现在多pod模式下,会出现登录成功但是页面无法跳转的问题,在单一pod时却可以成功登录并页面正常跳转,于是推测是cookie的问题。

网上的大部分文章提供的解决方案都是在service的配置文件中加入 sessionAffinity: ClientIP ,功能是选择与请求来源ip更接近的pod,这样就会固定同一个session,但是好像并不适用于我这个项目。

最终的解决当然还是要靠自己读官方的文档, ingress-nginx 有大量的注释配置,官方针对这种情况已经做了说明,需要细细阅读,详见 Cookie affinity 。

注释 nginx.ingress.kubernetes.io/affinity 在Ingress的所有上游中启用和设置相似性类型。这样,请求将始终定向到同一上游服务器。Nginx唯一可用的相似性类型是 cookie 。

如果您使用 Cookie affinity ,则还可以使用注释 nginx.ingress.kubernetes.io/session-cookie-name 来指定将用于路由请求的cookie名称。 默认是创建一个名为 INGRESSCOOKIE 的cookie。

注释 nginx.ingress.kubernetes.io/affinity-mode 定义了会话的粘性。如果将部署规模扩大, balance 则将此选项设置为(默认)将重新分配一些会话,从而重新平衡服务器上的负载。将此设置为 persistent 不会重新平衡与新服务器的会话,因此提供了最大的粘性。

以上是官方文档的直译。

简而言之,在 ingress-nginx 配置中应做以下操作:

可见 cookie示例 。

对我用到了其中的三个属性进行描述:

使用session会话保持可以用于解决多tomcat的pod下,登录由于session问题导致页面无法跳转的问题。

以下为其他网友提供的解决方案:

在service的配置文件中加入 sessionAffinity: ClientIP ,功能是选择与请求来源ip更接近的pod,这样就会固定同一个session。

欢迎访问我的个人博客: Lemon - 万事顺遂

负载均衡session会话保持方法

负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法:
1.使用cookie
将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的session,如果没有就先把cookie里面的sessoin存入该服务器,实现session会话保持。缺点是存入cookie有安全隐患。

2.使用缓存
利用memcache,redis等缓存分布式的特点,可以将所有服务器产生的session存入同一台服务器的缓存中,实现session共享。这样安全性比较高,而且从内存中读取session比从文件中读取速度快。

实例:PHP分布式中Redis实现Session


3.使用ip_hash
如果是nginx服务器的负载均衡,可以在upstream里设置ip_hash,每个请求按访问ip的hash结果分配,映射到固定某一台的服务器。缺点是可能导致负载不均衡。

以上是关于kubernetes session会话保持的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes中traefik的会话保持和负载均衡策略配置方式

18.使用phpmyadmin实现cookie和session

18.使用phpmyadmin实现cookie和session

session会话保持的几种方式并举例实现

tomcat基于session会话保持以及msm会话保持

session会话基础理论