问题出现的前提
- keycloak通过k8s部署,并进行了集群部署,共2个节点
- 通过域名解析后,直接到外网LB,在LB上配置了k8s-ingress的IP,端口是80和443
- 在keycloak应用的ingress配置中,对域名进行了keycloak服务的绑定
问题的描述
- 有时间无法完成登录,点登录后,刷新了一次登录页,未完成登录行为
- 有时在登录时,出现死循环,反复302到
login-actions/authenticate
,keycloak日志中显示“会话失效”,或者可以理解为,“你使用了无效的会话session_code”
问题解决过程
- 如果是单节点不会有这个问题
- 如果是多节点部署,需要在LB上添加会话保持
- 如果是容器化部署的情况下,如果k8s-ingress进行负载,那么,除了在LB上添加了会话保持的,还需要为ingress添加会话保持,代码如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: default
name: my-app
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k" #缓冲区大小
nginx.ingress.kubernetes.io/proxy-buffers-number: "8" #缓冲区数据,不加它参数多时返
- 如果你使用rancher部署应用,直接在应用对应的负载均衡上添加即可