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

cca*_*rso 5 sockets networking docker 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
Run Code Online (Sandbox Code Playgroud)

以下是主机的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
Run Code Online (Sandbox Code Playgroud)

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

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

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