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

news2024/11/19 6:18:43

在一次内部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.coloradmin.cn/o/1081837.html

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

相关文章

linux开发环境下出现Segmentation fault问题排查一

一、检测代码中是否有数组越界情况 更改以上数组为128*60后,正常。确认是数组溢出导致越界。 二、分析:一般情况下打印的字符刚好在50以内,但是在其它状态下测试,数据字符数据增加从而导致溢出 打印命令如下: sprin…

2.线性表——数据结构学习

零个或多个数据元素的有限序列。 有序 (每个元素有且只有一个前驱与后继) -> 一对一的关系 前驱 (第一个元素无前驱)后继(最后一个元素无后继) 有限 线性表元素个数:n (n ≥ \geq ≥ 0)&a…

D1s芯片启动流程(BROM System)分析

1、D1S芯片介绍 2、BROM介绍 (1)BROM(boot rom):存放启动代码的ROM,该ROM一般在芯片内部集成,是芯片上电执行的最开始代码; (2)BROM里存放的程序主要功能&…

【Java 进阶篇】JavaScript 介绍及其发展史

JavaScript是一门广泛应用于Web开发的编程语言。它是一种高级的、解释性的脚本语言,主要用于改善用户与Web页面的互动体验。本篇博客将为你详细介绍JavaScript的基础知识、历史背景和它在Web开发中的重要作用。我们还将讨论JavaScript的发展史,从它的起源…

9. 一个SpringBoot项目运行

新手如何运行一个SpringBoot项目 1.SpringBoot项目运行 新创建的SpringBoot项目如何运行 2.启动lombok注解 点击该按钮,启动lombok注解支持 3.展示说明

进阶JAVA篇-Object类与Objects类、包装类的常用API(一)

目录 API 1.0 API概念 2.0 Object类的常用API 2.1 Object 中的 tostring() 方法 表示返回对象的字符串表达形式 2.2 Object 中的 equals(Object o) 方法 ,判断两个对象的是否相等 2.2.1深入了解如何重写Object 中的 equals(Object o) 方法 2.2.2 对重写Object 中的…

html css实战之学成在线项目

html css实战之学成在线项目 项目链接:https://download.csdn.net/download/weixin_39451323/88416213 效果图:

4年测试经验,面试却突破不了20K,真是太卷了····

先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。 现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试&am…

【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Prompt Encoder

论文:Segment Anything   代码:https://github.com/facebookresearch/segment-anything 上一篇:【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Image Encoder 本篇示例依然采用上一篇的狗狗图像运行代…

深度学习笔记之优化算法(八)Adam算法的简单认识

深度学习笔记之优化算法——Adam算法的简单认识 引言回顾:基于Nesterov动量的RMSProp算法Adam算法的简单认识一阶矩、二阶矩修正偏差的功能Adam的算法过程描述Adam示例代码 引言 上一节介绍了基于 Nesterov \text{Nesterov} Nesterov动量与 RMSProp \text{RMSProp}…

文字与视频结合效果

效果展示 CSS 知识点 mix-blend-mode 属性的运用 实现整体页面布局 <section class"sec"><video autoplay muted loop><source src"./video.mp4" type"video/mp4" /></video><h2>Run</h2><!-- 用于切…

【Java 进阶篇】JavaScript 与 HTML 的结合方式

JavaScript是一种广泛应用于Web开发中的脚本语言&#xff0c;它与HTML&#xff08;Hypertext Markup Language&#xff09;结合使用&#xff0c;使开发人员能够创建交互式和动态的网页。在这篇博客中&#xff0c;我们将深入探讨JavaScript与HTML的结合方式&#xff0c;包括如何…

Web知识:markupsafe.escape() 函数的作用

1、markupsafe.escape() 函数是 MarkupSafe 库中的一个函数&#xff0c;它的作用是对字符串进行 HTML 转义&#xff0c;以防止在 HTML 文档中引起意外的解析结果或安全漏洞。 2、在 Web 开发中&#xff0c;如果用户提供的数据直接插入到 HTML 页面中&#xff0c;而没有经过转义…

SpringBoot调用存储过程(入参,返参)(亲测有效!!!)

存储过程和函数是有区别的&#xff01;&#xff01;&#xff01; 创建函数&#xff0c;只是演示&#xff0c;以下函数不完整&#xff01;&#xff01;&#xff01;(只是看P_xxx参数) CREATE OR REPLACE PROCEDURE SP_TICKET_CHECKE_ONLINE_TEST (p_transcode IN OUT VA…

Java反射获取抽象类方法属性问题讲解

Java反射获取抽象类方法属性问题讲解 结论一、案例准备二、测试方法&#xff1a;使用反射获取抽象类私有方法和私有属性具体操作&#xff08;获取私有方法&#xff09;具体操作&#xff08;获取私有属性&#xff09; 结论 Java 通过反射可以获得抽象类的任何修饰符&#xff08…

Vue2 Watch的语法

Watch语法 一、监听普通数据类型&#xff08;1&#xff09;把要监听的msg值看作方法名&#xff0c;来进行监听。&#xff08;2&#xff09;把要监听的msg值看作对象&#xff0c;利用hanler方法来进行监听 二、监听对象&#xff1a;&#xff08;1&#xff09;监听对象需要用到深…

LeetCode【300】最长递增子序列

题目&#xff1a; 思路&#xff1a; 通常来说&#xff0c;子序列不要求连续&#xff0c;而子数组或子字符串必须连续&#xff1b;对于子序列问题&#xff0c;第一种动态规划方法是&#xff0c;定义 dp 数组&#xff0c;其中 dp[i] 表示以 i 结尾的子序列的性质。在处理好每个…

1808_ChibiOS基本的架构介绍

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 简单看了一下ChibiOS的架构介绍&#xff0c;感觉这种OS以及组件非常适合快速构建一个应用。这里做一个简单的资料整理。。 1. 不同于其他的OS&#…

TCP/IP(九)TCP的连接管理(六)TIME_WAIT状态探究

一 TIME_WAIT探究 要明确TIME_WAIT状态在tcp四次挥手的阶段 ① 为什么 TIME_WAIT 等待的时间是 2MSL? 背景&#xff1a; 客户端在收到服务端第三次FIN挥手后,就会进入TIME_WAIT 状态,开启时长为2MSL的定时器1、MSL 是 Maximum Segment Lifetime 报文最大生存时间2、2MSL…

4.(vue3.x+vite)style动态绑定的方式

前端技术社区总目录(订阅之前请先查看该博客) 效果浏览 代码如下: <template><div><div :style="{