解决方案:基于 eBPF 的 Kubernetes 问题排查全景图

优采云 发布时间: 2022-11-24 13:39

  解决方案:基于 eBPF 的 Kubernetes 问题排查全景图

  -1-

  当 Kubernetes 成为事实上的云原生标准时,可观察性挑战随之而来

  目前,云原生技术以容器技术为基础,通过标准和可扩展的调度、网络、存储和容器运行时接口提供基础设施。同时,使用标准的、可扩展的声明式资源和控制器来提供运维能力。两层标准化推动开发和运维关注点分离,进一步提升各领域的规模化和专业化,实现成本、效率和稳定性。全面优化。

  在这样的技术背景下,越来越多的企业引入云原生技术来开发、运维业务应用。正因为云原生技术带来了越来越复杂的可能性,业务应用才具有微服务众多、多语言开发、多通信协议的鲜明特征。同时,云原生技术本身将复杂度下移,给可观察性带来更多挑战:

  混沌微服务架构,混杂多语言、多网络协议

  由于业务架构上的分工,很容易出现大量的服务、调用协议和非常复杂的关系,导致的常见问题包括:

  下沉的基础设施能力屏蔽了实现细节,更难圈定问题

  基础设施能力不断下沉,开发与运维重心不断分离。分层之后,实现细节相互屏蔽,数据没有很好的衔接。出现问题后,无法快速判断问题发生在哪一层。开发同学只关心应用是否正常运行,并不关心底层基础设施的细节。出现问题后,需要运维同学配合排查问题。在故障排除过程中,运维同学需要开发同学提供足够的上下游信息,以促进故障排除。否则,

  所以开发同学和运维同学需要一种共同的语言来提高沟通效率。Kubernetes 的 Label 和 Namespace 等概念非常适合构建上下文信息。

  多个监控系统,导致监控界面不一致

  复杂系统的一个严重副作用是监控系统众多。数据链路不关联统一,监控界面体验不一致。很多运维同学可能都有过这样的经历:定位问题时,浏览器打开几十个窗口,在Grafana、控制台、日志等工具之间来回切换,不仅耗时庞大,而且大脑可以处理它。信息有限,问题定位效率低。如果有一个统一的可观察性接口,数据和信息得到有效组织,减少分心和页面切换,提高问题定位的效率,将宝贵的时间投入到业务逻辑的构建中。

  -2-

  解决方案和技术方案

  为了解决上述问题,我们需要采用一种支持多种语言和多种通信协议的技术,并尽可能在产品层面覆盖软件栈端到端的可观察性需求。通过研究,我们提出了一种基于容器接口和底层操作系统,向上关联应用性能监控的可观察性解决思路。

  在容器、节点运行环境、应用程序和网络的各个维度采集

数据是非常具有挑战性的。云原生社区针对不同的需求提供了cAdvisor、node exporter、kube-state-metics等方法,但仍然不能满足所有需求。不应低估维护许多采集

器的成本。提出的一个想法是,有没有一种对应用无侵入、支持动态扩展的数据采集方案?目前最好的答案是 eBPF。

  数据采集​​:eBPF 的超能力

  eBPF相当于在内核中构建了一个执行引擎,通过内核调用将这个程序附加到某个内核事件上,从而*敏*感*词*内核事件。有了事件,我们可以进一步推导协议,过滤掉感兴趣的协议,将事件进一步处理后放入ringbuffer或者eBPF自带的数据结构Map中,供用户态进程读取。用户态进程读取数据后,进一步关联Kubernetes元数据,推送到存储端。这是整体流程。

  eBPF的超强能力体现在能够订阅各种内核事件,比如文件读写、网络流量等,运行在Kubernetes中的容器或Pod中的所有行为都是通过内核系统调用来实现的。内核知道机器上所有进程中发生的一切,因此内核几乎是可观察性的最佳位置,这就是我们选择 eBPF 的原因。

  在内核上进行监控还有一个好处就是应用程序不需要改动,也不需要重新编译内核,真正做到了无侵入。当集群中有数十个或数百个应用程序时,非侵入式解决方案将大有帮助。

  但作为一项新技术,eBPF 存在一些问题,例如安全性和探测性能。为了充分保证内核运行时的安全,eBPF代码有很多限制,比如目前最大栈空间为512,最大指令数为100万条。同时出于性能考虑,eBPF探针控制在1%左右。它的高性能主要体现在内核中对数据的处理,减少了内核态和用户态之间的数据拷贝。简单的说就是在内核中计算数据,然后给用户进程,比如一个Gauge值。过去是将原创

