云原生之深入解析Kubernetes中Kubectl Top如何进行资源监控

一、Kubectl top 的使用

  • kubectl top 是基础命令,但是需要部署配套的组件才能获取到监控值:
    • 1.8 以下:部署 heapter;
    • 1.8 以上:部署 metric-server;
  • kubectl top node:查看 node 的使用情况:

在这里插入图片描述

  • kubectl top pod:查看 pod 的使用情况:

在这里插入图片描述

  • 不指定 pod 名称,则显示命名空间下所有 pod,–containers 可以显示 pod 内所有的 container:

在这里插入图片描述

  • 指标含义:
    • 和 k8s中 的 request、limit 一致,CPU 单位 100m=0.1 内存单位 1Mi=1024Ki;
    • pod 的内存值是其实际使用量,也是做 limit 限制时判断 oom 的依据,pod 的使用量等于其所有业务容器的总和,不包括 pause 容器,值等于 cadvisr 中的 container_memory_working_set_bytes 指标;
    • node 的值并不等于该 node 上所有 pod 值的总和,也不等于直接在机器上运行 top 或 free 看到的值。

二、实现原理

① 数据链路

  • kubectl top 、 k8s dashboard 以及 HPA 等调度组件使用的数据是一样,数据链路如下:

在这里插入图片描述

  • 使用 heapster 时:apiserver 会直接将 metric 请求通过 proxy 的方式转发给集群内的 hepaster 服务:

在这里插入图片描述

  • 而使用 metrics-server 时:apiserver 是通过 /apis/metrics.k8s.io/ 的地址访问 metric:

在这里插入图片描述

  • 对比下 kubect get pod 时的日志:

在这里插入图片描述

② metric api

  • 可以发现,heapster 使用的是 proxy 转发,而 metric-server 和普通 pod 都是使用 api/xx 的资源接口,heapster 采用的这种 proxy 方式是有问题的:
    • proxy 只是代理请求,一般用于问题排查,不够稳定,且版本不可控;
    • heapster 的接口不能像 apiserver 一样有完整的鉴权以及 client 集成,两边都维护的话代价高,如 generic apiserver;
    • pod 的监控数据是核心指标(HPA 调度),应该和 pod 本身拥有同等地位,即 metric 应该作为一种资源存在,如 metrics.k8s.io 的形式,称之为 Metric Api;
  • 官方从 1.8 版本开始逐步废弃 heapster,并提出了上边 Metric api 的概念,而 metrics-server 就是这种概念下官方的一种实现,用于从 kubelet 获取指标,替换掉之前的 heapster。

③ kube-aggregator

  • 有了 metrics-server 组件,采集到了需要的数据,也暴露了接口,但走到这一步和 heapster 其实没有区别,最关键的一步就是如何将打到 apiserver的 /apis/metrics.k8s.io 请求转发给 metrics-server 组件?解决方案就是:kube-aggregator。
  • kube-aggregator 是对 apiserver 的有力扩展,它允许 k8s 的开发人员编写一个自己的服务,并把这个服务注册到 k8s 的 api 里面,即扩展 API,metric-server 其实在 1.7版本就已经完成,只是在等 kube-aggregator 的出现。kube-aggregator 是 apiserver 中的实现,有些 k8s 版本默认没开启,你可以加上这些配置来开启,他的核心功能是动态注册、发现汇总、安全代理。

在这里插入图片描述

  • 如 metric-server 注册 pod 和 node 时:

在这里插入图片描述

④ 监控体系

  • 在提出 metric api 的概念时,官方也提出了新的监控体系,监控资源被分为了 2 种:
    • Core metrics(核心指标):从 Kubelet、cAdvisor 等获取度量数据,再由 metrics-server 提供给 Dashboard、HPA 控制器等使用;
    • Custom Metrics(自定义指标):由 Prometheus Adapter 提供 API custom.metrics.k8s.io,由此可支持任意 Prometheus 采集到的指标。

在这里插入图片描述

  • 核心指标只包含 node 和 pod 的 cpu、内存等,一般来说,核心指标作 HPA 已经足够,但如果想根据自定义指标:如请求 qps/5xx 错误数来实现 HPA,就需要使用自定义指标。目前 Kubernetes 中自定义指标一般由 Prometheus 来提供,再利用 k8s-prometheus-adpater 聚合到 apiserver,实现和核心指标同样的效果。

