提高 K8S 容器运行时的可观察性最佳方法之一

news2024/11/22 15:39:04

当谈到云原生可观察性时,可能每个人都会提到OpenTelemetry (OTEL),因为社区需要依赖标准来将所有集群组件开发指向到同一方向。OpenTelemetry 使我们能够将日志、指标(metrics)、跟踪(traces)和其他上下文信息组合到一个资源中。集群管理员或软件工程师可以使用此资源来获取在定义的时间段内集群中正在发生的事情的视图。

但是 Kubernetes 本身如何利用这个技术栈呢?

Kubernetes 由多个组件组成,其中一些组件是独立的,而另一些组件则堆叠在一起。从容器运行时的角度来看架构,那么从上到下有:

  • kube-apiserver:验证和配置 API 对象的数据
  • kubelet:在每个节点上运行的代理
  • CRI 运行时:容器运行时接口 (CRI) 兼容的容器运行时,如CRI-O或containerd
  • OCI 运行时:较低级别的开放容器倡议 (OCI)运行时,如runc或crun
  • Linux 内核Microsoft Windows:底层操作系统

这意味着如果我们在 Kubernetes 中运行容器时遇到问题,那么我们就会开始查看其中一个组件。随着当今集群架构复杂性不断增加,查找问题的根本原因是我们面临的最耗时的操作之一。即使知道可能导致问题的组件,仍须考虑其他组件。

我们如何做到这一点?大多数人可能会坚持抓取日志,过滤它们并在组件边界上将它们组装在一起。我们也有 metrics 指标,但是将指标值与普通日志相关联使跟踪正在发生的事情变得更加困难。一些指标也不是为了调试目的而制定的。

OpenTelemetry 应运而生。该项目旨在将 traces~跟踪、metrics~指标和 logs~日志 等信号组合在一起,以维护集群状态的统一视图。

Kubernetes 中 OpenTelemetry 跟踪的当前状态是什么?从 API server 的角度来看,自 Kubernetes v1.22 以来,我们对 tracing 提供了 alpha 支持,它将在即将发布的其中一个版本中升级为 beta。不幸的是,beta 毕业错过了 Kubernetes v1.26 版本。可以在 API Server Tracing Kubernetes Enhancement Proposal (KEP)中找到该设计提案,其中提供了更多相关信息。

kubelet tracing 部分 在另一个 KEP 中进行跟踪,该 KEP 在 Kubernetes v1.25 中以 alpha 状态实现。撰写本文时并未计划进行 Beta 毕业,但 v1.27 发布周期中可能会有更多。除了两个 KEP 之外还有其他方面的努力,例如 klog 正在考虑 OTEL 支持,这将通过将日志消息链接到现有跟踪来提高可观察性。在 SIG Instrumentation 和 SIG Node 中,我们还在讨论 如何将 kubelet traces 链接在一起,因为现在他们专注于 kubelet 和 CRI 容器运行时之间的 gRPC 调用。

CRI-O 从 v1.23.0 开始就支持 OpenTelemetry 跟踪,并致力于不断改进它们,例如通过 将日志附加到跟踪 或将 spans 扩展到应用程序的逻辑部分。这有助于跟踪的用户获得与解析日志相同的信息,但具有增强的范围界定和过滤其他 OTEL 信号的能力。CRI-O 维护者还在开发conmon的容器监控替代,称为 conmon-rs 并且纯用 Rust 编写。使用 Rust 实现的一个好处是能够添加诸如 OpenTelemetry 支持之类的功能,因为这些功能的库已经存在。这允许与 CRI-O 紧密集成,并让消费者从容器中看到最低级别的跟踪数据。

containerd 从 v1.6.0 开始添加了 tracing 支持,可通过使用插件 获得。较低级别的 OCI 运行时,如 runc 或 crun,根本不支持 OTEL,而且似乎不存在这方面的计划。我们必须考虑到在收集 traces 并将它们导出到数据接收器时会产生性能开销。我仍然认为在 OCI 运行时扩展的遥测收集看起来是值得评估的。让我们看看 Rust OCI 运行时 youki 将来是否会考虑类似的事情。

