如何在对 Kubernetes 服务的请求中使用 Session Affinity?

How to use Session Affinity on requests to Kubernetes service?

我找不到指定 Kubernetes 服务在使用多个副本扩展附属部署时的行为方式的文档。

我假设存在某种负载平衡。与服务类型有关吗?

另外,我希望在服务转发的请求中有一些亲和力(即,如果可能,所有具有特定后缀的请求都应始终映射到同一个 pod,等等)。这是可以实现的吗?我见过的关闭是 Ambassador,但这是服务级别的亲和力,而不是 pod 级别。

部署:无状态工作负载

I could not find a documentation that specifies how Kubernetes service behaves when the affiliated deployment is scaled with multi replicas.

使用 Deployment 部署的

Pods 应该是无状态的。

进入服务路由

当使用 Ingress、L7-proxy 时,路由可以基于 http 请求内容,但这取决于您使用的 IngressController 的实现。例如。 Ingress-nginx has some support for sticky sessions and other implementations may have what you are looking for. E.g. Istio 已支持类似设置。

大使

您写的

Ambassador 也有 一些 支持 session affinity / sticky sessions.

Configuring sticky sessions makes Ambassador route requests to the same backend service in a given session. In other words, requests in a session are served by the same Kubernetes pod

Pod 到服务路由

当集群中的 pod 向集群中的服务发出 http 请求时,kube-proxy does routing 默认采用 循环 方式。

By default, kube-proxy in userspace mode chooses a backend via a round-robin algorithm.

如果你想在 Pod 到服务的路由上建立会话关联,你可以在 Service 对象上设置 SessionAffinity: ClientIP 字段。

If you want to make sure that connections from a particular client are passed to the same Pod each time, you can select the session affinity based on client’s IP addresses by setting service.spec.sessionAffinity to “ClientIP” (the default is “None”).