具有sessionAffinity的OpenShift服务将流量转发到两个Pod

时间:2020-07-29 08:41:46

标签: kubernetes openshift session-affinity

OpenShift容器平台3.11

假定在同一名称空间中具有一个客户端Pod和三个相等的服务器Pod的设置。服务器Pod可通过以下服务获得:

  apiVersion: v1
  kind: Service
  metadata:
    name: server
  spec:
    ports:
    - name: "8200"
      port: 8200
      targetPort: 8200
    selector:
      test.service: server
    sessionAffinity: ClientIP
    sessionAffinityConfig:
      clientIP:
        timeoutSeconds: 10800 # default

Setup of client and server pods

sessionAffinity: ClientIP指出,只要客户端具有相同的IP,它的请求就会转发到相同的服务器Pod(达到timeoutSeconds时除外)。该设置按预期工作了几个月,直到突然将请求分配到两个服务器Pod之间。重新启动客户端窗格可以暂时解决问题,并且请求仅转发一段时间到一个服务器窗格。但是几天后,同样的问题再次发生。

我的问题:是否有关于OpenShift服务和sessionAffinity: ClientIP的任何东西来解释为什么来自同一客户端的IP不变的请求可能会“突然”分布在两个服务器Pod之间?


一些其他上下文:

客户端Pod在连接到服务器Pod时会收到会话令牌(不是cookie)。会话令牌被缓存在服务器容器内部,但不能在服务器容器之间共享。因此,当客户端连接到其他服务器时,它将收到拒绝该会话令牌的权限。然后,客户端请求一个新的会话令牌。如果客户端的请求转发到相同的服务器Pod,并且仅在某些情况下服务器发生了更改(例如,由于第一台服务器崩溃),则上述设置可以正常进行。但是,如果客户端的请求分布在两个或更多服务器之间,则会话令牌对于每第二个或第三个请求都是无效的。

1 个答案:

答案 0 :(得分:0)

查看 Kubernetes proxysocket 源代码,我们假设连接时间过长(超过 250 毫秒)会触发新端点的选择。

我们现在不再通过 OpenShift 服务在服务器之间分配客户端连接,而是在客户端和服务器之间使用额外的 nginx pod。