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猛如虎,一看结果两块五

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
21 2
|
19天前
|
5G 数据安全/隐私保护
如果已经链接了5Gwifi网络设备是否还能搜索到其他5Gwifi网络
当设备已经连接到一个5G Wi-Fi网络时,它仍然有能力搜索和发现其他可用的5G Wi-Fi网络。这里所说的“5G Wi-Fi”通常指的是运行在5GHz频段的Wi-Fi网络,而不是与移动通信中的5G网络(即第五代移动通信技术)混淆。
|
27天前
|
域名解析 运维 网络协议
网络诊断指南:网络故障排查步骤与技巧
网络诊断指南:网络故障排查步骤与技巧
130 7
|
1月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
126 1
|
28天前
|
运维 监控 网络协议
网络诊断必备:Ping、Traceroute、Wireshark的实用技巧详解
网络诊断必备:Ping、Traceroute、Wireshark的实用技巧详解
221 0
|
2月前
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
210 7
|
3月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
226 9
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
399 0
|
2月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
2月前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
180 0

热门文章

最新文章