一、背景
笔者在项目上用apisix网关limit-count插件对接口限流时,发现在k8s环境下,用nodeport 请求接口,无法按客户端IP进行限流。
实验环境如下:
k8s版本 1.19.3
apisix版本 3.2.2
路由配置了limit-count插件
"limit-count":{"count":3,"time_window":60,"policy":"local"}
期望:
每个客户端均可以在1分钟的限流窗口内访问三次。
现状:
在某客户端请求三次后被限流,在此限流期之中,其他客户端也均被限流。
二、原因分析
先说结论,k8s nodeport的external-traffic-policy属性可以设置成 Cluster 或者 Local。
Cluster:当设置为 Cluster 时,。kube-proxy会做SNAT改写,此时客户端源ip会被改写为节点的ip。
Local:当设置为 Local 时,kube-proxy会保留源IP。
k8s nodeport service 默认是采用Cluster,客户端源ip会被改写为节点的ip。而apisix需要通过对源客户端ip进行计数(感兴趣可以读读源码ÿ