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.mzph.cn/news/102945.shtml

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

相关文章

ctfshow-ssti

web361 名字就是考点,所以注入点就是name 先测试一下存不存在ssti漏洞 利用os模块,脚本 查看一下子类的集合 ?name{{.__class__.__base__.__subclasses__()}} 看看有没有os模块,查找os 利用这个类,用脚本跑他的位置 import …

LeetCode(力扣)416. 分割等和子集Python

LeetCode416. 分割等和子集 题目链接代码 题目链接 https://leetcode.cn/problems/partition-equal-subset-sum/ 代码 class Solution:def canPartition(self, nums: List[int]) -> bool:sum 0dp [0]*10001for num in nums:sum numif sum % 2 1:return Falsetarget …

arm实验

设置按键中断,按键1按下,LED亮,再次按下,灭 按键2按下,蜂鸣器叫,再次按下,停 按键3按下,风扇转,再次按下,停 头文件 #ifndef __CTRL_KEY_H__ #define __CT…

Learning Sample Relationship for Exposure Correction 论文阅读笔记

这是中科大发表在CVPR2023的一篇论文,提出了一个module和一个损失项,能够提高现有exposure correction网络的性能。这已经是最近第三次看到这种论文了,前两篇分别是CVPR2022的ENC(和这篇文章是同一个一作作者)和CVPR20…

cap分布式理论

cap 理论 cap是实现分布式系统的思想。 由3个元素组成。 Consistency(一致性) 在任何对等 server 上读取的数据都是最新版,不会读取出旧数据。比如 zookeeper 集群,从任何一台节点读取出来的数据是一致的。 Availability&…

Unity基于C#事件委托机制

事件委托是一种用于实现观察者模式的设计模式,它允许对象在发生特定事件时通知其他对象。在Unity中,事件委托机制为开发者提供了一种简单而有效的方式来处理游戏中的事件和交互。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的…

解决方案 | 法大大电子签精准击破销售场景签约难题

新商业形态及新交易模式不断涌现,电子签已经成为现代商业活动中不可或缺的一部分。特别是在销售场景中,电子签的应用不仅可以提高销售效率,还可以降低成本,提高客户满意度。本文将详细分析电子签在销售场景中的应用价值能力&#…

快速解决“找不到msvcr120.dll无法执行代码”问题,总结5解决方法

计算机已经成为我们生活和工作中不可或缺的一部分。然而,在使用计算机的过程中,我们常常会遇到各种问题,其中之一就是找不到msvcr120.dll文件。这个问题可能会可能导致计算机程序软件,游戏无法正常运行,影响到我们的工…

(十四)VBA常用基础知识:当前excel文件所有sheet循环,获取sheet名,获取最大行数最大列数

获取当前excel的所有sheet以及sheet名 Sub test()Dim ws As WorksheetFor Each ws In Worksheetsws.ActivateDebug.Print ws.NameNext ws End Sub 输出结果: Sheet1 Sheet2 Sheet3 Sheet4 Sheet52.获取最大行数 首先要明白取最大行的方式,为什么这样取…

ceph 分布式存储与部署

目录 一、存储基础: 1.单机存储设备: 2. 单机存储的问题: 3. 商业存储解决方案: 4. 分布式存储: 5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构&#xff1a…

01 时钟配置初始化,debug

1. 开启debug series,否则只能下载一次,再次下载要配置boot 2.f0外部时钟配置 h750 配置 实测可用

FPGA面试题(1)

一.FPGA内部结构 可编程I/OPLL锁相环(其作用为:分频,倍频,相位调节、占空比)逻辑阵列块LAB(每个LAB由16个逻辑器件LE组成,每个LE包括一个查找表LUT和一个RAM构成。Cyclone IV EP4CE6F17C8中包含…

【Spring AOP】统一异常处理

统一异常处理 统⼀异常处理使⽤的是 ControllerAdvice ExceptionHandler 来实现的, 类上面加上 ControllerAdvice 注解表示控制器通知类方法上面加上 ExceptionHandler 表示异常处理器,并添加异常返回的业务代码 两个结合表示当出现异常的时候执⾏某个…

Android终极大招之全面取代drawble文件实现View圆角背景样式的新方案

简介 最近一直忙于音视频SDK的开发,遇到很多问题,简单来说,就是怎么让别人接入SDK时越简单越好。相信大多数Android开发都会遇到一个场景,给TextView或Button添加背景颜色,修改圆角,描边等需求。一看到这样…

React 组件传 children 的各种方案

自定义组件的时候往往需要传 children,由于写法比较多样,我就总结了一下。 方案列表 1. 类组件1.1 类组件,不使用解构1.2 类组件,使用解构 2. 函数组件2.1 函数组件,不使用解构2.2 函数组件,外部解构2.3 函…

docker 登录本地仓库harbor问题

1、报错如下: 添加目标harbor 仓库的hosts vim /etc/hosts 2、报错如下: 添加修改/etc/docker/daemon.json文件中的 insecure-registries vim /etc/docker/daemon.json 然后 systemctl daemon-reload systemctl restart docker再次登录

HQChart实战教程66-动态调整HQChart布局大小

HQChart实战教程66-动态调整HQChart布局大小 需求小程序h5AppHQChart插件源码地址 需求 在不销毁hqchart实例的情况下,动态调整K线图或分时图的大小, 如下图,把图1的K线图大小调整为图2的大小 图1 图2 小程序 调整画布大小,并…

(c语言进阶)指针的进阶

一.字符指针 1.一般应用 (1)%c的应用 (2)%s的应用 字符指针没有权限通过解引用去改变指针指向的值 2.笔试题 题目:判断输出结果 int main() { const char* p1 "abcdef"; const char* p2 "…

前端开发工具vscode

一、下载安装 https://code.visualstudio.com/ 二、安装插件 三、使用 ①、创建一个空目录 ②、利用vscode工具打开该目录 ③、将该目录设置为工作区 在工作区中添加文件,还可以进行浏览器访问(提前安装了Live Server插件) 为工具…

Dubbo-SPI机制

1、Java的SPI机制 SPI的全称是Service Provider Interface,是JDK内置的动态加载实现扩展点的机制,通过SPI可以动态获取接口的实现类,属于一种设计理念。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的…