您现在的位置是:首页 >技术交流 >给k8s集群添加负载均衡的能力网站首页技术交流

给k8s集群添加负载均衡的能力

wangduqiang747 2024-06-15 06:31:11
简介给k8s集群添加负载均衡的能力

常识: k8s没有自带负载均衡能力, 需云服务提供商来做负载均衡, 或者自己装负载均衡控制器. 负载均衡控制器有很多, 这次装Ingress-Nginx

https://kubernetes.github.io/ingress-nginx/

文档里根据环境有很多安装方式,不要用quick start的,因为那是云环境下的.
我们的k8s是自己的服务器上搭建的, 用

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

然后就发现ok了, 原来的nodeport的服务, 只能指定某个node, 且请求就是在那个node执行的, (没有负载均衡,同node内的多pod应该是网络层的负载均衡 见下面的文章 )
装了之后请求到某个node后,请求会被路由到其他node, 就像docker swarm做的一样,至此基本能力已经具备.

有个小问题, 因为浏览器访问会带keepalive的header, 所以会连续命中某个pod, 而 curl就不会, 因为curl是不带keepalive的.正如下面文章的解释:

https://itnext.io/inspecting-and-understanding-service-network-dfd8c16ff2c5

这会是个问题,因为我们是会某个机器发出很多请求到集群.
那就要试试修改 Ingress-Nginx 的Config Map ,调整负载均衡策略, 看能不能达到想要的效果.(姑且不管这个需求合不合理)
如何修改config map:

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/configmap.md

其中找到了
在这里插入图片描述
要改的就是这个字段, 第三列的默认值, 确实轮询是基本的
点进去之后
在这里插入图片描述
说的annotation是部署的时候的一些值,
见:

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md

也就是yaml里的 kind: Ingress 那部分的设置 先不看, 先看全局的

ok 验证下来,当前最新版本即registry.k8s.io/ingress-nginx/controller:v1.7.1
虽然文档上说只有两个取值, 要么默认的round_robin 要么还不知道是什么的ewma
但,

https://nginx.org/en/docs/http/load_balancing.html

的三个复杂均衡策略, 是都可以用的,
其中前两个, 即round-robinleast-connected 两个线程一起调用的时候用kubectl top pod 查看是只有一个pod在运行所有请求
在这里插入图片描述

使用第三个即ip-hash 的时候, 会有两个pod一起干活
在这里插入图片描述

ok 至此算是勉强达到我们的目标, 这只是现象,具体原因还有具体调查.

现在的解决方案是, 如果要大批量数据运行, 就用ip-hash策略, 同时启动多线程访问, pod有几个,开几个多线程.

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。