数据复制到用户进程中,然后进行计算。

  可编程执行引擎非常适合可观察性

  可观测性工程通过帮助用户更好地了解系统内部状态,消除知识盲点,及时消除系统性风险。eBPF 在可观察性方面有什么能力?

  以应用异常为例,当发现应用出现异常时,发现在解决问题的过程中缺乏应用级的可观察性。这时候应用的可观察性辅以埋点、测试、上线。具体问题解决了,但往往是治标不治本。下次其他地方出现问题时,需要遵循相同的过程。另外,多语言、多协议使得埋点成本更高。更好的办法是以非侵入式的方式解决,这样需要观察的时候就没有数据了。

  eBPF 执行引擎可以通过动态加载和执行 eBPF 脚本来采集

可观察性数据。举个具体的例子,假设原来的Kubernetes系统不做进程相关的监控。某天在疯狂占用CPU中发现了一个恶意进程(比如挖矿程序),这时候我们就会发现应该对这种恶意进程的创建进行监控。这时候我们可以通过集成一个开源的流程事件检测库来实现,但这往往需要一个完整的打包、测试、发布的过程,可能需要一个月的时间才能完成所有的工作。

  相比之下,eBPF 方法效率更高,速度更快。由于eBPF支持动态加载内核*敏*感*词*进程创建的事件,我们可以将eBPF脚本抽象成一个子模块,获取客户端每次只需要加载这个子模块即可。模块中的脚本完成数据采集,然后通过统一的数据通道将数据推送到后端。

  这样,我们就省去了代码修改、打包、测试、发布的繁琐过程,以非侵入的方式动态实现流程监控的需求。因此,eBPF 的可编程执行引擎非常适合增强可观察性、采集

丰富的内核数据以及连接业务应用程序以方便故障排除。

  —3—

  从监控系统到可观察性

  随着云原生的浪潮,可观察性的概念越来越流行。但是仍然离不开日志、指标、链接这三类可观察领域的数据基石。

  做过运维或者SRE的同学经常会遇到这样的问题:半夜被拉进应急群,被问为什么数据库不行。没有上下文,他们无法立即抓住问题的核心。我们认为,一个好的可观察性平台应该帮助用户很好地反馈上下文,就像Datadog CEO说的:监控工具不是越实用越好,而是要思考如何在不同的团队和成员之间搭建桥梁,把信息尽可能在同一页面上(以弥合团队之间的差距并将所有内容放在同一页面上)。

  因此,在可观测平台的产品设计中,需要基于指标、链接、日志等方式集成阿里云的各种云服务。不同背景的工程师理解,从而加快故障排除。如果信息没有有效组织,就会产生理解成本。在信息粒度上,事件->指标->链接->日志,由粗到细整理成一页,方便下钻,不需要多个系统来回跳转。这提供了一致的体验。

  那么它是如何相关的呢?信息是如何组织的?主要从两个方面:

  接下来介绍一下Kubernetes监控的核心功能。

  永恒的黄金指标

  黄金指标是用于监控系统性能和状态的最小集合。黄金指标有两个好处:一是直接、清晰地表达了系统是否正常对外服务。其次,它可以快速评估对用户的影响或情况的严重性,这可以为 SRE 或研发节省大量时间。想象一下,如果我们把 CPU 使用率作为黄金指标,那么 SRE 或 R&D 会被耗尽,因为 CPU 使用率高可能影响不大。

  

