【问题标题】:Kubernetes nodeport concurrent connection limitKubernetes nodeport 并发连接限制
【发布时间】: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 转发的并发连接数吗?

【问题讨论】:

    标签: networking websocket kubernetes 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 的节点。
    猜你喜欢
    • 2020-07-08
    • 2020-11-06
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2014-01-31
    • 2010-10-01
    相关资源
    最近更新 更多