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