" />

  Kubernetes 监控支持这些指标:

  如下所示:

  全局视角下的服务拓扑

  诸葛亮曾说:“不谋大局,不足谋域”。随着当前技术架构和部署架构越来越复杂,问题发生后定位越来越困难,导致MTTR越来越高。另一个影响是冲击面的分析带来了很大的挑战,通常会导致忽略其他。因此,像地图这样的大型拓扑图是非常有必要的。全局拓扑具有以下特点:

  分布式追踪有助于定位根本原因

  Protocol Trace 也是非侵入式和语言中立的。如果请求内容中有分布式链接TraceID,可以自动识别,方便进一步下钻链接跟踪。应用层协议的请求和响应信息有助于分析请求内容和返回码,从而知道是哪个接口出了问题。如果想查看代码层级或请求域的详细信息,可以点击Trace ID,向下钻取链接trace分析。

  开箱即用的警报功能

  开箱即用的告警模板覆盖各级,无需手动配置告警,将*敏*感*词*Kubernetes运维经验融入告警模板,精心设计的告警规则加上智能降噪去重,我们可以做一次告警发出,则为有效告警,告警中收录

相关信息,可以快速定位异常实体。告警规则全栈覆盖的好处是可以及时、主动地将高危事件报告给用户。用户可以通过故障排除、故障排除、事后回顾、面向故障的设计等一系列方法,逐步实现更好的系统稳定性。.

  网络性能监控

  网络性能问题在 Kubernetes 环境中非常常见。由于TCP底层机制屏蔽了网络传输的复杂性,应用层对其不敏感。这就带来了生产环境丢包率高、重传率高等问题。一定的麻烦。Kubernetes 监控支持 RTT、重传&丢包、TCP 连接信息来表示网络状况。下面以RTT为例,从namespace、node、container、Pod、service、workload等维度来支持网络性能。支持定位以下网络问题:

  —4—

  Kubernetes 可观察性全景图

  有了以上的产品能力,基于阿里巴巴在容器和Kubernetes方面丰富而深入的实践,我们将这些有价值的生产实践总结并转化为产品能力,帮助用户更有效、更快速地定位生产环境问题。您可以通过以下方式使用此故障排除全景图:

  网络问题

  网络是Kubernetes中最难也是最常见的问题,因为以下原因让我们很难定位到生产环境中的网络问题:

  Kubernetes环境中的网络问题如下:

  网络问题千千万万,但不变的是网络有它的“黄金指标”来指示其是否正常运行:

  下面的示例演示了网络问题导致的缓慢调用。从网关的角度来看,发生了缓慢的调用。查看拓扑,发*敏*感*词*指标说明产品本身的服务没有问题。进一步查看两者之间的网络状态,发*敏*感*词*指标有助于问题的定界,从而加快排查问题的速度。

  节点问题

  Kubernetes 做了很多工作来确保提供工作负载和服务的节点尽可能正常。节点控制器 7x24 小时检查节点的状态。发现影响节点正常运行的问题后,将节点设置为NotReady或不可调度。通过 kubelet 将业务 Pod 驱逐出问题节点是 Kubernetes 的第一道防线。

  第二道防线是云厂商针对高频节点异常场景设计的节点自愈组件,比如阿里云的节点修复器:发现问题节点后,会进行引流和换机,从而自动保证业务的正常运行。即便如此,节点在长期使用过程中难免会出现各种奇怪的问题,定位起来费时费力。常见问题类别和级别:

  类别

  问题

  等级

  节点状态

  未读/不可安排

  批判的

  内核死锁,恐慌

  批判的

  网络问题

  批判的

  在容器运行时挂起或挂起

  批判的

  资源使用

  CPU 和内存已满

  

" />

  警告

  全内存

  批判的

  系统、镜像盘满

  警告

  磁盘 IO 高

  批判的

  性能问题

  高负载

  警告

  网卡丢包

  警告

  控制问题

  逐出、耗尽超时或失败

  警告

  亲和性和反亲和性配置问题

  警告

  针对这些复杂的问题,总结如下故障处理流程图:

  以一个完整的CPU为例:

  1、节点状态OK,CPU占用率超过90%。

  2、查看对应CPU的三元组:使用率、TopN、时序图。第一,各核心使用率高,导致整体CPU使用率高;接下来,我们自然要知道到底是谁在疯狂使用CPU。从 TopN 榜单来看,有一个 Pod 的 CPU 使用率是一枝独秀;最后,我们必须确认 CPU 激增是何时开始的。

  服务响应慢

  服务响应较多,场景可能原因包括代码设计问题、网络问题、资源竞争问题、依赖服务慢等原因。在复杂的 Kubernetes 环境中,定位慢调用有两种方式:一是应用本身是否慢;第二,下游或网络是否慢;最后,检查资源使用情况。如下图所示,Kubernetes监控从横向和纵向分析*敏*感*词*能:

  下面是一个慢SQL查询的例子(如下图所示)。在此示例中,网关调用产品服务。产品服务依赖MySQL服务。一步步查看链接上的黄金指标,最终发现该产品执行了一条特别复杂的SQL,并关联了多张表,导致MySQL服务响应缓慢。MySQL 协议基于 TCP。我们的eBPF探针识别到MySQL协议后,将MySQL协议的内容进行组装还原,可以采集

