Kubernetes - service负载不均衡???
之前在测试部署的几个容器POD的服务情况,发现模拟数据永远只会发送到某一个pod上,而另外一个副本却是很空闲,一点负载都没有,最后直至把这个pod的内存跑满直至挂掉,另外一个副本也不跑数据,真的是“旱的旱死,涝的涝死”。
后面通过Grafana+Promethus来监控pod的CPU和Memory,发现服务的内存一直飙升,之前还以为是压力不够负载的级别才没有将数据分发到另外一个副本,看来跟启动的服务关系不大;
忽然想起来是不是因为我的service配置的问题,是不是应该访问pod的内部服务名,而不应该访问其服务的对外IP?修改后却没有什么变化,为什么呢???
在随手打开写的service的配置文件里,忽然发现一个有意思的单词“sessionAffinity”,恩?“会话关联”?什么鬼?
负载分发策略
目前kubernetes提供了两种负载分发策略:RoundRobin和SessionAffinity
RoundRobin:轮询模式,即轮询将请求转发到后端的各个Pod上
SessionAffinity:基于客户端IP地址进行会话保持的模式,第一次客户端访问后端某个Pod,之后的请求都转发到这个Pod上
默认是RoundRobin模式
在某些场景中,开发人员希望自己控制负载均衡的策略,不使用Service提供的默认负载,kubernetes通过Headless Service的概念来实现
而我的service里面的配置是这样的:
apiVersion: v1
kind: Service
metadata:
name: http-server
labels:
app: http-server
spec:
type: NodePort
sessionAffinity: ClientIP
ports:
- port: 12222
name: http-server-port
nodePort: 31222
selector:
app: http-server
---
注释掉了sessionAffinity参数,就OK啦!