macOS环境Docker容器内curl访问BigQuery偶发无限挂起问题
macOS端Docker Ubuntu容器访问bigquery.googleapis.com偶发挂起故障
故障基本情况
本地macOS主机上运行的ubuntu:20.04版本Docker容器中,执行curl bigquery.googleapis.com命令时偶发无限挂起故障;相同命令在macOS宿主机、生产环境中均可正常执行(返回404状态码)。出现故障的容器内部署的是Python Flask应用。
已确认故障特征
- 故障具备随机性:容器刚启动时
curl bigquery.googleapis.com可正常访问,间隔约10分钟后再次执行就会挂起;后续命令可能自行恢复正常,恢复时curl -v输出显示尝试连接的是与故障时段不同的IP地址。 - 生产环境、所有宿主机本机环境均未复现该问题。
- 团队不同成员遇到故障的时间不固定,故障发生时对应的目标IP也不相同。
- 故障发生期间,容器访问其他谷歌服务(例如执行
curl servicemanagement.googleapis.com)可正常连通。 - 故障发生期间,使用其他镜像启动的Docker容器内执行相同curl命令可正常运行。
- 多个版本的macOS端Docker均出现过该故障。
- 直接curl请求解析得到的IPv4地址时同样会出现挂起。
核心异常现象
故障发生时存在TCP连接状态不一致问题:
- 在宿主机执行
netstat查看连接状态,显示对应连接为ESTABLISHED状态 - 在容器内部执行
netstat则显示连接处于SYN_SENT状态
初步判断故障方向为:宿主机侧的连接被保持存活,但容器侧的连接被中断;或是由于某些原因,部分ACK报文没有被正确转发到容器内部。
已采集排查证据
macOS宿主机netstat结果

容器内netstat结果

TCP抓包结果

curl -v执行输出
root@cf8bd850e9ab:/code# curl -v bigquery.googleapis.com * Trying 142.251.35.170:80... * TCP_NODELAY set * Trying 2607:f8b0:4006:81e::200a:80... * TCP_NODELAY set * Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address * Trying 2607:f8b0:4006:81e::200a:80... * TCP_NODELAY set * Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address * Trying 2607:f8b0:4006:81e::200a:80... * TCP_NODELAY set * Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address * Trying 2607:f8b0:4006:81e::200a:80... * TCP_NODELAY set * Immediate connect fail for 2607:f8b0:4006:81e::200a: Cannot assign requested address
其他补充排查结果
netstat -p全量输出已留存curl --ipv4执行输出已留存
内容的提问来源于stack exchange,提问作者Toby Mellor
相关产品推荐
相关产品推荐

