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

use*_*254 5 openshift kubernetes 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
Run Code Online (Sandbox Code Playgroud)

客户端和服务器 Pod 的设置

sessionAffinity: ClientIP声明规定,只要客户端具有相同的 IP,其请求就会转发到同一服务器 pod(除非达到 timeoutSeconds)。这个设置按预期工作了几个月,直到请求突然分配到两个服务器 Pod 之间。重新启动客户端 Pod 暂时解决了该问题,并且请求仅在一段时间内转发到一个服务器 Pod。然而几天后,同样的问题又出现了。

我的问题:是否有任何有关 OpenShift 服务的信息,并sessionAffinity: ClientIP解释了为什么来自同一客户端且 IP 未更改的请求可​​能会“突然”分布在两个服务器 Pod 之间?


一些额外的上下文:

客户端 Pod 在连接到服务器 Pod 时会收到会话令牌(不是 Cookie)。会话令牌缓存在服务器 Pod 内部,但不在服务器 Pod 之间共享。因此,当客户端连接到不同的服务器时,它将收到会话令牌的权限被拒绝。然后客户端请求一个新的会话令牌。如果客户端的请求被转发到同一个服务器 Pod,并且仅有时服务器发生更改(例如,因为第一个服务器崩溃),则上述设置可以正常工作。但是,如果客户端的请求分布在两个或多个服务器之间,则会话令牌将在每第二个或第三个请求时失效。

use*_*254 0

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

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