Kubernetes中如何保持Session的会话?
原创
©著作权归作者所有:来自51CTO博客作者唯一极客知识分享的原创作品,请联系作者获取转载授权,否则将追究法律责任
0x01 Kubernetes中Session的会话保持
背景说明: 基于kubernetes集群中部署Java项目,您发现在多pod模式下会出现登录成功但是页面无法跳转的问题,或验证明明输入正确却提示验证码错误无法登陆,而在单一pod时却可以成功登录并页面正常跳转,于是推测是cookie的问题。
解决方式: 进行K8S会话粘粘与保持, 但是针对于不同的实践环境又有所不同,例如采用ClusterIP、NodePort方式或者Ingress访问来访问我们的应用。
Service
描述: 网上的大部分文章提供的解决方案都是在service的配置文件中加入sessionAffinity: ClientIP
,功能是选择与请求来源ip更接近的pod,这样就会固定同一个session但可能会出现流量负载不均衡的情况。
演示案例:
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
targetPort: 8280
port: 8280
sessionAffinity: ClientIP
ingress-nginx
在ingress-nginx配置中应做以下操作:
- 设置
nginx.ingress.kubernetes.io/affinity
属性,启用会话保持, 其值仅仅支持Cookie。 - 设置
nginx.ingress.kubernetes.io/affinity-mode
属性,设置为balance在集群扩大pod时,会自动分配一些会话到新创建的pod上,用于平衡服务器的负载;设置为persistent则永远保证用户访问pod的一致性,不会访问到其他pod,其值支持balanced (默认设置) or persistent
。 - 设置
nginx.ingress.kubernetes.io/session-cookie-name
属性,自定义cookie名称, 其默认设置为 INGRESSCOOKIE,但我们可自定义。
演示案例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
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/cors-allow-origin: '*'
nginx.ingress.kubernetes.io/cors-max-age: "64800"
labels:
app: front-web
ref: front
name: front-app
namespace: web
spec:
ingressClassName: ingress-nginx
rules:
- host: app.weiyigeek.top
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: front-index
port:
number: 80
- path: /sub/
pathType: ImplementationSpecific
backend:
service:
name: front-sub
port:
number: 80
tls:
- hosts:
- app.weiyigeek.top
secretName: app-weiyigeek-top
官方参考: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#session-affinity
我们登上的并非我们所选择的舞台,演出并非我们所选择的剧本。