Google Kubernetes引擎集群间会话亲和力(Sticky会话)

时间:2019-11-29 16:57:17

标签: kubernetes google-cloud-platform google-kubernetes-engine

这种情况是,我有2个应用程序:A和B在gke上的群集的同一命名空间中。 A在1个吊舱上,B在2个吊舱上。

客户每次与我们的服务进行通信。它首先在A上通过websockets连接。然后A向B发送http请求。由于B有2个Pod,我希望外部的客户端与我的应用程序B之间具有会话亲缘关系,以便每次客户端连接到A时,它将始终通过客户端处理请求。 B的同一个豆荚。

我看到的每个会话亲缘关系选项都基于Ingress网关或服务,但是由于我已经在集群中,因此不需要Ingress。

我还看到有些服务提供对HTTP cookie的支持。那样很好,但是它始终是Nginx或Istio之类的外部服务,并且由于我在高度受限的开发环境中工作,因此很难在群集中添加这些服务。

gke是否有任何可以为我提供http cookie会话亲和力或类似功能的东西?

3 个答案:

答案 0 :(得分:0)

  

客户每次与我们的服务进行通信。它首先在A上通过websockets连接。然后A向B发送http请求。由于B有2个Pod,我希望外部的客户端与我的应用程序B之间具有会话亲缘关系,以便每次客户端连接到A时,它将始终通过客户端处理请求。 B的同一个豆荚。

A与B进行通信。A应该连接到B的特定实例,具体取决于最终用户连接到B的位置。

这是分片,而不是会话亲和力,但我理解您的意思。这意味着您的服务B需要一个稳定的网络身份

通过用户身份共享

服务B需要部署为StatefulSet才能获得稳定的网络身份。然后,服务A可以进行 sharding (分片),例如基于用户名或IP地址范围或其他内容,因此对用户X 的请求始终由实例Y 处理。

在将服务B部署为StatefulSet的情况下,实例将被命名为app-b-0app-b-1,因此可以使用稳定的身份从服务A寻址每个实例。

答案 1 :(得分:0)

您可能已经设置了基于客户端IP的会话相似性,这种相似性发生在服务级别,例如:

apiVersion: v1
kind: Service
metadata:
  name: svc-sa
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: nginx
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600

因此,此服务会将请求路由到相同的后端(Pod),具体取决于请求的源IP地址。

无论如何,您都需要在针对两个Pod的应用程序B之前设置服务。现在,这里的问题是您的应用程序A充当代理,因此将考虑来自应用程序A的所有请求。

我知道这是一个完整的答案,但是您可能可以在应用程序A中以标头(X-Forwarded-For)的方式进行操作,以通过原始IP地址绕过Pod A IP地址请求。

答案 2 :(得分:0)

在GKE集群中,当您创建Kubernetes Ingress对象时,GKE入口控制器将唤醒并创建Google Cloud Platform HTTP(S)负载均衡器。入口控制器配置负载均衡器,还配置一个或多个与负载均衡器关联的后端服务。

从GKE版本1.11.3-gke.18开始,您可以使用Ingress配置后端服务的以下属性:

  • 超时
  • 连接耗尽超时
  • 会话亲和力

This将对您有用,它是GKE Ingress的本机。