[toc]
kubectl top命令解析
1.前言
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
2.使用
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.实现原理
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 时:
