Redian新闻
>
K8S 之长连接负载均衡问题

K8S 之长连接负载均衡问题

公众号新闻

转自:golang面试经典讲解

一、前言

本文针对我们生产上出现的流量不均的问题,介绍一下解决方案。

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 又无法分担压力,导致扩容失效:
三、最佳实践
  1. 业务层面自动重连,避免连接 "固化" 到某个后端 Pod 上。比如周期性定时重连,或者一个连接中处理的请求数达到阈值后自动重连。
  2. 不直接请求后端,通过七层代理访问。比如 gRPC 协议,可以 使用 nginx ingress 转发 gRPC,也可以 使用 istio 转发 gRPC,这样对于 gRPC 这样多个请求复用同一个长连接的场景,经过七层代理后,可以自动拆分请求,在请求级别负载均衡。
  3. kube-proxy 的 ipvs 转发策略设置为 sh (--ipvs-scheduler=sh)。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:3861509

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
一步步解决长连接 Netty 服务内存泄漏Dubbo负载均衡策略之 一致性哈希面试官:什么是 TCP 长连接、短连接?问倒一大片。。。如何高效定位故障?这款 K8s 日志查看神器有多香?素可泰代密金佛像重新思考边缘负载均衡973页kubernetes学习笔记,全是K8S核心干货,限时分享3天马云回来了,张三兴该怎么办石墨烯限域超快辐射加热制备高负载量亚纳米金属团簇催化剂 | NSR字节跳动开源KubeAdmiral:基于 K8s 的新一代多集群编排调度引擎象限:集中外之长于一身,专注CTA策略七十一 伏击开源世界的两巨头:Linux和k8s结合|招聘岗位平均月薪3万+?万锦市长连续霸榜,年薪$28.8万!约克区阳光名单大公开!K3s vs K8s:轻量级和全功能的对决K8S很难吗?带你从头到尾捋一遍,不信你学不会!清明节 ,除了怀念,还能做些什么?K8s CPU Limits 造成的事故,竟让 Prometheus 轻松解决了?这个开源工具防止错误配置乱入k8s生产环境高性能负载均衡-分类和算法晨跑多瑙河使用 Netty+SpringBoot 打造的 TCP 长连接通讯方案基于go语言的k8s二次开发部署让K8s更加高效:服务暴露和Ingress七层代理的最佳实践!如何逐步安装 Kubernetes(k8s)指标服务器 | Linux 中国亚马逊云科技 Lambda 引入响应有效负载流深入探究K8s的安全配置资源Secret!198 道 K8s / Docker / DevOps 面试真题大汇总,2023 最新整理!| 极客时间3个管理多k8s集群实用工具K8S之长连接负载均衡问题关于K8S的服务质量QoS你知道多少?怎么排查:CPU飙升、接口负载剧增?k8s竟如此简单?大牛总结最佳路线实践!从业务出发,K8S环境自建和非自建整体架构设计比较深圳书记市长连续站台!一家龙头落户!两大巨头出手,超级风口来了
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。