nginx ingress controller EWMA负载均衡策略工作原理及修改过程

发布时间 2023-11-06 13:56:57作者: Zhai_David

1、概念

 

EWMA(Exponentially Weighted Moving Average)策略是 NGINX Ingress Controller 中的一种负载均衡算法,它用于决定请求应该由后端服务的哪个实例处理。

 

2、工作原理

 

EWMA 策略通过指数加权移动平均的方式计算每个后端服务实例的权重,并根据权重来分配请求。

 

它的工作原理如下:

 

1. 初始化权重:当 NGINX Ingress Controller 启动或配置发生更改时,会初始化每个后端服务实例的权重。初始权重通常为相等值。

 

2. 请求分配:当收到一个请求时,NGINX Ingress Controller 使用 EWMA 策略来选择一个后端服务实例来处理该请求。

 

3. 权重计算:NGINX Ingress Controller 使用 EWMA 策略根据每个后端服务实例的权重来进行请求分配。权重计算基于指数加权移动平均的算法,其中旧的权重值以指数衰减的方式影响新的权重值。

 

  - 每个后端服务实例的权重会根据其过去的响应时间进行调整如果一个实例的响应时间较长,说明它的负载较重,权重会相应降低。

 

  - 权重计算也考虑了实例的健康状况。如果一个实例被标记为不可用或不健康,它的权重会降低甚至为零,从而不会再接收到请求。

 

4. 请求转发:根据计算得到的权重,NGINX Ingress Controller 将请求转发给具有较高权重的后端服务实例。权重较高的实例将处理更多的请求。

 

通过使用 EWMA 策略,NGINX Ingress Controller 可以根据后端服务实例的性能和健康状况来动态地分配请求,从而实现负载均衡。

 

这样,可以确保请求被均匀地分发给可用且响应时间较短的后端服务实例,提高系统的可用性和性能。

 

3、现实问题

 

服务后端有多个实例的场景。某几个实例的负载比较高,其他的实例比较空闲。

 

导致负载不均衡。

 

在目前的nginx ingress controller中,没有最小连接数的解决方案。所以,考虑通过ewma的方式,根据响应的时间来决定下一次的请求是分配哪个实例上。

 

换句话说,也可以理解根据实例负载的方式进行分发。

 

期望:负载在多个实例之间进行相对均衡。

 

4、修改方法

 

在nginx ingress controller中,通过如下的方法,修改为EWMA的负载均衡策略。

 

修改nginx ingress controller configmap:

 

查找对应的configmap

[root@nccztsjb-node-02 ~]# kubectl get configmap -n ingress-nginx | grep ingress-nginx
ingress-nginx                 19     58d
ingress-nginx-logrotate       1      58d
ingress-nginx-logrotate-env   1      58d
[root@nccztsjb-node-02 ~]# 

 

 

修改configmap

kubectl edit cm -n ingress-nginx ingress-nginx

 

 

加入如下的配置:

load-balance: "ewma"
 

加到如下的位置:

 

esc -> :wq

保存,退出。

 

重启ingress controller服务

[root@nccztsjb-node-02 ~]# kubectl get po -n ingress-nginx 
NAME                             READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-qs5

 

kubectl delete po -n ingress-nginx nginx-ingress-controller-qs546
 

当pod是running的时候,表示服务已经启动OK,可以对外提供服务。

 

[root@nccztsjb-node-02 ~]# kubectl get po -n ingress-nginx 
NAME                             READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-99589   2/2     Running   0          23s
[root@nccztsjb-node-02 ~]#