可观测性实战:快速定位 K8s CNI 端口冲突问题

树欲静而风不止
发布于 2023-9-12 14:45
浏览
0收藏

本文为云杉网络原力释放 - 云原生可观测性分享会第十七期直播实录中的案例三。回看链接[1]PPT下载[2]


同时,欢迎大家报名参与 9月16日 DeepFlow开展的线下活动《可观测性 Meetup》

可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区


01|背景介绍


某车企的车控业务访问账户系统时无规律偶发连接超时(connection timeout),本案例分享利用 DeepFlow 深度剖析如何分钟级定位 K8s CNI 的 SNAT (Source Network Address Translation) 触发 Node 节点源端口冲突,导致连接服务端异常。

DeepFlow 分析定位之前,此问题一直为一个悬案,持续了数月无结论:


  • 连接超时为偶发问题,无任何规律可言,问题排障找不到抓手
  • 除日志中 connection timeout 的报错,其他监控数据一切正常,问题排障找不到依据
  • 业务的访问路径比较复杂,涉及、容器、云服务、云网络及跨集群等因素,增加了问题的复杂性和定位难度


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区01-topo


02|排障过程


step 1:利用 DeepFlow ​​网络-路径​​​的​​建连异常​​指标量,确定存在建连异常情况

根据路径页面中的网络指标数据,发现偶发的建连失败情况和业务报错的时间是一致的。


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区02-metrics


step 2: 对比 DeepFlow 网络指标曲线 ,确定为客户端建连失败

通过历史曲线对比,可进一步确定建连失败是由于客户端导致的。


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区03-line


step 3:利用 DeepFlow 流日志,确定异常原因为客户端端口复用导致

通过查看路径对应的流日志,并过滤​​status=客户端异常​​,从中发现异常的原因是客户端(46994)端口的复用导致的。


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区04-flow


对流日志发起 ​​NAT 追踪​​,发现在 POD 访问 LB (可通过服务端前面的 ICON 识别) 时,经过 K8s CNI 后,在 Node 网卡采集的数据,源 IP 地址已经为 Node 节点的 IP 了,存在 SNAT 情况。


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区05-


客户端端口复用的计算方法见下图描述:


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区06-explanation


step 4:使用端口过滤,存在 SNAT 情况,客户端口被其他服务占用

接下来,继续追查是谁导致了客户端端口的复用。将时间前移了一小段时间后,发现在大约 1 分钟前源端口被另一个服务占用。到此问题已经非常明确,因为 K8s CNI 的 SNAT 触发 Node 节点源端口冲突导致了业务连接超时


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区07-root


step 5:问题根因

车企中的业务都部署在公有云上,使用的基础设施都是公有云提供的 VPC 及 K8s 集群,通信分大类


  • 同集群内部通信:包含 Pod 之间访问、Pod 与 Node 之间访问、Pod 访问 clusterIP 类型的服务等情况,通过 Pod_IP 直接访问
  • 集群外通信:包含跨集群通信、访问外部云服务等情况,在 Node 上做 SNAT,使用 Node_IP 访问


默认配置中,对于集群外通信场景都需要在 Node 的 K8s CNI 上做 SNAT,此案例中的车控业务访问的是另一个集群中的账户业务,因此会存在 SNAT 的场景。


可观测性实战:快速定位 K8s CNI 端口冲突问题-鸿蒙开发者社区08-config


问题确定根因后,与业务部门及容器网络部门都进行了沟通,以最低代价解决问题的思路,最后使用 DeepFlow 的​​客户端端口复用​​的指标量的建立告警,对于高频触发端口复用访问,不进行 SNAT,直接使用 Pod 的真实IP进行通信


03|问题总结

问:DeepFlow 在整个案例的价值点是什么?

  • 利用 DeepFlow 零插码的网络指标,分钟级确定建连异常的路径及时间点
  • 利用 DeepFlow 零插码的网络流日志,分钟级确定建连异常的根因

04|什么是 DeepFlow


DeepFlow[3] 开源项目旨在为复杂的云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了零插桩(Zero Code)、全覆盖(Full Stack)的指标、追踪、日志采集,并通过智能标签技术实现了所有观测数据的全关联(Universal Tagging)和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。


GitHub 地址:​​https://github.com/deepflowio/deepflow​


访问 DeepFlow Demo[4],体验零插桩、全覆盖、全关联的可观测性。


参考资料

[1] 回看链接: ​​https://www.bilibili.com/video/BV1VX4y177pG​

[2] PPT下载: ​​http://yunshan-guangzhou.oss-cn-beijing.aliyuncs.com/yunshan-ticket/pdf/a7570a4b46c4796f07572f3b7af00ddd_20230815170039.pdf​

[3] DeepFlow: ​​https://github.com/deepflowio/deepflow​

[4] DeepFlow Demo: ​​https://deepflow.io/docs/zh/install/overview/​


收藏
回复
举报
回复
    相关推荐