k8s网络诊断之记一次ingress websocket长链接被断开的问题排查

简介: 某用户反馈通过ingress建立的websocket长链接,总是会被断开,影响他们的研发平台的使用,导致业务上线受阻

背景信息:

        某用户反馈通过ingress建立的websocket长链接,总是会被断开,影响他们的研发平台的使用,导致业务上线受阻


思考:

1,ingress是7层的代理,客户端的请求到业务pod时,至少是两段请求

client <--> ingress  ingress <--> app pod

2,正常fin结束会话一般都是程序主动,要证明这个问题结合第一条做两段抓包,在ingress上抓客户端建联 以及ingress到后端业务pod的建联报文

3,websocket是否有特殊设置?

分析问题:

先抓包,然后登陆ingress controller的pod里面观察流量在哪个pod里面

客户端连接过来后会起(或者复用)一个连接去后端业务的8082端口

抓包条件可以设置为 客户端真实ip 以及8082端口

tcpdump -i any host 58.34.83.130 or port 8082 -s0 -w c2i2p.pcap

分析报文:

客户端抓包

ingress入方向抓包

ingress去后端业务pod方向抓包

客户端到slb  slb到ingress  ingress到业务pod,是ingress 即发给业务pod finack 又发给前端finack

实锤ingress controller关闭的连接,那么有哪些参数可以影响链接的关闭?

proxy-read-timeout

proxy-send-timeout

worker_shutdown_timeout

调整以上参数后 断开的时间似乎有所延长,从十来分钟增长到15分钟左右,不满足客户预期,继续分析

开启ingress controller debug日志继续分析:

configmap里面添加该配置

error-log-level: debug

开启日志后复现继续分析

开启debug后,从建联的连接上入手找到处理这个session的线程往下分析,中间的数字 一个是nginx worker id 一个是 connection id  

从日志看到最近一次请求到了函数ngx_http_terminate_request -- ngx_http_upstream_cleanup  -- ngx_http_upstream_finalize_request --ngx_http_upstream_free_keepalive_peer  看不到调用方

既然看不到调用方,升级版本行不行?

尝试使用1.x版本的ingress controller ,依然会有断开的情况


视线重新回到keepalive上,怀疑用户的应用keepalive没生效或者设置有问题,但是从抓包看 间隔15秒的keepalive 很规律,也都有回复

考虑从系统层面做keepalive的优化试试

net.ipv4.tcp_keepalive_intvl = 30   保活间隔30秒

net.ipv4.tcp_keepalive_probes = 90 总共保活九十次

net.ipv4.tcp_keepalive_time = 60      连接空闲60s后开启保活


增加系统级别的优化后 有所好转延长至2小时以上,但是还会时不时断开

与用户协商后,升级生产环境到1.x,使用内核优化参数,长链接依然频繁断开


继续分析,发现出问题时,ingress的连接存在shutdown的状态

worker_shutdown_timeout 超时后强制关闭对应的worker上的连接

Configures a timeout for a graceful shutdown of worker processes. When the time expires, nginx will try to close all the connections currently open to facilitate shutdown.

触发条件:

nginx reload  即 configmap 以及 ingress的增删改 。。。


一顿debug猛如虎,一看结果两块五

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
11月前
|
Kubernetes 数据安全/隐私保护 容器
K8s中Flannel网络插件安装提示forbidden无权限的解决方法
总的来说,解决“forbidden无权限”的问题,需要从权限和配置两个方面来考虑。只有当用户或者服务账户有足够的权限,且Flannel的配置文件设置正确,才能成功地安装Flannel。希望这个解答能够帮助你解决问题。
476 13
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
493 12
|
域名解析 运维 网络协议
网络诊断指南:网络故障排查步骤与技巧
网络诊断指南:网络故障排查步骤与技巧
7435 7
|
网络协议 Linux
使用nmcli命令设置IP地址并排查网络故障
nmcli 是一个功能强大的网络管理工具,通过它可以轻松配置IP地址、网关和DNS,同时也能快速排查网络故障。通过正确使用nmcli命令,可以确保网络配置的准确性和稳定性,提高系统管理的效率。希望本文提供的详细步骤和示例能够帮助您更好地掌握nmcli的使用方法,并有效解决实际工作中的网络问题。
1385 2
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
1235 7
|
存储 缓存 网络协议
网络丢包排查方法
网络丢包排查方法
1428 7
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
729 0
|
Kubernetes 网络协议 网络安全
在K8S中,容器提供一个服务,外部访问慢,到底是容器网络问题?还是容器服务问题?这种怎么排查?
在K8S中,容器提供一个服务,外部访问慢,到底是容器网络问题?还是容器服务问题?这种怎么排查?
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?