在我的 kubernetes 集群中,每个节点运行许多小型 pod(大约 30 个),每个 pod 会创建一些 TCP 连接,连接到互联网上的单个服务,以向其发送 HTTP 请求。因此,集群中的每个节点在任何时间点可能都有大约 60 个与服务的连接。
我需要做些什么来优化这个传出连接数吗?例如,将反向代理作为守护进程运行并连接到反向代理而不是直接连接到互联网上的服务是否有帮助?我是否需要更改 k8s 节点上的某些设置以允许那么多传出连接?或者当前设置本身就很好,不需要任何优化?
我之所以问这个问题,是因为有时候从 pod 到互联网上的服务的 TCP 连接需要很长时间才能建立,但是在集群外运行的其他应用程序连接到该服务时没有问题。
答案1
为了管理 K8s 集群中大量到外部服务的出站连接,您可能需要改进设置。每个节点 (30) 都拥有大量通过 TCP 连接连接到单个外部服务的小型 Pod,每个节点总共约有 60 个连接。您发现这些 Pod 需要很长时间才能连接。
连接缓慢的可能原因:
每个节点的大量连接可能会给资源带来负担并延迟连接的形成。每个 pod 创建自己的连接可能会导致开销和效率低下。
是的,推荐的方法是反向代理:
使用反向代理是有效管理大量传出连接的一般推荐方法。它可以集中管理连接并减少单个 pod 的开销。请参阅 Radware 文章反向代理更多细节。
- 在每个节点上安装一个反向代理,例如 HAproxy 或 NGINX,作为守护进程集。
- 设置 pod,以便它们链接到内部反向代理而不是外部服务。
- 远程服务的连接池由反向代理管理。减少连接总数并提高生产效率。
替代方法是连接池:
考虑在 Pod 中使用库来实现要连接的特定服务的连接池。这些库可以重复使用现有连接,从而减少频繁建立新连接的需求。请参阅 Michael Aboagye Stackoverflow 博客连接池更多细节。
如果您使用连接池库,请确保与您的编程语言和您要连接的服务兼容。
监控集群性能和连接时间,分析与网络流量和资源使用情况相关的指标以衡量有效性。