从一次APISIX限流故障窥探kube-proxy工作原理
2023-12-05 12:48:25
前言
在Kubernetes的实际生产环境中,APISIX作为一款功能强大的API网关,经常被用来作为集群的入口,为集群内的服务提供统一的访问入口、流量管理和安全防护等功能。在最近的一次故障排查过程中,我们发现了一个与kube-proxy相关的限流故障,通过对故障的深入分析,我们对kube-proxy的工作原理有了更深入的理解。
故障现象
在一次灰度发布过程中,我们对APISIX进行了一次限流规则的调整,将对某一特定服务的请求限流在每秒100次以内。然而,在调整限流规则后,我们发现实际的请求流量并没有受到任何限制,服务仍然能够处理每秒数百个请求。
故障排查
为了找出故障的原因,我们首先检查了APISIX的配置,确保限流规则已经正确配置。在确认APISIX的配置没有问题后,我们开始检查kube-proxy的配置。
在检查kube-proxy的配置时,我们发现了一个问题:kube-proxy的external-traffic-policy
参数被设置为cluster
,这意味着kube-proxy将对所有来自集群外部的流量进行负载均衡,而不会对集群内的流量进行任何处理。
kube-proxy工作原理
为了理解external-traffic-policy
参数对kube-proxy行为的影响,我们有必要先了解一下kube-proxy的工作原理。
kube-proxy是一个在Kubernetes集群中运行的守护进程,负责在集群中维护网络连接。它主要负责以下几个方面的工作:
- 服务发现:kube-proxy负责发现和维护Kubernetes集群中的服务。它通过监听Kubernetes API Server的事件,来及时更新服务列表。
- 负载均衡:kube-proxy负责将来自集群外部的流量负载均衡到集群内的服务上。它通过在节点上配置iptables规则或ipvs规则来实现负载均衡。
- 网络策略:kube-proxy负责在集群中实施网络策略。它通过在节点上配置iptables规则或ipvs规则来实现网络策略。
external-traffic-policy
参数
external-traffic-policy
参数决定了kube-proxy对来自集群外部的流量的处理方式。它有两种可能的取值:cluster
和local
。
- 当
external-traffic-policy
参数设置为cluster
时,kube-proxy将对所有来自集群外部的流量进行负载均衡,而不会对集群内的流量进行任何处理。 - 当
external-traffic-policy
参数设置为local
时,kube-proxy将只对来自集群外部的流量进行负载均衡,而不会对集群内的流量进行任何处理。
故障原因
在我们的案例中,external-traffic-policy
参数被设置为cluster
,这意味着kube-proxy不对集群内的流量进行任何处理。因此,当我们对APISIX进行限流规则的调整时,实际的请求流量并没有受到任何限制,服务仍然能够处理每秒数百个请求。
解决办法
为了解决这个故障,我们只需要将external-traffic-policy
参数从cluster
改为local
即可。这样,kube-proxy就会对集群内的流量进行处理,并按照我们配置的限流规则对流量进行限制。
总结
通过对一次APISIX限流故障的排查,我们对kube-proxy的工作原理有了更深入的理解。我们了解到,external-traffic-policy
参数决定了kube-proxy对来自集群外部的流量的处理方式,当external-traffic-policy
参数被设置为cluster
时,kube-proxy不对集群内的流量进行任何处理,导致我们无法对集群内的流量进行限流。通过将external-traffic-policy
参数从cluster
改为local
,我们解决了这个故障。