这种情况是,我有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会话亲和力或类似功能的东西?
答案 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-0
和app-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的本机。