首页 > 解决方案 > 具有 sessionAffinity 的 OpenShift 服务将流量转发到两个 pod

问题描述

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

设置客户端和服务器 pod

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

我的问题:有什么关于 OpenShift 服务sessionAffinity: ClientIP的吗?这解释了为什么来自具有未更改 IP 的同一客户端的请求可能“突然”分布在两个服务器 pod 之间?


一些额外的上下文:

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

标签: kubernetesopenshiftsession-affinity

解决方案


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

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


推荐阅读