metrics-server监控资源使用情况
- k8s
- 6天前
- 42热度
- 0评论
一、简介
kubectl top是经常使用的基础命令,但是必须需要部署metrics-server组件,才能获取到监控值。
https://github.com/kubernetes-sigs/metrics-server
版本矩阵 Matrix
Metrics Server | Metrics API group/version | Supported Kubernetes version |
---|---|---|
0.7.x | metrics.k8s.io/v1beta1 |
1.19+ |
0.6.x | metrics.k8s.io/v1beta1 |
1.19+ |
0.5.x | metrics.k8s.io/v1beta1 |
*1.8+ |
0.4.x | metrics.k8s.io/v1beta1 |
*1.8+ |
0.3.x | metrics.k8s.io/v1beta1 |
1.8-1.21 |
二、部署
使用kubectl一键部署:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
添加参数:
--kubelet-insecure-tls
三、使用情况
使用kubectl top命令查看node、pod的实时资源使用情况:如CPU、内存。
[root@k8s-master01 ~]# k top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 1380m 17% 8558Mi 54%
k8s-master02 880m 11% 9316Mi 59%
k8s-worker01 621m 1% 113147Mi 43%
k8s-worker02 1880m 2% 131715Mi 25%
k8s-worker05 21641m 33% 74000Mi 57%
k8s-worker06 908m 2% 70660Mi 54%
k8s-worker07 1957m 4% 108652Mi 42%
k8s-worker08 5168m 8% 70949Mi 55%
k8s-worker11 38454m 60% 40226Mi 31%
k8s-worker12 694m 1% 26864Mi 42%
k8s-worker13 39972m 71% 36740Mi 57%
k8s-worker14 20239m 36% 33198Mi 52%
k8s-worker15 38953m 69% 30740Mi 48%
k8s-worker16 1516m 2% 24857Mi 38%
k8s-worker18 753m 1% 42866Mi 44%
k8s-worker19 20469m 42% 46428Mi 48%
k8s-worker20 40093m 83% 43096Mi 44%
k8s-worker22 9570m 34% 41221Mi 42%
k8s-worker23 5515m 19% 26344Mi 27%
k8s-worker24 3842m 13% 27770Mi 28%
指标的具体含义:
- 这里CPU 的m 和 memory 的 mi 与k8s中 request、limit是一致的,cpu单位的100m=0.1 内存单位 1MI=1204Ki。
- pod的内存值是其内存的实际使用量,也是做limit限制时判断oom的依据。pod的使用量等于其所有业务容器的综合,但是不包含pause容器。与Cadvisr中的container_memory_working_set_bytes 指标值相等。
- node的值并不等于该node上所有pod值的总和,也不等于直接在机器上执行top或free所得到的值。
内存计算方法:
每次启动 pod,都会有一个 pause 容器,既然是容器就一定有资源消耗(一般在 2-3M 的内存),cgroup 文件中,业务容器和 pause 容器都在同一个 pod的文件夹下。
但 cadvisor 在查询 pod 的内存使用量时,是先获取了 pod 下的container列表,再逐个获取container的内存占用,不过这里的 container 列表并没有包含 pause,因此最终 top pod 的结果也不包含 pause 容器。
接口获取的数据:
kubelet代码中实际集成了采集指标的cAdvisor模块,可以通过kubelet暴露的10250端口获取监控数据。
- Kubelet Summary metrics: 127.0.0.1:10250/metrics,暴露 node、pod 汇总数据。
- Cadvisor metrics: 127.0.0.1:10250/metrics/cadvisor,暴露 container 维度数据。
kubelet虽然提供了 metric 接口,但实际监控逻辑由内置的cAdvisor模块负责。
cAdvisor由谷歌开源,使用go语言开发。项目地址:https://github.com/google/cadvisor。
cadvisor不仅可以搜集一台机器上所有运行的容器信息,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况,还提供基础查询界面和http接口,方便其他组件进行数据抓取。在K8S中集成在Kubelet里作为默认启动项,k8s官方标配。
cadvisor获取指标时实际调用的是 runc/libcontainer库,而libcontainer是对 cgroup文件 的封装,即 cadvsior也只是个转发者,它的数据来自于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、内存、磁盘、网络等信息。