一、 基本介绍
1.1 概论
1.1.1 故事背景
今天在同步其他团队的 grafana 监控大盘时,Prometheus 服务报告说不能找到名为 container_cpu_usage_seconds_total{job=“cadvisor”} 的指标,一般来说可能有几个原因。
- 可能是 Prometheus 服务没开启
- prometheus.yaml文件可能也没有正确配置
- 可能是你的操作系统不兼容,有些操作系统并不兼容 container_cpu_usage_seconds_total 指标
当然我这里不是以上的问题。我的指标 job label 是 kubelet。
1.1.2 介绍 container_cpu_usage_seconds_total 指标
Container_cpu_usage_seconds_total(CCU)是容器资源监控中非常重要的一个指标,它可以帮助用户诊断容器应用程序的负载情况。它是定期统计容器已使用 CPU 时间总和,确切地计算容器中每个核心总体占用时间。这对于监视容器内运行的应用程序和进程的性能、优化性能以及准备扩展到容器集群和大规模架构来说,都是非常有用的。
通过 CCU,可以使用分析法来发现容器内诸如 CPU 过载、内存问题、roofline 带宽限制以及死锁等其他问题,从而有效地为团队提供解决方案,并提高整体系统的吞吐量和资源利用率。 CCU 提供了一种简单有效的方法,可以帮助开发者跟踪某些特定容器中的 CPU 需求,也可以帮助 SRE/DevOps 团队识别和优化容器中运行的应用程序。
Container_cpu_usage_seconds_total 通过谷歌的 cAdvisor 组件采集。
1.1.3 cAdvisor 容器监控介绍
cAdvisor 是一款能够监视容器性能的开源软件,由 Google 开发并维护。它可以用于监视本地的容器以及远程的容器,监测包括 CPU、内存、文件系统等等指标,并提供实时和历史图表。
cAdvisor 不但可以监督容器,它还可以运行在物理机上面,监控物理机的资源情况。另外,cAdvisor 用来支持 Kubernetes 的资源管理系统,使得 Kubernetes 可以更好地处理容器的管理和调度工作。
注意,坑来了
从 v1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口:
● Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes//metrics
● Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes//metrics/cadvisor
这样,在 Prometheus 等工具中需要使用新的 Metrics API 来获取这些数据,比如下面的 Prometheus 自动配置了 cadvisor metrics API:
helm install stable/prometheus --setrbac.create=true --name prometheus --namespace monitoring
注意:cadvisor 监听的端口将在 v1.12 中删除,建议所有外部工具使用 Kubelet Metrics API 替代。
也就是说,k8s 默认会携带 cadvisor,在 kubelet 上,但是不同版本,他们的 job 会发生变化(存疑?)。我的 k8s 底座版本是 1.18,我的 container_cpu_usage_seconds_total{job=“kubelet”},而不是在 cadvisor。
我独立安装 cAdvisor,这样 container_cpu_usage_seconds_total{job=“cadvisor”} 就能继续出现,也能比较一下他们的差异。
二、kubelet 和 cAdvisor 暴露的指标有什么区别呢
通过部署独立版 cAdvisor,只查询 container_cpu_usage_seconds_total 这个指标,发现区别还是很大的。
- kubelet 暴露的 container_cpu_usage_seconds_total 指标,总长度会精简很多,只有1/4的长度
- 查询速度也快的多,耗时小于超过 1/3。
原因是 cAdvisor 导出的指标有20多个label,而kubelet 导出的只有10多个label,且整个指标数据总长度大于4倍。
三、找到这个指标的两个办法
- 使用 kubelet 的指标
- 部署 cAdvisor
3.1 部署 cAdvisor 方式
- 查看官方部署教程:https://github.com/google/cadvisor/tree/master/deploy/kubernetes
- 添加 service 和 servicemonitor
# service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: cadvisor
name: cadvisor
# 部署的 namespace
namespace: cadvisor
spec:
clusterIP: 10.43.132.12
ports:
- name: metric
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: cadvisor
name: cadvisor
sessionAffinity: None
type: ClusterIP
# serviceMonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
release: monitor
name: cadvisor
# 部署的 namespace
namespace: cadvisor
spec:
endpoints:
- interval: 30s
port: metric
namespaceSelector:
matchNames:
- cadvisor
selector:
matchLabels:
app: cadvisor