到任何语言执行的SQL语句。

  第二个例子是应用程序本身运行缓慢的例子。这时候自然要问是哪个步骤,哪个函数导致的慢。ARMS应用监控支持的火焰图通过周期性采样CPU时间帮助快速定位代码(如下图)。水平问题。

  应用程序/Pod 状态问题

  Pod负责管理容器,容器是真正执行业务逻辑的载体。同时,Pod是Kubernetes调度的最小单元,因此Pod同时具有业务和基础设施的复杂性,需要结合日志、链路、系统指标、下游服务指标来看待。Pod流量问题是生产环境中的高频问题,比如数据库流量突然变大。当环境中有数万个 Pod 时,要排查流量主要来自哪个 Pod 尤其困难。

  接下来看一个典型案例:在发布过程中,下游服务灰度了一个Pod,由于代码原因导致Pod响应很慢,导致上游超时。Pod级别的可观察性之所以成为可能,是因为我们使用ebpf技术来采集

Pod流量和黄金指标,所以我们可以很方便地查看Pod与Pods、Pod与服务、Pod与外部流量。

  —5—

  总结

  使用eBPF无创采集多语言多网络协议的黄金指标/网络指标/Trace,并通过关联Kubernetes对象、应用、云服务等各种上下文,在需要进一步钻探时提供专业的监控工具(如as flame graph),实现了Kubernetes环境下的一站式可观测平台。

  如果您在搭建云原生监控的过程中遇到以下问题,欢迎您毫不犹豫的联系我们一起探讨:

  <p style="margin-right: 0.5em;margin-left: 0.5em;outline: 0px;color: rgb(62, 62, 62);font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;white-space: normal;font-weight: 700;orphans: 4;widows: 1;word-spacing: 2px;caret-color: rgb(0, 0, 0);letter-spacing: 0.75px;line-height: 1.75em;">后台回复“加群”,带你进入高手如云交流群

  <br style="outline: 0px;" />

  推荐阅读:

  容器网络|深入理解Cilium

  Linux下的TCP测试工具

  深入理解 Cache 工作原理

  Cilium 容器网络的落地实践

  【中断】的本质<br style="outline: 0px;" />

  图解 | Linux内存回收之LRU算法<br style="outline: 0px;" />

  Linux 应用内存调试神器- ASan

  深入理解 Cilium 的 eBPF 收发包路径

  Page Cache和Buffer Cache关系

  深入理解DPDK程序设计|Linux网络2.0<br style="outline: 0px;" />

  一文读懂基于Kubernetes打造的边缘计算

  网络方案 Cilium 入门教程

  Docker  容器技术使用指南

  云原生/云计算发展白皮书(附下载)

  使用 GDB+Qemu 调试 Linux 内核

  防火墙双机热备

  常见的几种网络故障案例分析与解决

  Kubernetes容器之间的通信浅谈

  kube-proxy 如何与 iptables 配合使用

  完美排查入侵

  QUIC也不是万能的

  为什么要选择智能网卡?

  网络排错大讲解~

  OVS 和 OVS-DPDK 对比

  微软出品的最新K8S学习指南3.0下载▼<br style="outline: 0px;" /><strong style="outline: 0px;"><strong style="outline: 0px;">喜欢,就给我一个“在看”</strong></strong>

  <br style="outline: 0px;" />

  10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、<strong mpa-from-tpl="t" style="outline: 0px;">Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「</strong>1024」<strong mpa-from-tpl="t" style="outline: 0px;">,即可免费获!!</strong></p>

  解读:爆文内容生产路径分析

  1.序言

  自媒体引流怎么做?

  这个话题并不新鲜。很多网友都知道,自媒体流失的本质是内容流失:“你的内容有没有吸引力,能不能给读者提供更高的价值?”

  自媒体内容分为原创和伪原创。无论是原创内容还是伪原创内容都可以打开流量采集的窗口。

  现实情况是,一些公司只生产原创内容,而忽略了伪原创内容的生产。

  在制作伪原创内容的时候,效果不错的时候,小伙伴一个月可以增加2000左右的流量。

  渠道部门制作仿冒原创内容,成本低,可批量复制,操作方便;

  市场上优秀的内容制作者并不多,这也缓解了企业招聘原创人才的压力。

  因此,对于自媒体内容生产,打造品牌、打造渠道是企业扩大流量的最佳选择。

  01

  内容生产运营路径?

  在上一节中,我们讨论了频道制作伪原创内容的必要性。

  接下来说一下伪原创内容生产的运营路径。

  渠道部门合作伙伴生产伪原创内容的主要运营路径是梳理运营逻辑、生产发布内容、监控数据指标、审核优化总结。

  从这条运营路径来看,渠道人员必须具备平台规则分析、内容选题、内容生产、数据分析等综合能力。

  

