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

posted @ 2021-04-11 18:54  Ashin5800  阅读(708)  评论(0编辑  收藏  举报