关于kubernetes:聊聊如何在K8S中实现会话保持

2次阅读

共计 1877 个字符,预计需要花费 5 分钟才能阅读完成。

前言

故事的起因是敌人所在的部门最近基于 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 这种形式解决问题,本文就作为一个记录

正文完
 0