如何在对 Kubernetes 服务的请求上使用 Session Affinity?
Posted
技术标签:
【中文标题】如何在对 Kubernetes 服务的请求上使用 Session Affinity?【英文标题】:How to use Session Affinity on requests to Kubernetes service? 【发布时间】:2020-03-16 05:36:34 【问题描述】:我找不到指定在关联部署使用多个副本进行扩展时 Kubernetes 服务的行为方式的文档。
我假设存在某种负载平衡。和服务类型有关系吗?
另外,我希望在服务转发的请求中具有一些亲和力(即,如果可能,所有具有特定后缀的请求都应始终映射到同一个 pod,等等)。这是可以实现的吗?我看到的关闭是 Ambassador,但这是服务级别的亲和力,而不是 pod 级别。
【问题讨论】:
【参考方案1】:部署:无状态工作负载
我找不到指定在关联部署使用多副本扩展时 Kubernetes 服务的行为方式的文档。
使用Deployment
部署的 Pod 应该是无状态的。
入口到服务路由
当使用Ingress
,L7-proxy 时,路由可以基于 http 请求内容,但这取决于你使用的 IngressController 的实现。例如。 Ingress-nginx 有一些对粘性会话的支持,其他实现可能有你想要的。例如。 Istio 支持类似的设置。
大使
您所写的Ambassador 也一些支持会话亲和/粘性会话。
配置粘性会话会使 Ambassador 将请求路由到给定会话中的同一后端服务。换句话说,会话中的请求由同一个 Kubernetes pod
提供服务
Pod 到 Service 路由
当集群中的 pod 向集群中的 Service 发出 http 请求时,kube-proxy does routing 默认以 循环 方式。
默认情况下,用户空间模式下的 kube-proxy 通过循环算法选择后端。
如果您希望 pod 到服务路由的会话亲和性,您可以在 Service
对象上设置 SessionAffinity: ClientIP
字段。
如果您想确保来自特定客户端的连接每次都传递到同一个 Pod,您可以通过将 service.spec.sessionAffinity 设置为“ClientIP”(默认为“无”)。
【讨论】:
以上是关于如何在对 Kubernetes 服务的请求上使用 Session Affinity?的主要内容,如果未能解决你的问题,请参考以下文章
负载测试 kubernetes 服务(使用 istio 服务网格)
错误 - TypeError:在对angular 5 app内的api服务器发出GET请求后,仅在Safari上键入错误