下面我会展示如何做。对于下面演示,我将坚持使用 runc、conmon-rs、CRI-O 和 kubelet 的单个本地节点堆栈。要在 kubelet 中启用跟踪,需要在KubeletConfiguration中配置以下内容:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
  KubeletTracing: true
tracing:
  samplingRatePerMillion: 1000000

等于一samplingRatePerMillion百万将在内部转化为对所有内容进行采样。必须将类似的配置应用于 CRI-O;我可以使用 and 启动二进制 crio文件,或者我们使用这样的嵌入式配置:--enable-tracing``--tracing-sampling-rate-per-million 1000000

一个 samplingRatePerMillion 等于 100 万将在内部转化为对所有内容的抽样。必须对 CRI-O 应用类似的配置;我可以使用参数 --enable-tracing--tracing-sampling-rate-per-million 1000000 启动 crio 二进制文件,或者使用这样的插入式配置:

cat /etc/crio/crio.conf.d/99-tracing.conf
[crio.tracing]
enable_tracing = true
tracing_sampling_rate_per_million = 1000000

要将 CRI-O 配置为使用 conmon-rs,至少需要最新的 CRI-O v1.25.x 和 conmon-rs v0.4.0。然后像下面这样配置插件可以让 CRI-O 使用 conmon-rs:

cat /etc/crio/crio.conf.d/99-runtimes.conf
[crio.runtime]
default_runtime = "runc"

[crio.runtime.runtimes.runc]
runtime_type = "pod"
monitor_path = "/path/to/conmonrs" # or will be looked up in $PATH

默认配置将指向的 OpenTelemetry 收集器 gRPC 端点:localhost:4317,它也必须启动并运行。如文档中所述 有多种运行 OTLP 的方法,但也可以通过 kubectl proxy 进入在 Kubernetes 中运行的现有实例。

如果一切都已设置好,那么收集器应该记录有传入的跟踪:

ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope go.opentelemetry.io/otel/sdk/tracer
Span #0
    Trace ID       : 71896e69f7d337730dfedb6356e74f01
    Parent ID      : a2a7714534c017e6
    ID             : 1d27dbaf38b9da8b
    Name           : github.com/cri-o/cri-o/server.(*Server).filterSandboxList
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2022-11-15 09:50:20.060325562 +0000 UTC
    End time       : 2022-11-15 09:50:20.060326291 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Span #1
    Trace ID       : 71896e69f7d337730dfedb6356e74f01
    Parent ID      : a837a005d4389579
    ID             : a2a7714534c017e6
    Name           : github.com/cri-o/cri-o/server.(*Server).ListPodSandbox
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2022-11-15 09:50:20.060321973 +0000 UTC
    End time       : 2022-11-15 09:50:20.060330602 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Span #2
    Trace ID       : fae6742709d51a9b6606b6cb9f381b96
    Parent ID      : 3755d12b32610516
    ID             : 0492afd26519b4b0
    Name           : github.com/cri-o/cri-o/server.(*Server).filterContainerList
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2022-11-15 09:50:20.0607746 +0000 UTC
    End time       : 2022-11-15 09:50:20.060795505 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Events:
SpanEvent #0
     -> Name: log
     -> Timestamp: 2022-11-15 09:50:20.060778668 +0000 UTC
     -> DroppedAttributesCount: 0
     -> Attributes::
          -> id: Str(adf791e5-2eb8-4425-b092-f217923fef93)
          -> log.message: Str(No filters were applied, returning full container list)
          -> log.severity: Str(DEBUG)
          -> name: Str(/runtime.v1.RuntimeService/ListContainers)

可以看到 spans 有一个 trace ID,并且通常有一个附加 attached。日志等事件也是输出的一部分。在上述情况下,kubelet 的 Pod 生命周期事件生成器 (PLEG) 定期触发 ListPodSandbox 调用 CRI-O 的 RPC。可以通过例如 Jaeger 来显示这些 traces 。在本地运行跟踪堆栈时,默认情况下应公开一个 Jaeger 实例地址为:http://localhost:16686

这些ListPodSandbox请求在 Jaeger UI 中直接可见:

Jaeger UI 中的 ListPodSandbox RPC

这并不太令人兴奋,所以我将直接通过kubectl运行工作负载:

kubectl run -it --rm --restart=Never --image=alpine alpine -- echo hi
hi
pod "alpine" deleted

现在查看 Jaeger,我们可以看到有 conmonrscrio以及kubeletRunPodSandboxCreateContainer CRI RPC 的 traces:

Jaeger UI 中创建容器 traces

kubelet 和 CRI-O spans 相互连接,使调查更容易。如果我们现在仔细查看这些 spans,可以看到 CRI-O 的日志正确地包含了相应的功能。例如,可以像这样从 traces 中提取 container user:

Jaeger UI 中的 CRI-O Traces

较低级别的 conmon-rs spans 也是此跟踪的一部分。例如 conmon-rs 维护一个内部 read_loop 处理容器和最终用户之间的 IO。读取和写入字节的日志是 spans 的一部分。这同样适用于 wait_for_exit_code span,它告诉我们容器成功退出,code 为0

Jaeger UI 中的 conmon-rs Traces

将所有这些信息与 Jaeger 的过滤功能放在一起,使整个堆栈成为调试容器问题的绝佳解决方案!提到“整个堆栈”也显示了整体方法的最大缺点:与解析日志相比,它在集群设置之上增加了明显的开销。用户必须维护一个像 Elasticsearch 这样的接收器来持久化数据,暴露 Jaeger UI 并可能考虑到性能缺陷。无论如何,它仍然是提高 Kubernetes 可观察性方面的最佳方法之一。

感谢您阅读这篇博文,我很确定大家正在展望 Kubernetes 对 OpenTelemetry 支持的光明前景,以简化故障排除。

译自

作者:Sascha Grunert
原文:https://kubernetes.io/blog/2022/12/01/runtime-observability-opentelemetry/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内容爆炸时代,如何打造品牌经营的“弹药库”?

👆点击一键预约本周三主题直播👆2017年,华为总裁办发布《华为之熵,光明之矢》的内部学习邮件,将热力学中“熵”的概念应用到企业管理中,成为被人们津津乐道的“熵减哲学”。对于“熵”的概念,大…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台app

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计甜品购物网站Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【OpenCV-Python】教程:4-2 Harris角点检测

OpenCV Python Harris 角点检测 【目标】 理解Harris角点检测背后的概念;cv2.cornerHarris(), cv2.cornerSubPix() 【理论】 上一章节中,我们看到在图像中每个方向变化都很大的区域就是角点,一个早期的尝试是由 Chris Harris & Mike …

关闭图片窗口

关闭图片窗口 结果演示 概述 通过事件的绑定来实现&#xff0c;关闭网页中某个图片窗口的效果。 构建HTML框架 <body><div class"box">图片<img src"https://upload-bbs.mihoyo.com/upload/2021/03/11/73281682/f810fbc2e4806aab8176e96feee…

关于数据分析知识的干货分享

数据分析的出现是因为人类难以理解海量数据所呈现出来的信息&#xff0c;不能从中找到相应的规律来对现实中的事物进行对应&#xff0c;我们都知道数据有很高的价值&#xff0c;但不能利用的价值&#xff0c;没有任何意义。 为了解决这一问题&#xff0c;数据分析在长期的数据…

超透镜与超表面全息

超透镜和超表面因其操纵电磁场的独特特性而在科学上声名鹊起&#xff0c;如今它们的制造已经变得可行。但它们的设计难度远远超过了传统镜片&#xff0c;因为必须考虑到纳米级构件的特性。 VirtualLab Fusion的优势  统一的平台&#xff1a;具有将纳米级构建模块和大尺…

JAVA-GUI工具的编写-----事件篇

上一节介绍了HTTP以及HTTPS请求&#xff0c;那么这里我们就接着讲解事件与请求联动。 关于POC以及EXP最大的区别就是&#xff0c;EXP是附带利用功能&#xff0c;而POC仅仅是检测功能&#xff0c;所以这里我们需要动起来&#xff0c;GUI小工具能用上的事件功能其实就两个&#…

