程序笔记   发布时间:2022-06-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【转载】解决k8s中的长连接负载均衡问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原文链接:一流铲屎官二流程序员【解决k8s中的长连接负载均衡问题】

长连接与短连接:

简介

长连接是指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接; 短连接则是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接, 其实长连接相较于通常的短连接,是长时间保持客户端与服务端的连接状态。

使用步骤

短连接的使用步骤: 建立连接→数据传输→关闭连接 长连接的使用步骤: 连接→数据传输→保持连接→数据传输→保持连接→……→关闭连接; 所以,这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,而短连接在没有数据传输时直接关闭即可。

适用场景

对于长连接来说,无疑可以帮用户省去很多TCP连接建立和关闭操作,从而节约时间。所以对于频繁请求资源的客户来说,比较适合用长连接,在长连接的应用场景下,客户端一般不会主动关闭它们之间的连接,客户端与服务端之间的连接如果一直不关闭的话,随着客户端连接越来越多,服务端的性能会受到影响;对于短连接来说,不需要虑这个问题,因为存在的连接都是有用的连接,但是如果客户请求频繁,那么在TCP的建立和关闭操作上会浪费较多的时间和带宽。 所以长连接适用于请求频繁且连接数不能太多的场景,例如数据库连接;而短连接适用于并发量大且每个客户端不会频繁操作的场景,例如网站的http服务。

当k8s遇上长连接:

问题描述

在k8s中,提供了两种方式来部署应用程序:services和Deployments,其中: Deployments描述了需要运行的应用程序的副本数量,每一个应用程序部署为一个pod,并为其分配一个IP地址; services则类似于负载均衡器,其旨在将流量分配到一组Pod。如下图所示,可以将services理解成是一个IP地址集合,每次对services发出请求时,都会从这个集合中选择其中一个IP地址并将其作为目标地址。客户端发出请求时,无需知道后端服务连接了多少个pod,也不需要知道后端pod的IP地址, 只需要将请求发送到IP地址不变的后端services地址即可。

【转载】解决k8s中的长连接负载均衡问题

但是对与services来说,其负载均衡策略存在一个问题:在客户端和其中一个后端pod建立连接后,如果这个连接没有断开,客户端就不会再和其他pod建立连接,也就是说services事实上并没有实现真正意义上的负载均衡,后端pod从而也就失去了横向扩展的能力。

解决方案

目前解决长连接负载均衡问题的方案有: 一、在客户端实现负载均衡 该方式需要修改客户端程序,这里可以根据具体需求设置一个时间值或者请求量的值,当建立的长连接超过时间阈值或者请求量阈值时,断开连接,再与服务端重新建立连接,从而实现负载均衡; 二、在服务端实现负载均衡 该方式需要修改服务端程序,这里可以根据具体需求设置一个时间值或者请求量的值,当建立的长连接超过时间阈值或者请求量阈值时,断开连接,客户端会再与服务端建立连接,从而实现负载均衡; 三、使用服务网格实现负载均衡 service mesh 其中一个关键功能是负载均衡,具体可参相关文档; 四、通过nginx实现负载均衡 对于这种方式,在k8s中有较为简单且方便的实现方式,即为后端pod建立一个ingress,通过配置均衡策略将请求转发到后端pod,默认是轮询策略,经过实验验证,ingress确实可以实现长连接的负载,注意需要确保nginx配置里有proxy_http_version 1.1,因为http长连接的支持是从1.1版本后才有的。

大佬总结

以上是大佬教程为你收集整理的【转载】解决k8s中的长连接负载均衡问题全部内容,希望文章能够帮你解决【转载】解决k8s中的长连接负载均衡问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。