" />

  1)理清运行逻辑

  ①平台操作流程

  为了更有效地达到引流的目的,账号运营者首先要了解不同平台的运营规则,以及如何合理投放引流广告。

  每个平台都有自己的用户规则。注册账号时,一定要认真阅读平台规则,认真学习。

  ②排水广告

  每个平台都有自己的用户规则。注册账号时,一定要认真阅读平台规则,认真学习。

  例如,可以在文中或文末嵌入软文,但要避免影响用户的阅读和体验。

  2)内容生产路径

  做好以上基础工作,就要开始内容制作的准备工作了。

  内容制作主要有四个步骤:确定方向、选择标题、制作内容框、填充内容。

  ①方向

  在方向上,时刻考虑你的产品吸引精准流量。具体逻辑是:大领域、小领域、垂直领域。例如:音乐唱歌发声。

  ②选择标题

  关于标题,首先寻找主要关键词,然后是长尾(相关)关键词。

  对于伪原创内容,最简单的方法就是在网站上搜索排名靠前的标题,将这些标题的关键词进行分解。也可以在百度指数的需求图中选择人气高、搜索量大的主关键词。

  最后,要将这些元素组合成一个流畅的句子,标题必须要有吸引力,这样你的用户才有点击阅读的欲望。

  比如我们围绕唱歌拆解了关键词,比如发声唱法,坏习惯,变化,常用名,3分钟,呼吸。

  

" />

  最后形成一个话题:改掉用嗓子唱歌的坏习惯,唱得快,3分钟学会用音。

  ③ 制作内容框架

  内容整体结构:故事开场解决方案强化广告背书(先导补充)。

  故事的开头:通过感官占领、恐惧诉求、认知对比、使用场景、用户感言等,激发用户学习或解决问题的欲望。

  解决方案:给用户详细的解决问题的路径,你的学习过程或者你解决问题的具体路径和经验。

  强化认可:通过权限传递和事实证明,你的解决方案赢得了用户的信任,加深了用户的信任,解决了用户的顾虑,

  Advertisement 广告:通过礼物/商品推荐,引导用户加微信。

  提示:故事可以来回切换。每篇文章至少插入三张图片。图片高清美观,用户可以继续阅读。同时,插入图片可以减少平台对伪原创内容的监控。

  ④ 填写内容

  对于内容填写,对其他内容做了一些修改,重新组织了语言,降低了被平台查的风险。

  3)内容分发

  内容制作完成后,还要对内容进行再确认,然后选择各个要发布的平台进行发布。

  4)数据指示系统

  最后,我们需要回顾一下我们发布的内容:“发布的文章是否能吸引用户阅读并加到精准用户”,然后逐步优化迭代。

  有五个重要指标来评估我们写作内容的有效性:

  平台推荐量:确定平台对这篇文章的喜欢程度。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线