Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >kubectl top 命令解析

kubectl top 命令解析

作者头像
我是阳明
发布于 2020-06-15 10:11:03
发布于 2020-06-15 10:11:03
31.6K00
代码可运行
举报
文章被收录于专栏:k8s技术圈k8s技术圈
运行总次数:0
代码可运行

原文链接:http://www.xuyasong.com/?p=1781

一. 前言

kubectl top 可以很方便地查看node、pod 的实时资源使用情况:如CPU、内存。这篇文章会介绍其数据链路和实现原理,同时借 kubectl top 阐述 k8s 中的监控体系,窥一斑而知全豹。最后会解释常见的一些问题:

  • kubectl top 为什么会报错?
  • kubectl top node 怎么计算,和节点上直接 top 有什么区别?
  • kubectl top pod 怎么计算,包含 pause 吗?
  • kubectl top pod 和exec 进入 pod 后看到的 top 不一样?
  • kubectl top pod 和 docker stats得到的值为什么不同?

以下命令的运行环境为:

  • k8s 1.8
  • k8s 1.13

二. 使用

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 看到的值

三. 实现原理

3.1 数据链路

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

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

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

这里可以对比下 kubect get pod 时的日志:

3.2 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

3.3 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 时:

3.4 监控体系

在提出 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,实现和核心指标同样的效果。

3.5 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 提供

到这里为止,k8s 范围内的监控体系就结束了。

3.6 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 文件。

3.7 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、内存、磁盘、网络等信息:

如 memory 下的几个常用的指标含义:

memory.stat 中的信息是最全的:

原理到这里结束,这里解释下最开始的 kubectl top 的几个问题:

四. 问题

4.1 kubectl top 为什么会报错

一般情况下 top 报错有以下几种,可以 kubectl top pod -v=10看到具体的调用日志:

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

4.2 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。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rss + cache = (in)active_anon + (in)active_file

4.4 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

4.5 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:计算逻辑是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 来做接口转换,具体参考 pr:https://github.com/kubernetes/dashboard/pull/3504

