Kubernetes nodeport 并发连接限制

Posted

技术标签:

【中文标题】Kubernetes nodeport 并发连接限制【英文标题】:Kubernetes nodeport concurrent connection limit 【发布时间】:2019-05-16 07:17:37 【问题描述】:

我正在使用 AWS EKS 运行 Kubernetes。我正在为 nodeport 服务执行一些负载测试,并在访问 pod 未运行的节点时看到 ~16k-20k 的并发连接限制。我想知道是否有某种方法可以增加并发连接数。

所以我正在运行一个 nodeport 服务,它只在节点 A 上安排了 1 个 pod。我正在运行的负载测试尝试连接尽可能多的并发 websocket 连接。 websocket 只是休眠并每 30 秒发送一次心跳以保持连接处于活动状态。

当我将负载测试器 (tsung) 指向节点 A 时,在 pod 被 OOMKilled 之前,我可以获得超过 65k 的并发 websocket,因此内存是限制因素,这很好。真正的问题是当我将负载测试器指向节点 B,并且 kube-proxy 的 iptables 将连接转发到节点 A 时,突然之间,在连接开始停止之前,我只能获得大约 16k-20k 的并发 websocket 连接。根据 netstat,他们陷入了SYN_SENT 状态。

netstat -ant | awk 'print $6' | sort | uniq -c | sort -n
...
20087 ESTABLISHED
30969 SYN_SENT

我能想到的唯一要检查的是我的 conntrack 限制,它看起来没问题。这是我从节点 B 得到的。

net.netfilter.nf_conntrack_buckets = 16384
net.netfilter.nf_conntrack_max = 131072
net.nf_conntrack_max = 131072 

这是端口范围。我不确定这是否重要(我不确定 DNAT 和 SNAT 是否用完端口),但范围似乎远高于 16k。

net.ipv4.ip_local_port_range = 32768    60999

节点 A 和节点 B 的文件描述符限制和内核 TCP 设置相同,所以我认为排除了它们。

还有什么可以限制通过 iptables/netfilter 转发的并发连接数吗?

【问题讨论】:

【参考方案1】:

在访问 pod 未运行的 NodePort 时,性能总是会变差。本质上,您的数据包会通过额外的跃点尝试(通过 iptables)到达其最终目的地。

我建议为您的NodePort 服务使用source IP。基本上,用这个来修补你的服务:

$ kubectl patch svc <your-service> -p '"spec":"externalTrafficPolicy":"Local"'

然后让您的负载均衡器仅将流量转发到正在服务流量的 NodePort。

或者,如果您想考虑性能更好的东西,您可以考虑使用代理模式 ipvs 或类似 BPF/Cillium 的方式作为叠加层。

【讨论】:

感谢 Rico 的建议!我当然可以理解为什么通过节点端口会像您描述的那样延迟更高,但我对它为什么会减少并发连接数感到困惑。您知道为什么会发生这种情况吗? 同样的事情,你的集群中的节点会发生更多的连接,从没有运行 pod 的节点到运行 pod 的节点。

以上是关于Kubernetes nodeport 并发连接限制的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 kubernetes nodeport 服务

KUBERNETES04_Service服务ClusterIPNodePort方式Ingress域名访问路径重写限流操作

KUBERNETES04_Service服务ClusterIPNodePort方式Ingress域名访问路径重写限流操作

SuSE 上的 Kubernetes:NodePort 服务问题

Kubernetes NodePort 自定义端口

理解Kubernetes的NodePort、LoadBalancer和Ingress