我们目前有一个 kubernetes 集群(使用 calico),其中所有工作节点都通过 lacp 绑定连接在一起(2x10GB 链接,LACP 模式 4 - 802.3ad)。
但是,我们设法在 2 个 pod 之间获得的最大吞吐量是 10 GB/s。根据一些文档,我们应该能够达到 20 GB/s。根据wikipedia,这似乎是一种正常行为:
这将分别为每个目标 MAC 地址、IP 地址或 IP 地址和端口组合选择相同的 NIC 从站
这导致理解只有一个链接用于给定的目标 IP + 端口组合。
我的问题如下:我们是否应该能够在 pod 之间达到 20 GB/s 的吞吐量?或者我们卡在 10 GB/s 是正常的吗?
这不是 Kubernetes 特有的,这是 LACP 的正常行为。它并没有提供真正的吞吐量增加,而是它的作用更好地描述为“连接的确定性分布”(不是单个数据包)和容错。
它从数据包中提取一些标头字段(由模式确定)并对它们进行哈希处理。例如,散列模式“layer3+4”获取 OSI 第 3 层和第 4 层信息,例如 IP 和端口。散列直接确定从哪个 LACP 分支输出此数据包。无论您选择哪种散列模式,属于同一连接的所有数据包都将散列到同一支路,因此任何单个连接都不能超过单支路吞吐量。
当另一个连接出现时,如果幸运的话,它可以使用另一个 LACP 支路。在这种情况下,两个连接将分布在分支之间,您将在主机之间获得两倍的总吞吐量。这不能保证:可能会发生它们都通过同一条腿路由。但是,当你有很多连接时(通常是当我们考虑收敛集群时),平均来说两条腿都会被利用。
如果您愿意,我可以将其与 Kubernetes 进行比较。如果您添加节点(并相应地扩展部署),您可以增加集群可以服务的客户端数量。但是您无法通过这种扩展(如果集群没有过载)来改善特定请求的响应延迟(服务时间)。