抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

问题

部署在k8s启用多个副本时,如果有使用socket会遇到Session ID unknown问题:

sessionid_notfound

解决思路就是能否让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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

注意:
官网给的参数有四个:

ingress-stick

其中的secure如果使用http应该设置为false,不设置默认为false。

可以看到,请求多个pod时,已经可以使用同一个cookies信息:

sticksession

参考

https://doc.traefik.io/traefik/routing/providers/kubernetes-crd/#kind-ingressroute

https://kubernetes.io/zh/docs/concepts/services-networking/service/#proxy-mode-ipvs

评论