K8S之长连接负载均衡不均如何解决

一、前言
本文针对我们生产上出现的流量不均的问题,介绍一下解决方案。
k8s是一个特别复杂的系统,而网络相关的问题是其中最复杂的问题,要通过一两篇文章介绍清楚是很难的。这个流量不均的问题出现的原因并不复杂,就是因为kube-proxy使用了默认的iptables做负载均衡,而它是以概率的方式转发,使用长连接且连接数较少时,偏差会比较大。下面介绍两种场景。
二、场景
2.1 滚动更新负载不均
在连接数比较固定或波动不大的情况下,滚动更新时,旧 pod 上的连接逐渐断掉,重连到新启动的 pod 上,越先启动的 pod 所接收到的连接数越多,造成负载不均:
2.2 rr 策略负载不均
假如长连接服务的不同连接的保持时长差异很大,而 ipvs 转发时默认是 rr 策略转发,如果某些后端 pod 运气较差,它们上面的连接保持时间比较较长,而由于是 rr 转发,它们身上累计的连接数就可能较多,节点上通过 ipvsadm -ln -t cluster-ip:port 查看某个 service 的转发情况:
我们发现部分 pod 连接数高,它们相比连接数低的 pod 要同时处理更多的连接,消耗的资源也就相对更多从而造成负载不均。
将 kube-proxy 的 ipvs 转发模式设置为 lc (least-connection) ,即倾向转发给连接数少的 pod,可能会有所缓解,但也不一定,因为 ipvs 的负载均衡状态是分散在各个节点的,并没有收敛到一个地方,也就无法在全局层面感知哪个 pod 上的连接数少,并不能真正做到 lc。可以尝试设置为 sh (source hashing),并且这样可以保证即便负载均衡状态没有收敛到同一个地方,也能在全局尽量保持负载均衡。
这边很多对kupe-proxy的ipvs模式可能不太了解,ipvs和iptables都是基于netfilter的,两者差别如下:
ipvs 为大型集群提供了更好的可扩展性和性能
ipvs 支持比 iptables 更复杂的负载均衡算法(最小负载、最少连接、加权等等)
ipvs 支持服务器健康检查和连接重试等功能
2.3、扩容失效问题 在连接数比较固定或波动不大的情况下,工作负载在 hpa 自动扩容时,由于是长链接,连接数又比较固定,所有连接都 固化 在之前的 pod 上,新扩出的 pod 几乎没有连接,造成之前的 pod 高负载,而扩出来的 pod 又无法分担压力,导致扩容失效:
三、最佳实践
业务层面自动重连,避免连接 固化 到某个后端 pod 上。比如周期性定时重连,或者一个连接中处理的请求数达到阈值后自动重连。
不直接请求后端,通过七层代理访问。比如 grpc 协议,可以 使用 nginx ingress 转发 grpc,也可以 使用 istio 转发 grpc,这样对于 grpc 这样多个请求复用同一个长连接的场景,经过七层代理后,可以自动拆分请求,在请求级别负载均衡。
kube-proxy 的 ipvs 转发策略设置为 sh (--ipvs-scheduler=sh)。


区块链的共识机制拯救了贾跃亭
经纬度时控开关怎么接线?
ADI解决方案助力加速迈进工业4.0时代
无人飞行器高清无线视频传输的解决方案
I2C通讯协议
K8S之长连接负载均衡不均如何解决
四导线电阻压力传感器的误差补偿
大电流弹片微针模组在3C锂电池中的作用
浅谈Javascript数据类型
手机芯片正在处于全面缺货状态?
让我们从芯片业开始,来理解中国科技产业的大图景
手机拍照被重新定义,OPPO5倍无损变焦技术来袭
区块链和物联网结合存在什么挑战
TDA9178各引脚功能及电压
电子封装技术革新:引领电子产品迈向更高可靠性的未来
深入了解ARMv9对不可屏蔽中断的支持
芯片设计制造全流程步骤
基于TMS320F2812的分布式温度采集记录仪的设计与实现
把坦克世界移动视频游戏变成一个AR体验会是什么样的感觉呢?
浅谈电梯的电气控制系统故障分析