docker集装箱内的长期连接间歇性死亡

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

以下是运行映像的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 

我已经看到了人们遇到长寿命连接死亡的问题,因为其他容器的启动和停止,最终导致主机上所有容器的networking丢失。 我试图通过手动启动和停止其他容器在kubernetes之外重现此场景,但无法重现连接失败。

我有一个理论认为,由于主机上长tcp_keepalive_timeout(默认为7200秒),我们的NAT正在捕捉连接。 为了确保在连接闲置时发送TCP保持连接的数据包,我已经大大减less了这些数据,但是这没有任何作用。 我实际上已经目睹了连接丢失在从MySQLstream多行的中间。

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