在K8S中实现会话保持的两种方案

 更新时间:2023年03月15日 11:19:33   作者:linyb极客之路  
这篇文章主要介绍了在K8S中实现会话保持的两种方案,每种方案结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

故事的起因是朋友所在的部门最近基于auth2实现单点登录,他们在测试环境单点登录,运行得好好的,但他们把单点登录上到预发布环境,发现单点登录不好使了。他们有部分系统是以授权码式接入,发现第一次登录拿到授权码进行换取token时,会提示授权码失效。而他们测试环境和预发布环境的代码是一样的。

后面朋友和我聊天,我就问朋友两套环境有存在什么不一样的地方,朋友说测试环境是单POD部署,而预发布环境是多POD部署。最后我还从朋友的口中得到一个信息,他们auth2是基于国内开源的sa-token进行实现,刚好我也玩过这个玩意儿,这玩意儿的授权码是基于cookies进行保持。我就跟朋友说可能是因为你部署了多个pod,pod的会话没保持住。然后我就跟朋友提供以下方案

会话保持方案

方案一:通过service进行配置

在service配置配置形如下内容

apiVersion: v1
kind: Service
metadata:
  namespace: uat
  name: uat-sso
spec:
  selector:
    app: uat-sso
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30666
  type: NodePort
  # 会话保持3小时
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

其中关键配置如下

sessionAffinity: ClientIP
sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

通过指定sessionAffinity: ClientIP开启了session保持。当设置了session保持之后,k8s会根据访问的ip来把请求转发给他以前访问过的pod,这样session就保持住了。其中timeoutSeconds指的是session保持的时间,这个时间默认是10800秒,也就是三个小时。

不过朋友说他配置了这个之后,貌似没产生作用,因为朋友他们单点登录是通过ingress进行转发,于是就有了第二种方案

方案二:通过ingress配置会话保持

配置形如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    nginx.ingress.kubernetes.io/session-cookie-name: route
  name: uat-sso-ingress
  namespace: uat
spec:
  rules:
  - host: sso.com
    http:
      paths:
      - backend:
          service:
            name: uat-sso
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - sso.com
    secretName: tls.sso.com

其中关键配置如下

metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    nginx.ingress.kubernetes.io/session-cookie-name: route

其中nginx.ingress.kubernetes.io/affinity 属性,启用会话保持, 其值仅仅支持cookie。
nginx.ingress.kubernetes.io/affinity-mode 属性,设置为persistent时,则请求一直请求至同一pods服务,设置为balanced (默认设置)则请求会使用轮询的方式至后端pods服务
nginx.ingress.kubernetes.io/session-cookie-name 属性,自定义cookie名称, 其默认设置为 INGRESSCOOKIE,但我们可自定义,如上文的route。

更多详细的配置可以查看如下链接
https://kubernetes.github.io/ingress-nginx/examples/affinity/cookie/

总结

朋友后面是通过配置ingress这种方式解决问题,本文就作为一个记录

到此这篇关于如何在K8S中实现会话保持的文章就介绍到这了,更多相关K8S会话保持内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rainbond云原生快捷部署生产可用的Gitlab步骤详解

    Rainbond云原生快捷部署生产可用的Gitlab步骤详解

    这篇文章主要为大家介绍了Rainbond云原生快捷部署生产可用的Gitlab步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • k8s应用监控探针详解

    k8s应用监控探针详解

    这篇文章主要为大家介绍了k8s应用监控探针的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • kubeadm 搭建 K8s的详细过程

    kubeadm 搭建 K8s的详细过程

    这篇文章主要介绍了kubeadm 搭建 K8s详细过程,环境使用 VirtualBox 构建的3台虚拟机,虚拟机网络配置的相关步骤给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Rainbond对微服务进行请求速率限制详解

    Rainbond对微服务进行请求速率限制详解

    这篇文章主要为大家介绍了Rainbond对微服务进行请求速率限制,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • K8S节点本地存储被撑爆问题彻底解决方法

    K8S节点本地存储被撑爆问题彻底解决方法

    这篇文章主要为大家介绍了K8S节点本地存储被撑爆问题彻底解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • RFO SIG之openEuler AWS AMI 制作详解

    RFO SIG之openEuler AWS AMI 制作详解

    这篇文章主要为大家介绍了RFO SIG之openEuler AWS AMI 制作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 详解Rainbond内置ServiceMesh微服务架构

    详解Rainbond内置ServiceMesh微服务架构

    这篇文章主要为大家介绍了详解Rainbond内置ServiceMesh微服务架构,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • K8S部署rocketmq5全过程

    K8S部署rocketmq5全过程

    在开发环境中部署RocketMQ 5并验证新版本代理特性,遇到一系列问题,包括存储权限、主从副本配置和命名空间问题,通过修改配置文件和PV设置,最终解决了这些问题,成功部署了RocketMQ集群
    2025-01-01
  • IoT边缘集群Kubernetes Events告警通知实现示例

    IoT边缘集群Kubernetes Events告警通知实现示例

    这篇文章主要为大家介绍了IoT边缘集群Kubernetes Events告警通知实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • k8s如何使用NFS作为StorageClass提供动态存储

    k8s如何使用NFS作为StorageClass提供动态存储

    本文主要介绍了k8s中的StorageClass,包括其定义、引入的原因、实现方式、定义方法以及回收策略对数据的影响等,首先,StorageClass是在K8s集群中创建用于动态PV的管理,可以链接至不同的后端存储,对存储的请求可以指向StorageClass
    2024-09-09

最新评论