常识: 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-robin和least-connected 两个线程一起调用的时候用kubectl top pod 查看是只有一个pod在运行所有请求

使用第三个即ip-hash 的时候, 会有两个pod一起干活

ok 至此算是勉强达到我们的目标, 这只是现象,具体原因还有具体调查.
现在的解决方案是, 如果要大批量数据运行, 就用ip-hash策略, 同时启动多线程访问, pod有几个,开几个多线程.
文章讲述了在自建的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共同处理请求,以适应批量数据运行的场景。
1108

被折叠的 条评论
为什么被折叠?



