kubernetes - 如何在 Kubernetes 中管理持久连接
问题描述
在 Kubernetes 中,服务通过服务 ip 相互通信。使用 iptables 或类似的东西,每个 TCP 连接都被透明地路由到可用于被调用服务的 pod 之一。如果调用服务没有关闭 TCP 连接(例如使用 TCP keepalive 或连接池),它将连接到一个 pod,而不使用可能产生的其他 pod。
处理这种情况的正确方法是什么?
我自己不满意的想法:
每次 api 调用后关闭连接
我是否让每次调用都变慢了,只是为了能够将请求分发到不同的 pod?感觉不对。
最小连接数
我可以强制调用者打开多个连接(假设它会在这些连接中分发请求)但是应该打开多少个?调用者(并且可能不应该)不知道有多少个 pod。
禁用突发
我可以限制被调用服务的资源,因此它在多个请求时变慢,调用者将打开更多连接(希望与其他 pod)。同样,我不喜欢任意减慢请求速度的想法,这仅适用于 cpu 绑定服务。
解决方案
keep-alive 行为可以通过 Keep-Alive 通用标题中指定的选项进行调整:
例如:
Connection: Keep-Alive
Keep-Alive: max=10, timeout=60
因此,您可以在特定超时后重新打开 tcp 连接,而不是在每个 API 请求或最大数量的 http 事务之后。
请记住,不保证超时和最大值。
编辑:
注意如果使用k8s服务可以选择两种LB模式:
iptables 代理模式(默认情况下,iptables 模式下的 kube-proxy 会随机选择一个后端。)
IPVS 代理模式,您有不同的负载平衡选项:
IPVS 提供了更多用于平衡后端 Pod 流量的选项;这些是:
rr:循环 lc:最少连接(打开连接的最少数量) dh:目标哈希 sh:源哈希 sed:最短预期延迟 nq:从不排队
检查这个链接
推荐阅读
- azure-active-directory - 是否可以将 $filters 与 msgraph /groups/delta 一起使用?
- javascript - 点击事件回调在用户第二次点击时被调用
- scala - 一个写得很糟糕的 Scala 代码。写得好怎么看?(玩弄编程范式和技术)
- python - Numpy数组没有重塑
- angular - TypeError:pna.nextTick 不是函数
- ruby-on-rails - 如何更改 Rails 5.2 url_for 超时
- c++ - Oracle 12.2 导致 Proc*C 应用程序崩溃
- python - 使用 linux 或 python 从文件中提取特定的列和字符串
- python - 如何调整 PlotWidget 的高度?
- python - 如何从集群实现 sklearn -AgglomerativeClustering?