⑤ kubelet

  • 前面提到,无论是 heapster 还是 metric-server,都只是数据的中转和聚合,两者都是调用的 kubelet 的 api 接口获取的数据,而 kubelet 代码中实际采集指标的是 cadvisor 模块,可以在 node 节点访问 10255 端口(1.11 版本过后是 10250 端口)获取监控数据:
    • Kubelet Summary metrics: 127.0.0.1:10255/metrics,暴露 node、pod 汇总数据;
    • Cadvisor metrics: 127.0.0.1:10255/metrics/cadvisor,暴露 container 维度数据;
  • 如下所示,容器的内存使用量:

在这里插入图片描述

  • Kubelet 虽然提供了 metric 接口,但实际监控逻辑由内置的 cAdvisor 模块负责,演变过程如下:
    • 从 k8s 1.6 开始,kubernetes 将 cAdvisor 开始集成在kubelet中,不需要单独配置;
    • 从 k8s 1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口来做汇总;
    • 从 k8s 1.12 开始,cadvisor 监听的端口在 k8s 中被删除,所有监控数据统一由 Kubelet 的 API 提供。

⑥ cadvisor

  • cadvisor 由谷歌开源,使用 Go 开发,cadvisor 不仅可以搜集一台机器上所有运行的容器信息,包括 CPU 使用情况、内存使用情况、网络吞吐量及文件系统使用情况,还提供基础查询界面和 http 接口,方便其他组件进行数据抓取。
  • 在 K8S 中集成在 Kubelet 里作为默认启动项,k8s 官方标配。cadvisor 拿到的数据结构示例:

在这里插入图片描述

  • 核心逻辑是通过 new 出来的 memoryStorage 以及 sysfs 实例,创建一个manager 实例,manager 的 interface 中定义了许多用于获取容器和 machine 信息的函数:

在这里插入图片描述

  • cadvisor 的指标解读:cgroup-v1(https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt),cadvisor 获取指标时实际调用的是 runc/libcontainer 库,而 libcontainer 是对 cgroup 文件 的封装,即 cadvsior 也只是个转发者,它的数据来自于 cgroup 文件。

⑦ cgroup

  • cgroup 文件中的值是监控数据的最终来源,如:
    • mem usage 的值,来自于 /sys/fs/cgroup/memory/docker/[containerId]/memory.usage_in_bytes;
    • 如果没限制内存,Limit=machine_mem,否则来自于 /sys/fs/cgroup/memory/docker/[id]/memory.limit_in_bytes;
    • 内存使用率 =memory.usage_in_bytes/memory.limit_in_bytes。
  • 一般情况下,cgroup 文件夹下的内容包括 CPU、内存、磁盘、网络等信息:
devices:设备权限控制。
cpuset:分配指定的 CPU 和内存节点。
cpu:控制 CPU 占用率。
cpuacct:统计 CPU 使用情况。
memory:限制内存的使用上限。
freezer:冻结(暂停)Cgroup 中的进程。
net_cls:配合 tc(trafficcont.roller)限制网络带宽。
net_prio:设置进程的网络流量优先级。
huge_t1b:限制 HugeTLB 的使用。
perf_event:允许 PeIf 工具基于 Cgroup 分组做性能监测。
  • memory 下的几个常用的指标含义:
memory. usage_in_bytes      已使用的内存量(包含cache和buffeT)(字节),相当于1inux的usedmen
memory.limit_in_bytes       限制的内存总量(字节),相当于1inux的total_mem
memory.failent              申请内存失败次数计数
memory-mensw.usage_in_bytes 已使用的内存和swap(字节)
memory.memsw.Limit_in_bytes 限制的内存和swap容量(字节)
memory. memsw.failcnt       申请内存和swap失败次数计数
memory. stat                内存相关状态
  • memory.stat 中的信息是最全的:

在这里插入图片描述

三、问题分析

① kubectl top 为什么会报错?

  • 一般情况下 top 报错有以下几种,可以 kubectl top pod -v=10 看到具体的调用日志:
    • 没有部署 heapster 或者 metric-server,或者 pod 运行异常,可以排查对应 pod 日志;
    • 要看的 pod 刚刚建出来,还没来得及采集指标,报 not found 错误,默认 1 分钟。
  • 以上两种都不是,可以检查下 kubelet 的 10255 端口是否开放,默认情况下会使用这个只读端口获取指标,也可以在 heapster 或 metric-server 的配置中增加证书,换成 10250 认证端口。

② kubectl top pod 内存怎么计算,包含 pause 容器?

  • 每次启动 pod,都会有一个 pause 容器,既然是容器就一定有资源消耗(一般在 2-3M 的内存),cgroup 文件中,业务容器和 pause 容器都在同一个 pod 的文件夹下。
  • 但 cadvisor 在查询 pod 的内存使用量时,是先获取了 pod 下的 container 列表,再逐个获取 container 的内存占用,不过 container 列表并没有包含 pause,因此最终 top pod 的结果也不包含 pause 容器 pod 的内存使用量计算 kubectl top pod 得到的内存使用量,并不是 cadvisor 中的 container_memory_usage_bytes,而是 container_memory_working_set_bytes,计算方式为:
    • container_memory_usage_bytes = container_memory_rss + container_memory_cache + kernel memory
    • container_memory_working_set_bytes = container_memory_usage_bytes – total_inactive_file(未激活的匿名缓存页)。
  • container_memory_working_set_bytes 是容器真实使用的内存量,也是 limit 限制时的 oom 判断依据。cadvisor 中的 container_memory_usage_bytes 对应 cgroup 中的 memory.usage_in_bytes 文件,但 container_memory_working_set_bytes 并没有具体的文件,它的计算逻辑在 cadvisor 的代码中,如下:

在这里插入图片描述

  • 同理,node 的内存使用量也是 container_memory_working_set_bytes。

③ kubectl top node 怎么计算,和节点上直接 top 有什么区别?

  • kubectl top node 得到的 cpu 和内存值,并不是节点上所有 pod 的总和,不要直接相加。top node 是机器上 cgroup 根目录下的汇总统计:

在这里插入图片描述

  • 在机器上直接 top 命令看到的值和 kubectl top node 不能直接对比,因为计算逻辑不同,如内存,大致的对应关系是(前者是机器上 top,后者是 kubectl top):
rss + cache = (in)active_anon + (in)active_file

在这里插入图片描述

④ kubectl top pod 和 exec 进入 pod 后看到的 top 不一样?

  • top 命令的差异和上边一致,无法直接对比,同时,就算对 pod 做了 limit 限制,pod 内的 top 看到的内存和 cpu 总量仍然是机器总量,并不是pod 可分配量:
    • 进程的 RSS 为进程使用的所有物理内存(file_rss+anon_rss),即 Anonymous pages+Mapped apges(包含共享内存);
    • cgroup RSS 为(anonymous and swap cache memory),不包含共享内存。两者都不包含 file cache。

⑤ kubectl top pod 和 docker stats 得到的值为什么不同?

  • docker stats dockerID 可以看到容器当前的使用量:

在这里插入图片描述

  • 如果 pod 中只有一个 container,可以发现 docker stats 值不等于kubectl top 的值,既不等于 container_memory_usage_bytes,也不等于 container_memory_working_set_bytes,因为docker stats 和 cadvisor 的计算方式不同,总体值会小于 kubectl top,计算逻辑是:
docker stats = container_memory_usage_bytes - container_memory_cache

