Kubernetes使用OkHttp客户端进行网络负载均衡

在一次内部Java服务审计中,我们发现一些请求没有在Kubernetes(K8s)网络上正确地实现负载均衡。导致我们深入研究的问题是HTTP 5xx错误率的急剧上升,由于CPU使用率非常高,垃圾收集事件的数量很多以及超时,但这仅发生在一些特定的Pod中。这种情况并不在所有情况下都可见,因为它影响到多Pod服务,源Pod和目标Pod的数量不同。在本博文中,我将讨论我们采取的措施来负载均衡这组服务和Pod。

在我们的部署中,请求在Pod之间是如何均衡的?

img

两个源Pod向六个目标Pod发送请求。

可以清楚地看到请求分布在目标Pod之间存在不均衡。

但为什么会这样?

K8s负载均衡器(IPVS代理模式)的默认负载均衡调度程序设置为轮询(round robin)。IPVS提供了更多的选项来均衡流量到Pod后端。在测试这些选项时,我们发现当涉及到我们的服务时,不管配置如何,行为都相同,这些服务之间使用内部路由进行通信。

到底发生了什么?K8s中的IPVS根据连接来平衡流量,这在大多数情况下都表现得相当不错。我们的服务使用OkHttp作为相互通信的HTTP客户端。我们的问题与这个HTTP客户端的行为方式有关。使用默认配置,它会创建到服务器的连接,如果您不想在代码中显式关闭连接,因为这太昂贵,那么它会保持并重新建立到先前合作伙伴的连接。这意味着客户端尝试保持与目标的连接,并通过该特定连接发送请求。通常情况下,它会创建1:1的连接,这在K8s方面没有均衡。

该怎么办?

如果您需要扩展或希望使您的服务得到适当的负载均衡,您需要在客户端端更新配置。OkHttp提供了ConnectionPool功能。当使用ConnectionPool选项时,连接将在有限的时间段内建立,然后重复设置一个新的连接,因此IPVS可以进行负载均衡,因为它有大量的新连接,应该根据IPVS调度程序路由到目标。基本上,它的工作方式类似于机关枪而不是激光束。

我们在发布此更新后的效果如何?

img

使用更新的HTTP客户端和默认IPVS调度程序在多Pod服务之间实现了负载均衡的连接

到底做了什么改变?

我们进行了大量的测试,使用各种配置来测量响应时间和性能开销,以确保负载均衡。下面是主要的代码更改,看起来没有明显的性能开销。

img

代码更改示例

有一个选项可以设置调度程序,以便能够并行发送更多的请求。在我们的情况下,这最终会建立一组最近关闭的连接,然后继续只使用一个连接。此外,我们试图防止过于频繁地打开新连接,因为执行请求比打开新连接要少要求得多。

结果如何?

网络和资源的使用现在比以前更加平衡 - 没有巨大或持续很长时间的峰值,也没有出现只影响部署中某些Pod的“嘈杂邻居”效应。现在几乎所有的Pod都以几乎相同的方式被利用,因此我们能够减少我们的部署中的Pod数量。我们知道这并不完美,但对于我们的用例来说已经足够好,因为它不会给服务或IPVS负载均衡器带来明显的性能开销。

img

现在的Pod上的请求负载均衡

结论

定期进行彻底的服务审计是有益的,因为它可以揭示出未来对所有服务有益的优化点,并在解决那些本应该立即运行的功能的奇怪症状时为您节省时间。此外,花些时间查看文档,测试,讨论并了解在使用客户端库时关于连接设置和处理的默认设置的影响,以确保它们将按照您的预期行事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/158011.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…

