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

news2024/11/24 10:45:13

一、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。

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

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

相关文章

25.单元测试、反射

一.单元测试 1.1 什么是单元测试 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法。因此,单元测试就是针对Java方法进行的测试,进而检查 方法的正确性。 1.2 目前测试方法是怎么进行的 ①只有一个main方法&#x…

可观测性最佳实践 | 警惕!未知的风险正在摧毁你的系统

无声的刺客最为致命,往往表面看似云淡风轻,实际早已危机重重,血雨腥风一触即发。这样的场面看似离我们很遥远,但每个开发运维人员实际都遇到过。 在全球数字经济大潮下,现代企业纷纷投身于业务数字化转型的浪潮。越来越…

java8 (jdk 1.8) 新特性—— 方法引用+构造器引用

1. 方法引用 方法引用 其实 本质上 就是Lambda 表达式 ,之前已经知道 Lambda 是作为一个函数式接口的实例 ,因此,方法引用也就是一个函数式接口的实例 使用的情况: 当要将值传给Lambda 体,已经有实现的方法&#xff…

【Python 随练】判断101到200的素数

题目: 判断 101-200 之间有多少个素数,并输出所有素数。 简介: 在本篇博客中,我们将解决一个常见的问题:判断101到200之间的素数,并输出所有素数的列表。我们将给出问题的解析,并提供一个完整…

2023年了要怎么理解原型和原型链

1.prototype和__proto__有什么不可告人的关系? 说道原型对象,那一定绕不开几个概念: prototype,__proto__,constructor。 首先解释一下prototype是什么,原型对象。V8引擎给所有函数内置的一个对象。也就是只要创建的…

瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

FTLE场,即有限李雅普诺夫指数场是识别拉格朗日拟序结构的一种方法,其主要思路是如下: 1、t时刻在场内均匀布置粒子 2、计算t–>tT时刻后粒子的位置,这里粒子任意时刻的速度有速度场插值得到 3、根据两个时刻的粒子位置计算得…

资讯 |智汇云舟受邀出席WGDC大会并获“年度最具创新力企业“奖项

5月17日,由泰伯网主办的第十二届WGDC2023全球地理信息开发者大会在北京隆重召开。开幕式上重磅发布了“2023年度最具创新力”榜单,智汇云舟凭借技术创新研发与应用方面取得的诸多突破,获数字孪生赛道“年度最具创新力企业"奖项。公司产品…

Django高级扩展之Paginator分页实现

在项目中很常见的一种功能,主要用于大量数据在一页显示过于冗长,分为一页显示多条数据,分隔为多页显示;并常与条件筛选结合使用。 目录 Paginator对象 创建对象 属性 方法 异常 Page对象 创建对象 属性 方法 Paginator与…

华为OD机试之阿里巴巴找黄金宝箱(I)

阿里巴巴找黄金宝箱(I) 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字…

Kubernetes Pod 生命周期

Pod 生命周期是其从创建开始至终止退出的事件范围。 Pod 状态 Pending API server 创建了 Pod 对象并已存入 etcd 中,但尚未调度完成或仍处于从镜像仓库下载镜像的过程中。Running Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成。Suc…

spss分析方法-聚类分析

聚类分析是根据研究对象的特征,按照一定标准对研究对象进行分类的一种分析方法。下面我们主要从下面四个方面来解说: 实际应用理论思想建立模型 分析结果 一、实际应用 聚类分析的目标就是在相似的基础上收集数据来分类。 聚类源于很多领域&#xf…

安装虚幻引擎

1、下载和安装 Epic Games启动程序。 下载地址:https://www.unrealengine.com/zh-CN/download 进入网站你可以看到下载信息和推荐系统要求等: 点击“下载启动程序”即可下载,或者直接点击下载链接:https://epicgames-download1.ak…

37岁985硕士,投上千份简历无人问津......该何去何从

前言 简单自我介绍一下,我老刘,37岁失业的985硕士 ,13年其实可以直接入编的我,其实都不需要考试了,可以直接入职,但是我并没有选择去,后面直接选择了新闻周刊干了四年,后面换了一家…

【福利】不用考试可以增持CSPM-2证书?有PMP证书才行!

2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…

CSS查缺补漏之《过渡效果与动画效果》

过渡 过渡效果使用transition属性表示&#xff0c;设置在需要过渡效果的元素上&#xff0c;它可以在让元素从一种样式平滑过渡为另一种样式。下面会依次介绍其属性值~ 示例代码如下&#xff1a; <div class"box">世界你好 </div> .box {width: 200px…

多态下,为什么使用virtual修饰析构函数

多态下,为什么使用virtual修饰析构函数 问题&#xff1a; 用virtual修饰的析构函数和非虚函数的析构函数有什么区别&#xff1f; 当时以为&#xff1a;只有经过virtual修饰的析构函数&#xff0c;派生类生命周期结束时&#xff0c;才会自动的先调用派生类的析构函数&#xff0…

mybatisplus连接sqlserver配置

目录 前言&#xff1a; 一&#xff1a;所需依赖&#xff1a; 二&#xff1a;application.yml 三:分页插件 前言&#xff1a; 本文主要讲解连接sqlserver的配置 一&#xff1a;所需依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> &l…

hutool工具包的实用方法简单介绍

说明&#xff1a;Hutool是一个小而全的Java工具类库&#xff08;详细参考&#xff1a;https://hutool.cn/docs/#/&#xff09;&#xff0c;使用前需要先添加依赖 &#xff08;添加依赖&#xff09; <dependency><groupId>cn.hutool</groupId><artifactId…

Redis从入门到精通进阶篇之持久化RDB

文章目录 RDB持久化工作原理 Redis 6的持久化机制主要有两种&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。本文将详细介绍这两种持久化方式的工作原理和配置要点。 RDB持久化 RDB持久化是将当前进程的数据生成快照…

项目经理,35岁以后就很难再有竞争力了吗?

早上好&#xff0c;我是老原。 知乎热榜上有一个问题吸引了我的注意&#xff1a; 说句公道话&#xff0c;35岁确实是个坎&#xff0c;这个坎在吃青春饭的行业来说&#xff0c;格外明显。 体力和精力都大不如年轻人&#xff0c;从性价比的角度来说&#xff0c;公司还是不会用…