首页 > 其他分享 >聊聊如何在K8S中实现会话保持

聊聊如何在K8S中实现会话保持

时间:2023-03-14 09:55:57浏览次数:50  
标签:ingress 聊聊 kubernetes nginx 会话 session cookie io 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这种方式解决问题,本文就作为一个记录

标签:ingress,聊聊,kubernetes,nginx,会话,session,cookie,io,K8S
From: https://www.cnblogs.com/linyb-geek/p/17024660.html

相关文章

  • K8S-Helm
    一.helm概述1.1什么是helm在没使用helm之前,向kubernetes部署应用,我们要依次部署deployment、svc等,步骤较繁琐。随着很多项目微服务化,复杂的应用在容器中部署以......
  • 基于Kubernetes(k8s)部署Dubbo+Nacos服务
    一、说明本文介绍基于Kubernetes(k8s)环境集成阿里云私有镜像仓库来部署一套Dubbo+Nacos的微服务系统,并使用KubernetesDNS以及port-forward的方式来打通网络......
  • K8S中HPA详解
    一、HPA解决的问题HPA全称是HorizontalPodAutoscaler,也就是对k8s的workload的副本数进行自动水平扩缩容(scale)机制,也是k8s里使用需求最广泛的一种Autoscaler机制,在开始......
  • Rancher管理K8S
    一、Rancher简介Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数......
  • 【云原生】k8s 环境快速部署(一小时以内部署完)
    目录1)基于ansible一键部署k8s流程图2)安装ansible3)下载4)修改配置1、修改节点信息,配置文件:/etc/ansible/hosts2、修改install-k8s/init/templates/hosts5)导镜像5)执行部署6)......
  • Azure虚拟桌面专题之十八:使用排出模式隔离会话主机以进行维护
    如果Azure虚拟桌面会话主机要应用补丁并进行维护而不中断用户会话,则可以使用排出模式,排出模式可隔离会话主机。隔离时,会话主机不会接受新的用户会话。任何新连接都会重定......
  • K8S 性能优化 - OS sysctl 调优
    前言K8S性能优化系列文章,本文为第一篇:OSsysctl性能优化参数最佳实践。参数一览sysctl调优参数一览#KubernetesSettingsvm.max_map_count=262144kernel.softl......
  • k8s中如何正确删除pod
    ---♦ 在日常的k8s运维过程中,避免不了会对某些pod进行剔除,那么如何才能正确的剔除不需要的pod呢? 首先,需要查出想要删除的pod#可通过任意方式进行查询kubectlget......
  • K8S 性能优化-K8S Node 参数调优
    前言K8S性能优化系列文章,本文为第四篇:KubernetesNode性能优化参数最佳实践。系列文章:《K8S性能优化-OSsysctl调优》《K8S性能优化-K8SAPIServer调优》《......
  • K8S 性能优化-K8S Node 参数调优
    前言K8S性能优化系列文章,本文为第四篇:KubernetesNode性能优化参数最佳实践。系列文章:《K8S性能优化-OSsysctl调优》《K8S性能优化-K8SAPIServer调优》......