Docker容器内的长期连接间歇性地死亡

时间:2017-08-04 18:14:16

标签: sockets docker networking kubernetes

我在kubernetes中运行了一个docker镜像,它使用了一个Python应用程序,它使用了与MySQL的长期连接。由于底层套接字在看似随机的时段之后失去与外部主机的连接,因此连接将死亡。典型的持续时间在10到30分钟之间。我已在我的生产环境(kubernetes外部)本地和其他地方测试了这个docker容器,而没有遇到任何连接错误。

以下是运行图像的docker版本和uname输出:

$ docker --version
Docker version 1.12.6, build 78d1802

$ uname -a
Linux c1b1f31a4048 3.13.0-123-generic #172-Ubuntu SMP Mon Jun 26 18:04:35 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

以下是主机的uname输出:

Linux ip-10-2-110-119 4.4.41-k8s #1 SMP Mon Jan 9 15:34:39 UTC 2017 x86_64 GNU/Linux

我已经看到人们因长时间连接因其他容器启动和停止而死亡的问题,最终造成主机上所有容器的网络丢失。我试图通过手动启动和停止其他容器来重现kubernetes之外的这种情况,但无法重现连接失败。

由于主机上的tcp_keepalive_timeout很长(默认情况下为7200秒),我有一个理论认为我们的NAT正在捕捉连接。我已大幅减少以确保在连接空闲时发送TCP keepalive数据包,但这没有任何影响。我实际上目睹了在从MySQL传输许多行的过程中连接丢失。

是否应该使用特定的网络配置来确保长期连接不会在此环境中死亡?

0 个答案:

没有答案