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

文章讲述了在自建的Kubernetes集群上,如何通过Ingress-Nginx控制器实现负载均衡。默认的nodeport服务不具备负载均衡能力,安装Ingress-Nginx后,请求可以被路由到不同node上的pod。作者发现浏览器的keepalive特性可能导致连续命中同一pod,而curl不会。通过调整Ingress-Nginx的ConfigMap,特别是load-balance策略(如round-robin、least-connected、ip-hash),可以改变这种行为。最终,使用ip-hash策略确保了多个pod共同处理请求,以适应批量数据运行的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常识: 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有几个,开几个多线程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值