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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
Ubuntu Windows
【Ubuntu/Arm】Ubuntu 系统如何链接有线网络(非虚拟机)?
【Ubuntu/Arm】Ubuntu 系统如何链接有线网络(非虚拟机)?
|
2月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
26天前
|
运维 Kubernetes Cloud Native
探索Kubernetes的大二层网络:原理、优势与挑战🚀
在云原生领域,Kubernetes (K8s) 已经成为容器编排的事实标准☁️📦。为了支撑其灵活的服务发现和负载均衡🔍🔄,K8s采用了大二层网络的设计理念🕸️。本文将深入探讨大二层网络的工作原理、带来的好处✨,以及面临的挑战和解决方案❗🛠️。
探索Kubernetes的大二层网络:原理、优势与挑战🚀
|
1月前
|
存储 Kubernetes 调度
k8s常见的排错指南Node,svc,Pod等以及K8s网络不通问题
k8s常见的排错指南Node,svc,Pod等以及K8s网络不通问题
138 1
|
3天前
|
Kubernetes API 调度
|
21天前
|
JSON Kubernetes 网络架构
Kubernetes CNI 网络模型及常见开源组件
【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型
|
1月前
|
Kubernetes 应用服务中间件 nginx
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
提升CKA认证成功率:Kubernetes Ingress七层代理全攻略!
25 0
|
1月前
|
Kubernetes 应用服务中间件 数据安全/隐私保护
k8s 网络策略揭秘:CKA认证必备的网络知识全解析
k8s 网络策略揭秘:CKA认证必备的网络知识全解析
22 0
|
1月前
|
Kubernetes 网络协议 Perl
K8s网络不通Calico网络不通flannel网络不通
K8s网络不通Calico网络不通flannel网络不通
28 4
|
2月前
|
Kubernetes Shell Docker
K8S核心插件-Flannel网络插件
K8S核心插件-Flannel网络插件
49 0