【vue3】代码自动格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西&#xff1b; 这里我们使用vscode完成这些操作&#xff1b; 在代码保存的时候&#xff0c;顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后&#xff0c;我们需要配置一下 打开 文件 > 首选项 >…

为什么阿里巴巴建议HashMap初始化时需要指定容量大小?

为什么阿里巴巴建议HashMap初始化时需要指定容量大小&#xff1f; 为什么&#xff1f; 关于集合类&#xff0c;《阿里巴巴Java开发手册》中写道&#xff1a; 我们先来写一段代码在JDK 1.7 &#xff08;jdk1.7.0_80&#xff09;下面来分别测试下&#xff0c;在不指定初始化容量…

Docker harbor私有仓库部署与管理

Docker harbor私有仓库部署与管理Docker harbor私有仓库部署与管理一、Docker 私有仓库1、下载registry镜像2、修改配置文件/etc/docker/daemon.json &#xff0c;添加私有仓库配置&#xff0c;修改完后重启docker3、创建私有仓库容器4、推送镜像到私有仓库中5、查看当前仓库的…

使用 Lua 脚本和海康 VisionMaster 进行 TCP 通信

说明&#xff1a;因任务需求&#xff0c;需要进行海康VisionMaster服务端和Lua脚本客户端进行TCP通信传输数据。因为之前从未接触过Lua语言&#xff0c;所以也趁机学习一波。 内容Lua教程手册LuaSocket使用方法一方法二报错&#xff1a;“attempt to compare number with strin…

高级_09.性能分析工具的使用

第09章_性能分析工具的使用 1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和行动&#xff08;Action&#xff09;两个部分。…

Service详解「2」

Service详解「2」 文章目录Service详解「2」Service介绍kube-proxy目前支持三种工作模式:userspace 模式iptables 模式ipvs 模式Service类型Service使用实验环境准备ClusterIP类型的ServiceEndpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的…

407. 接雨水 II

给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后&#xff0c;雨水将会被上…

24节气- ||大雪|| 文案、海报分享,冬寒雪落,归家愈暖。

大雪降至 一年中最寒冷的时候也将到来 大家注意保暖防护 过个温暖的冬天吧&#xff01; 下面是我整理的关于大雪的文案、海报&#xff0c;希望对大家有帮助&#xff01; 更多设计素材免费下载&#xff1a; https://www.sucai999.com/?vNTYxMjky 01 大雪至&#xff0c;人…

跨越专业翻译的语言之墙:百度翻译的技术攀登

作为一个科技从业者&#xff0c;阅读AI顶会的最新论文、浏览国内外创新的最新动向&#xff0c;是我工作的重要部分。平时接触的开发者、科学家、企业研究人员等&#xff0c;工作生活中也涉及大量专业阅读。于是乎&#xff0c;我就会经常听到这样的抱怨&#xff1a;PDF格式的论文…

第42讲:MySQL数据库索引的基本使用规则以及在正确使用索引的方式

文章目录1.索引规则之最左前缀法则1.1.最左前缀法则的概念1.2.最左前缀法则的验证案例2.索引规则之范围查询3.使用索引时会导致索引失效的几种情况3.1.索引列使用运算导致索引失效3.2.索引列的值不加引号导致索引失效3.3.索引列模糊查询可能会导致索引失效3.4.OR连接条件使用不…

Excel中如何用计算公式或表达式直接计算出结果?

Excel中如何用计算公式或表达式直接计算出结果&#xff1f; 目录 Excel中如何用计算公式或表达式直接计算出结果&#xff1f; 1、例如&#xff1a;我们需要用E列的计算公式&#xff08;表达式&#xff09;&#xff0c;直接计算出结果填至F列 2、另一种方法&#xff1a;在菜…

什么是接口测试?接口测试的流程步骤

目录 一、什么是接口测试&怎么测 二、接口测试的好处 三、怎么做好接口测试 四、接口测试的原理 五、接口测试流程&用例设计 5.1.接口文档分析 5.1.1.接口构成图解 5.2.制定接口测试计划 5.3.编写接口测试用例&评审 5.3.1.接口测试用例模板 5.4.接口测试…