华为OD机试 - 最大括号深度 - 栈stack(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。 刷的越多,

本、硕、博区别真的辣么大吗?

61: 发际线已经说明了一切…… Super Mario: 小学,老师告诉学生:“森林里有只老虎,已经被我关在笼子里,我会带你去那个地方,然后给你一把猎枪,告诉你猎枪怎么用,并开枪…

搭建一个vscode+uni+vue的小程序项目

我们使用 vue2 创建工程作为示例,uni-app中Vue2版的组件库和插件也比较多,稳定、问题少,可以先参考下官方文档:uni-app官网 既然是使用vue脚手架,那肯定要全局安装vue/cli,已安装的可以跳过。 注意:Vue2创…

day05-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…

解决react使用css module无法重写bootstrap样式的问题

react使用css module虽然能够解决样式污染,但是同时也失去了写css样式的灵活性,特别是:在.module.css文件中当子元素是非变量的静态class类(比如bootstrap), 此时使用css选择器对该子元素的样式不会起作用的 比如下面…

boot分页

List<ElectricDispatchTodoPO> todoList electricDispatchTodoService.queryTodlList(vo, sysStaffVO);// 计算总记录数int total todoList.size();// 如果总记录数大于0PageInfo<ElectricDispatchTodoPO> pageInfo new PageInfo<>();if (total > 0) {…

聚观早报 | “百度世界2023”即将举办;2024款岚图梦想家上市

【聚观365】10月13日消息 “百度世界2023”即将举办 2024款岚图梦想家上市 腾势D9用户超10万 华为发布新一代GigaGreen Radio OpenAI拟进行重大更新 “百度世界2023”即将举办 “百度世界2023”将于10月17日在北京首钢园举办。届时&#xff0c;百度创始人、董事长兼首席执…

科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰

据中国乘联会发布的初步数据&#xff0c;中国 9 月份乘用车市场零售 202.8 万辆&#xff0c;同比增长 6%&#xff0c;环比增 6%。今年以来&#xff0c;我国乘用车市场累计零售 1,524 万辆&#xff0c;同比增长 2%。 乘联会预计&#xff0c;9 月份新能源车市场零售 74.3 万辆&a…

创建IDEA模板

将常用的配置文件内容、模板框架等放到IDEA的模板中保存&#xff0c;方便以后使用。以mybatis-config.xml和一个映射文件为例&#xff08;这是我自己学习SSM时用到的&#xff0c;后面学习SpringBoot时发现配置都只需要写到application.yml中就ok了&#xff0c;配置变得非常简单…

Redis的下载与安装

1.redis下载 windows版本下载地址&#xff1a;https://github.com/MSOpenTech/redis/tags 解压后 2.启动redis

TCP/IP(十三)滑动窗口

一 滑动窗口 通信双方要读懂对方的反馈信息,并进行调整 TCP滑动窗口原理终于清楚了 TCP Window Full 和 TCP Zero Window 零窗口通知与窗口探测 "特殊的场景" 1、TCP Window Full 是站在发送端角度说的特点&#xff1a; 表示发送端不能再发数据给对方,除非发送…

使用 Apache Kafka 进行发布-订阅通信中的微服务

发布-订阅消息系统在任何企业架构中都发挥着重要作用&#xff0c;因为它可以实现可靠的集成&#xff0c;而无需紧密耦合应用程序。在解耦的系统之间共享数据的能力并不是一个容易解决的问题。 考虑一家拥有多个使用不同语言和平台独立构建的应用程序的企业。它需要响应地共享数…

小程序使用uni.createAnimation只执行一次的问题

思路&#xff1a; 在页面创建的时候&#xff0c;创建一个临时动画对象调用 step() 来表示一组动画完成通过动画实例的export方法导出动画数据传递给组件的animation属性还原动画页面卸载的时候&#xff0c;清除动画数据 <template><view class"content"&g…

使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题

目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置 在使用hugging face开源库accelerate进行多GPU训练&#xff08;单机多卡&#xff09;的时候&#xff0c;经常出现如下报错 [E Process…

设计模式_责任链

责任链模式 介绍 设计模式定义案例责任链模式问题 传给 多个可处理人 这多个处理人做成一个链表学生请假条审核 上课老师&#xff08;3天权限&#xff09; 班主任 &#xff08;5天权限&#xff09; 校长 &#xff08;30天权限&#xff09; 问题堆积在哪里解决办法进一步优…

k8s 1.28版本二进制安装

本文目录 二进制安装Kubernetes&#xff08;k8s&#xff09;v1.28.0介绍1.环境1.0.环境准备1.Linux网卡没有eth0显示ens33或者其它&#xff08;以ens33为例&#xff09;方法一&#xff1a;修改网卡配置方法二&#xff1a;重新安装机器(本文为虚拟机) 2.克隆的虚拟机&#xff0c…

ExcelBDD Python指南

在Python里面支持BDD Excel BDD Tool Specification By ExcelBDD Method This tool is to get BDD test data from an excel file, its requirement specification is below The Essential of this approach is obtaining multiple sets of test data, so when combined with…

《向量数据库指南》——宏观解读向量数据库Milvus Cloud

宏观解读向量数据库 如今,强大的机器学习模型配合 Milvus 等向量数据库的模式已经为电子商务、推荐系统、语义检索、计算机安全、制药等领域和应用场景带来变革。而对于用户而言,除了足够多的应用场景,向量数据库还需要具备更多重要的特性,包括: 可灵活扩展、支持调参:当…

微服务13-Seata的四种分布式事务模式

文章目录 XA模式实现XA模式 AT模式AT模式的脏写问题&#xff08;对同数据并发写的问题&#xff09;其他事务不获取全局锁的一个情况&#xff08;AT模式写隔离的实现&#xff09;实现AT模式 TCC模式TCC实现我们怎么样去判断是否空回滚和业务悬挂&#xff1f;业务分析 Saga模式总…