可观测性实战:快速定位 K8s 应用故障
故障发生在2023春节前两天,DeepFlow 团队内部访问工单系统出现问题,影响了所有北京区的同事,这篇文章将详细记录如何利用 DeepFlow 定位到对这次问题根因(网关 MSS 误变更导致报文大于 MTU,大数据报文被丢弃)。
欢迎预约由 “云原生社区” 主办,云杉网络发起的主题为《银行数字化转型可观测性实践》直播。
01、背景介绍
工单系统是 DeepFlow 团队自主研发的一个跟踪工单的内部工具,部署在阿里公有云的容器服务(ACK)中,工单系统通过 Ingress 的方式对外提供服务,办公区与阿里云通过 VPN 连接,因此办公区可以直接使用域名访问工单系统。在《K8s 服务异常排障过程全解密》[1]文中对 K8s 访问方式做过总结,工单系统是比较典型的方式三
的访问形式
集群外客户端通过 Ingress 访问集群内服务
下图是通过 DeepFlow 自动绘制的访问拓扑图,可以看出北京和广州办公区都是通过 Ingress 的形式来访问工单的入口服务 (ticket_web)。工单系统部署在基础服务的容器集群上,此容器集群所有的 Node 上都已经部署了 deepflow-agent,因此可以自动采集所有 POD 及 Node 的网络/系统/应用相关的数据,其中就包括阿里云 nginx-ingress-controller 服务对应的 POD 以及应用的 POD
工单系统访问拓扑
02、排障过程
下午 3:00 左右,陆续收到同事反馈,工单系统加载不出来,首先和工单系统研发明确,并未做过任何变更
故障现场
依据《K8s 服务异常排障过程全解密》[2]总结的思路
K8s 服务异常排障思路
查看了对应的 Node/POD
负载、状态等都正常;登录到 DeepFlow 平台,调出了工单系统的访问拓扑(拓扑上标红部分表明有异常),从访问拓扑可知后端服务
黄金指标也都一切正常;又通过图可看出来广州办公室对工单系统的访问也并没有异常(也同步与广州同事确认,访问一切正常),可推测 DNS/SVC
也应该都正常;进一步结合拓扑图,可看出异常仅出现在北京办公室与 nginx-ingress-controller 之间。
访问拓扑
继续分析标红的路径,查看对应的流日志,因为云下未部署采集器,因此仅支持查看的是 nginx-ingress-controller POD 以及 Node 的数据,发现了几个问题:
-
服务端异常都是因为
传输-连接超时
导致的 -
服务端异常时,服务端 (nginx-ingress-controller) 回复的数据包,都是大包
-
服务端异常时,服务端 (nginx-ingress-controller) 都未收到任何客户端发送的数据
流日志
结合以上几点发现,怀疑方向转移到 MSS/MTU 上,立马咨询了 IT 同事,是不是变动过网关的 MSS/MTU 值,IT 同事否认了
聊天记录-01
既然云下部分未变动过,转而怀疑是不是 nginx-ingress-controller 动过 MSS/MTU,通过时序图
查看 MSS 是否有变化,通过故障前后对比可知:
-
客户端在故障前后发送的 MSS 确实发生过变动,从 1280 变为了 1380
-
服务端 (nginx-ingress-controller) MSS 值一直未变动过
时序图
通过数据可明确,云下一定变动过 MSS 值,拿着数据截图又去找 IT 同事,最后 IT 同事一顿找,明确改了 MSS 值,将 MSS 值恢复后,工单系统恢复正常
聊天记录-02
03、问题总结
问:MSS 值变动了,为什么影响了工单系统
-
因为云下的 MTU 值设置的是 1420,如果 MSS 值为 1380 + 报文头则会大于 MTU 值,因此大数据报文无法通过云下的网关,这就导致了 nginx-ingress-controller 收不到任何客户端的回应(客户端也未收到服务端的包)出现
传输-连接超时
的情况
问:MSS 值变动了,为什么其他内部系统未受到影响
-
工单描述中包含了大量的图片和文件,因此存在传输大数据的情况,而其他系统大部分都是文字传输,所以未受到明显影响
-
其他如 gitlab 存在图片和大文字传输的服务,并未使用 Ingress 的方式对外提供访问形式,而是利用阿里云 Terway 提供的内网直接访问 Headless 服务后端 POD 的方式,在协商 MSS 值时,后端 POD 的值为 1360(nginx-ingress-controller 的值为 1460),因此最终协商的取 1360 + 报文头则小于 MTU 值,所以也未受到明显影响
04、什么是 DeepFlow
DeepFlow[3] 是一款开源的高度自动化的可观测性平台,是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术,创新的实现了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心机制,帮助开发者提升埋点插码的自动化水平,降低可观测性平台的运维复杂度。利用 DeepFlow 的可编程能力和开放接口,开发者可以快速将其融入到自己的可观测性技术栈中。
GitHub 地址:https://github.com/deepflowys/deepflow
访问 DeepFlow Demo[4],体验高度自动化的可观测性新时代。
参考资料
[1] 《K8s 服务异常排障过程全解密》: https://deepflow.yunshan.net/blog/020-k8s-service-exception-troubleshooting/
[2] 《K8s 服务异常排障过程全解密》: https://deepflow.yunshan.net/blog/020-k8s-service-exception-troubleshooting/
[3] DeepFlow: https://github.com/deepflowys/deepflow
[4] DeepFlow Demo: https://deepflow.yunshan.net/docs/zh/install/overview/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Spring Boot 3.0 已经就绪,您准备好了么?
Java 微服务开发框架王者 Spring 2014 年的 4 月,Spring Boot 1.0.0 正式发布。距离 1.0 版本的发布已经过去了 9 年多的时间,如今 Spring Boot 已经被 Java 开发者广泛使用,正如 JRebel 的 2022 年开发者生产力报告中提到的那样,Spring Boot 已经作为 Java 开发微服务首选的框架,并且占有主导位置。 Spring Boot 核心特性 ·遵循约定大于配置的核心思想。 ·可以完全不使用 XML 配置,只需要使用自动配置以及 Java Config 方式即可。 ·内嵌 Servlet 容器,降低了对环境的依赖程度,以及大大减少了学习成本。 ·依赖管理,Spring Boot 提供 starter 机制,从而大大简化了 Maven 配置。 ·应用的可观测性,Spring Boot 提供了对当前应用可观测的解决方案。 ·对 Spring 自动装配,Spring Boot 会为 jar 包的类进行自动对 Bean 的装配。 从 2014 年的 Spring Boot 1.0 版本到 2018 年的 2.0 版本,再到...
-
下一篇
GaussDB数据库SQL系列-定义重载函数
目录 一、前言 二、函数重载的定义 三、GaussDB创建自定义重载函数的事项说明 四、GaussDB数据库中的自定义重载函数示例 示例一:创建package属性重载函数,根据不同的SQL条件获取生成视图 示例二:创建package属性重载函数,根据不同的参数求图形面积 五、小结 一、前言 在本文中,我们将介绍GaussDB数据库中的用户定义函数重载的概念、用法以及示例。用户定义函数是 SQL 中常用的“编程工具”,允许我们自定义函数来处理和操作数据。而函数重载则是指在一个数据库中定义多个具有相同名字但参数不同的函数,以此实现不同的功能。 二、函数重载的定义 函数重载是一种允许在同一个数据库中定义多个同名函数的特性。这些同名函数在参数类型、数量或顺序上有所不同,因此可以根据传入的参数的不同来调用不同的函数。通过函数重载,我们可以使用相同的函数名字来实现多个功能,提高了代码的可读性和重用性。 三、GaussDB创建自定义重载函数的事项说明 兼容PostgreSQL风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19