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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 某用户反馈通过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搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
Kubernetes 负载均衡 网络安全
Kubernetes 网络模型与实践
【8月更文第29天】Kubernetes(K8s)是当今容器编排领域的佼佼者,它提供了一种高效的方式来管理容器化应用的部署、扩展和运行。Kubernetes 的网络模型是其成功的关键因素之一,它支持服务发现、负载均衡和集群内外通信等功能。本文将深入探讨 Kubernetes 的网络模型,并通过实际代码示例来展示服务发现和服务网格的基本概念及其实现。
117 1
|
3月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
1月前
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
135 7
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
477 1
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
169 0
|
2月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
158 7
|
2月前
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
108 3
Kubernetes网络插件体系及flannel基础
|
1月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
1月前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
131 0
|
3月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
148 6