k8s-session共享问题
k8s session共享问题
背景
- 使用traefik作为Ingress
- 部署在k8s启用多个副本时,如果有使用socket会遇到
Session ID unknown
问题:
解决
解决思路就是能否让session在多个pod中共享。
SessionAffinity
ipvs模式下,如果想确保每次都将来自特定客户端的连接传递到同一个 Pod,可以通过将 service.spec.sessionAffinity
设置为"ClientIP"(默认为"None")来根据客户端的 IP 地址选择session affinity
。
会话可通过适当设置 service.spec.sessionAffinityConfig.clientIP.timeoutSeconds
来设置最大会话粘滞时间。(默认值为 10800 秒,即 3 小时,最大 86400,一天)。
缺点:过了timeoutSeconds后,就不起作用了。
traefik Sticky sessions
Traefik版本:2.4
当启用 Stickiness 后,在初始请求和响应时会设置Cookie以便客户端知道由哪个服务器来处理第一个响应。
在随后的请求中,要将会话与同一服务器保持活动,客户端会重新发送相同的cookie。
在ingressroute添加spec.routes.services.sticky
:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: foo
namespace: bar
spec:
entryPoints:
- foo
routes:
- kind: Rule
match: Host(`test.example.com`)
services:
- kind: Service
name: foo
namespace: default
port: 80
sticky:
cookie:
httpOnly: true
name: traefik-cookie
sameSite: none
可以看到,请求多个pod时,已经可以使用同一个cookies信息:
参考
https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#kind-ingressroute
https://kubernetes.io/zh/docs/concepts/services-networking/service/#proxy-mode-ipvs