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