如何在 Kubernetes 服务请求中使用会话亲和性?

22

我找不到具体说明Kubernetes服务在关联的部署被缩放成多个副本时的行为的文档。

我猜测这里涉及到一些负载均衡。这是否与服务类型有关?

此外,我希望在服务转发的请求中有一些亲和性(例如,如果可能的话,所有具有特定后缀的请求应始终映射到相同的Pod等)。这是否可行?我看到最接近的是Ambassador,但那只是服务级别的亲和性而非Pod级别。

1个回答

19

部署:无状态工作负载

我找不到一份文档来说明Kubernetes服务在关联的部署被扩展为多个副本时的行为。

使用Deployment部署的Pod应该是无状态的。

Ingress到Service路由

使用Ingress和L7代理时,路由可以基于http请求内容,但这取决于您使用的IngressController的实现方式。例如,Ingress-nginx支持一些粘性会话,而其他实现可能具有您正在寻找的功能。例如,Istio具有类似的支持设置。

Ambassador

Ambassador也支持一些会话亲和/粘性会话

配置粘性会话使Ambassador将请求路由到给定会话中的同一后端服务。换句话说,在一个会话中服务的请求由同一个Kubernetespod处理。

Pod到Service路由

当你的集群中的 pod 对集群内的服务进行 http 请求时,默认情况下 kube-proxy 使用轮询算法 进行路由。
默认情况下,处于用户空间模式的 kube-proxy 通过轮询算法选择后端。
如果你想在 pod 到服务的路由上设置会话亲和性,可以在 Service 对象上设置 SessionAffinity: ClientIP 字段。
如果你想确保来自特定客户端的连接每次都被传递到相同的 Pod 上,可以基于客户端 IP 地址选择会话亲和性,将 service.spec.sessionAffinity 设置为“ClientIP”(默认值为“None”)。

8
你的意思是“服务到 Pod 的路由”吗? - Anand
是的,你是指Service到Pod的路由吗?根据我的理解,会话亲和性可以在service.yaml文件中的Service级别进行配置,也可以在ingress级别通过注释进行配置。 - Rajendra
@Rajendra 不,我指的是“Pod到Service”的路由。请再次阅读我的回答,我写的是关于服务资源的内容。 - Jonas
@Anand 不是的,我指的是“Pod到Service”,例如集群内部通信。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接