四、总结

  • 一般情况下,并不需要时刻关心 node 或 pod 的使用量,因为有集群自动扩缩容(cluster-autoscaler)和 pod 水平扩缩容(HPA)来应对这两种资源变化,资源指标的意义更适合使用 prometheus 来持久化 cadvisor 的数据,用于回溯历史或者发送报警。
  • 其他补充:
    • 虽然 kubectl top help 中显示支持 Storage,但直到 1.16 版本仍然不支持;
    • 1.13 之前需要 heapster,1.13 以后需要 metric-server,这部分 kubectl top help 的输出有误,里面只提到 heapster;
    • k8s dashboard 中的监控图默认使用的是 heapster,切换为 metric-server后数据会异常,需要多部署一个metric-server-scraper 的 pod 来做接口转换,具体参考:dashboard。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】构造函数调用规则

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。 1、缘起 (1)默认情况下,C 编译器至少给一个类添加 3 个函数 ① 默认构造函数(无参&#…

开源软件介绍——国内和国际主要开源社区

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区,一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

ChatGPT从入门到精通,深入认识ChatGPT

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…

Clickhouse之物化视图分享

前言 ClickHouse广泛用于用户和系统日志查询场景中,主要针对于OLAP场景,为业务方提供稳定高效的查询服务。在业务场景下,数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据,通常有如下痛点: 每个查询的代码冗…

CTFshow-pwn入门-前置基础pwn23-pwn25

pwn23-25的题目会涉及到ret2shellcode、ret2libc等内容,本篇文章只会侧重研究这几道题目的wp,不会过多涉及到ret2shellcode、ret2libc的基本原理,等有时间再来写关于ret2libc、ret2shellcode…的相关内容。大家可以参考CTFwiki的文章去慢慢学…

【机器学习】十大算法之一 “SVM”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

Kubernetes(k8s)部署模式发展

目录 1 简介2 物理单机(~2000)2.1 主要代表 3 虚拟化:初期(2001~2009)3.1 VMware3.2 laaS 4 虚拟化:成熟期(2010~至今)4.1 OpenStack4.2 虚拟化四巨头 5 容器化:(2013-至今)5.1 Dock…

【备战秋招】每日一题:2023.04.26-华为OD机式-第三题-MC方块

在线评测链接:P1231 题目内容 MC最新版本更新了一种特殊的方块,幽匿催发体。这种方块能够吸收生物死亡掉落的经验并感染周围方块,使其变成幽匿块。Steve想要以此为基础尝试搭建一个经验仓库,他来到了创造超平坦模式,在只有草方块…

被测系统架构与数据流分析

开源项目litemall系统架构(https://github.com/linlinjava/litemall) 角色与数据用户产品前端技术栈后端技术栈数据存储 开源项目Mall的系统架构(https://github.com/macrozheng/mall) 角色与数据用户产品前端技术栈后端技术栈服务治理技术栈监控技术栈大数据处理技术栈数据存…

自动化测试工具 AirTest 的使用方法与简介

目录 前言: Airtest简介 1.基于图像识别的Airtest框架 2.基于UI识别的Poco框架 Airtest环境搭建 Airtest布局 Airtest使用步骤 第一步:连接移动设备 第二步:创建一个.air文件(也就是我们的测试脚本) 第三步&#xff1a…

【MySQL数据库 | 第二十篇】explain执行计划

目录 前言: explain: 语法: 总结: 前言: 上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的…

如何在 XMind 中绘制流程图

XMind 是专业强大的思维导图软件,由于其结构没有任何限制,很多朋友特别喜欢用它来绘制流程图。禁不住大家的多次询问,今天 XMind 酱就将这简单的流程图绘图方法分享给大家。 在 XMind 中,绘制流程图的主角是「自由主题」和「联系」。它们可以打破思维导图的限制,让你自由…

Type-C PD显示器方案简介

方案概述 LDR6020 Type-C PD显示器方案可以给显示器提供一个全功能C口,支持手机,电脑,游戏主机等一线投屏功能,同时支持PD快充输出。LDR6020内置了 USB Power Delivery 控制器和 PD BMC PHY 收发器,支持PD2.0/3.0等快…

Java多线程与并发

1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因:Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与线程的区别 进程是资源分配的最小单位,线程是cpu调度的最小单位. 所有与进程相关的资源,都被记录在PCB(进程控制块)中。进程是抢占…

数学建模竞赛国赛入场券之攻略

数学建模竞赛国赛入场券之攻略 1.团队契合度 在3天的准备时间中,如果是临时组建的草台班子光处理分歧可能就已经耗掉一半时间,最好在赛前就完成磨合,像一起做模拟题练练手之类,甲准备图论、乙准备优化方法,然后再一块…

存储笔记8 ipsan

Module Objectives IP SAN的组件 IP SAN的好处 描述SAN中的IP融合及其影响 描述的基本架构 –iSCSI –FCIP –FCoE 讨论IP SAN技术的市场驱动因素 列出IP SAN技术 列出iSCSI的组件和连接选项 描述iSCSI体系结构和拓扑结构 解释iSNS操作 描述FCIP的体系结构 IP SAN互联…

Redis持久化机制与Redis事务

一、Redis 持久化机制 Redis 是个基于内存的数据库。那服务一旦宕机,内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作正在运行&#…

UDS系列-31服务(Routine Control)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍例程控制服务RoutineControl,该服务的目的是Client端使用Routine Control服务来执行定义的步骤序列并获取特定序列的相关结果。这个服务经常在EOL、Bootloader中使用,比如,检查刷写条件是否满足、擦除内存、覆盖正…

Maven如何创建Maven web项目

1、创建一个新的模块: 1.1 使用骨架点一下,这里 1.2 找到maven-archetype-webapp项目,选中点击,一路next就行。 1.3 删除不必要的maven配置:(这里我不需要,针对自己情况而定) 可以从name这里开…

pr视频叠加,即原视频右上角添加另外一个视频方法,以及pr导出视频步骤

一、pr视频叠加,即原视频右上角添加另外一个视频方法 在使用pr制作视频时,我们希望在原视频的左上角或右上角同步播放另外一个视频,如下图所示: 具体方法为: 1、导入原视频,第一个放在v1位置,第…