image
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得到的值为什么不同?
以下命令的运⾏环境为:
image
kubectl top pod: 查看 pod 的使⽤情况
image
不指定pod 名称,则显⽰命名空间下所有 pod,--containers可以显⽰ pod 内所有的container
image
和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 看到的值
三. 实现原理
image
⽽使⽤ metrics-server 时:apiserver是通过/apis/metrics.k8s.io/的地址访问metric
image
这⾥可以对⽐下kubect get pod时的⽇志:
image
3.2 metric api
可以发现,heapster使⽤的是 proxy 转发,⽽ metric-server 和普通 pod都是使⽤ api/xx 的资源接⼝,heapster采⽤的这种 proxy ⽅式是
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 版本默认没开启,你可以加上这些配置
scraper
来开启。他的核⼼功能是动态注册、发现汇总、安全代理。
image
如metric-server注册 pod 和 node 时:
image
3.4 监控体系
image
核⼼指标只包含node和pod的cpu、内存等,⼀般来说,核⼼指标作HPA已经⾜够,但如果想根据⾃定义指标:如请求qps/5xx错误数来实现HPA,就需要使⽤⾃定义指标了。
⽬前Kubernetes中⾃定义指标⼀般由Prometheus来提供,再利⽤k8s-prometheus-adpater聚合到apiserver,实现和核⼼指标(metric-server)同样的效果。
3.5 kubelet
前⾯提到,⽆论是 heapster还是 metric-server,都只是数据的中转和聚合,两者都是调⽤的 kubelet 的 api 接⼝获取的数据,⽽ kubelet 代码中实际采集指标的是 cadvisor 模块,你可以在 node 节点访问 10255 端⼝ (read-only-port)获取监控数据:
Kubelet Summary metrics: 127.0.0.1:10255/metrics,暴露 node、pod 汇总数据
Cadvisor metrics: 127.0.0.1:10255/metrics/cadvisor,暴露 container 维度数据
image
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范围内的监控体系就结束了,如果你想继续了解cadvisor和 cgroup 的内容,可以向下阅读

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。