六. 参考资料

  • https://github.com/kubernetes-sigs/metrics-server/issues/193
  • https://github.com/kubernetes/kubernetes/pull/83247
  • https://www.cnblogs.com/liuhongru/p/11215447.html
  • https://github.com/DirectXMan12/k8s-prometheus-adapter/blob/master/docs/walkthrough.md#quantity-values
  • https://github.com/fabric8io/kansible/blob/master/vendor/k8s.io/kubernetes/docs/design/resources.md
  • https://erdong.site/linux/system/computer-unit-conversion.html
  • https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-cpu
  • https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/resource_management_guide/sec-memory
  • https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
  • https://www.cnblogs.com/liuhongru/p/11215447.html
  • https://github.com/moby/moby/issues/10824
  • https://github.com/docker/cli/pull/80
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes学习笔记(一)
Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APISer ver处理后再提交给Etcd存储。
用户10662715
2025/04/24
730
kubernetes监控架构核心组件Metrics-server
如何查看各节点的资源使用情况? 如何监控kubernetes集群资源?自kubernetes 1.8开始,资源使用指标(如容器 CPU 和内存使用率)通过 Metrics API 在 Kubernet
公众号: 云原生生态圈
2021/11/15
1.6K0
kubernetes监控架构核心组件Metrics-server
Prometheus性能调优-什么是高基数问题以及如何解决?
•PrometheusMissingRuleEvaluations•PrometheusRuleFailures
东风微鸣
2022/12/01
2.2K0
Prometheus性能调优-什么是高基数问题以及如何解决?
Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据
Kubernetes 从 v1.8 开始,资源使用情况的监控可以通过 Metrics API 的形式获取,具体的组件为 Metrics Server,用来替换之前的 Heapster,Heapster从 v1.11 开始逐渐被废弃。
玖柒的小窝
2021/10/23
4760
Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据
K8s监控之Metrics-Server指标获取链路分析
Metrics-server基于cAdvisor收集指标数据,获取、格式化后以metrics API的形式从apiserver对外暴露,核心作用是为kubectl top以及HPA等组件提供决策指标支持。
壹贝
2022/11/30
4.1K1
「走进k8s」Kubernetes1.15.1的Pod 自动扩缩容(23)
1. 用于支持自动扩缩容的 CPU/memory HPA metrics:metrics-server;2. 通用的监控方案:使用第三方可以获取 Prometheus 格式监控指标的监控系统,如 Prometheus Operator;3. 事件传输:使用第三方工具来传输、归档 kubernetes events;
IT架构圈
2019/08/23
2.8K0
kubernetes(十六) k8s 弹性伸缩
常规的做法是给集群资源预留保障集群可用,通常20%左右。这种方式看似没什么问题,但放到Kubernetes中,就会发现如下2个问题。
alexhuiwang
2020/09/23
3.6K0
kubernetes(十六) k8s 弹性伸缩
09 Jan 2024 在kind中部署metrics-server
你会发现不work,需要在metrics-server的deployment中args部分添加一行- --kubelet-insecure-tls,让kubelet忽略tls证书验证,这样才能正常工作。
俊采
2024/01/10
1850
Metrics Server 部署
从Kubernetes 1.8开始,资源使用指标(如容器 CPU 和内存使用率)通过Metrics API在 Kubernetes 中获取, Metrics Server 替代了Heapster。Metrics Server 实现了Resource Metrics API,Metrics Server 是集群范围资源使用数据的聚合器。Metrics Server 从每个节点上的 Kubelet 公开的Summary API中采集指标信息
YP小站
2020/06/04
1.6K0
腾讯云TKE-Metrics-Server案例: TKE中自建Metrics-Server问题
用户想在TKE环境中自己部署metrics-server去获取监控数据, 想对监控系统有更多的控制权,好多用户会选择在TKE中自己部署一套Metrics-Server + Prometheus + Grafana
朱瑞卿
2020/10/24
1.3K0
kubernetes 指标采集组件 metrics-server 的部署
metrics-server 是一个采集集群中指标的组件,类似于 cadvisor,在 v1.8 版本中引入,官方将其作为 heapster 的替代者,metric-server 属于 core metrics(核心指标),提供 API metrics.k8s.io,仅可以查看 node、pod 当前 CPU/Memory/Storage 的资源使用情况,也支持通过 Metrics API 的形式获取,以此数据提供给 Dashboard、HPA、scheduler 等使用。
田飞雨
2019/12/18
3.8K0
kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行
kubernetes监控指标大体可以分为两类:核心监控指标和自定义指标,核心监控指标是kubernetes内置稳定可靠监控指标,早期由heapster完成,现由metric-server实现;自定义指标用于实现核心指标的扩展,能够提供更丰富的指标支持,如应用状态指标,自定义指标需要通过Aggregator和k8s api集成,当前主流通过promethues实现。
HappyLau谈云计算
2020/01/22
6K2
kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行
kubernetes | metrics-server部署
基于centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0
Amadeus
2022/10/25
9810
kubernetes | metrics-server部署
TKE上部署metrics-server
修改对应的metrics-server-deployment.yaml文件,需要改镜像源,国外的镜像需要科学上网下载,还需要添加如下参数
聂伟星
2020/08/13
1.2K0
Kubernetes 集群部署 Metrics Server 获取集群 Metric 数据
Kubernetes 从 v1.8 开始,资源使用情况的监控可以通过 Metrics API 的形式获取,具体的组件为 Metrics Server,用来替换之前的 Heapster,Heapster从 v1.11 开始逐渐被废弃。
高楼Zee
2021/10/27
3.4K1
揭开K8s适配CgroupV2内存虚高的迷局
在Almalinux替换CentOS的过程中,我们通过kubectl top nodes命令观察到了两个相同规格的节点(只有cgroup版本不同)。在分别调度两个相同的Pod后,我们预期它们的内存使用量应该相近。然而,我们发现使用了cgroupv2的节点的内存使用量比使用了cgroupv1的节点多了约280Mi。
zouyee
2023/11/15
7420
揭开K8s适配CgroupV2内存虚高的迷局
Kubernetes运维之容器编排Deployment动态扩缩容
HPA(Horizontal Pod Autoscaler)的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。
王先森sec
2023/04/24
1.2K0
Kubernetes运维之容器编排Deployment动态扩缩容
聊聊docker容器的memory限制
所谓Cache,就是为了弥补高速设备和低速设备之间的矛盾而设立的一个中间层。 缓冲(Buffer)是根据磁盘的读写设计的,它把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
code4it
2024/04/08
4440
Prometheus 如何做到“活学活用”,大牛总结的避坑指南
监控系统的历史悠久,是一个很成熟的方向,而 Prometheus 作为新生代的开源监控系统,慢慢成为了云原生体系的事实标准,也证明了其设计很受欢迎。
民工哥
2020/09/15
9080
Prometheus 如何做到“活学活用”,大牛总结的避坑指南
浅谈 Kubernetes Metrics Server
1、Metrics Servrer 原理介绍 1.1、Metrics Server 概念和功能 概念 Metrics Server 是 Kubernetes 集群核心监控数据的聚合器,Metrics Server 从 Kubelet 收集资源指标,并通过 Merics API 在 Kubernetes APIServer 中提供给缩放资源对象 HPA 使用。也可以通过 Metrics API 提供的 Kubectl top 查看 Pod 资源占用情况,从而实现对资源的自动缩放。 功能 主要是基于 Kuber
用户5166556
2020/06/01
4.4K0
推荐阅读
相关推荐
Kubernetes学习笔记(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验