共计 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 这种形式解决问题,本文就作为一个记录