瞎更新,container_cpu_usage_seconds_total{job=“cadvisor“} 怎么没有啦

2023-02-26 14:53:48 浏览数 (1)

一、 基本介绍

1.1 概论

1.1.1 故事背景

今天在同步其他团队的 grafana 监控大盘时,Prometheus 服务报告说不能找到名为 container_cpu_usage_seconds_total{job=“cadvisor”} 的指标,一般来说可能有几个原因。

  1. 可能是 Prometheus 服务没开启
  2. prometheus.yaml文件可能也没有正确配置
  3. 可能是你的操作系统不兼容,有些操作系统并不兼容 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 这个指标,发现区别还是很大的。

  1. kubelet 暴露的 container_cpu_usage_seconds_total 指标,总长度会精简很多,只有1/4的长度
  2. 查询速度也快的多,耗时小于超过 1/3。

原因是 cAdvisor 导出的指标有20多个label,而kubelet 导出的只有10多个label,且整个指标数据总长度大于4倍。

三、找到这个指标的两个办法

  1. 使用 kubelet 的指标
  2. 部署 cAdvisor

3.1 部署 cAdvisor 方式

  1. 查看官方部署教程:https://github.com/google/cadvisor/tree/master/deploy/kubernetes
  2. 添加 service 和 servicemonitor
代码语言:javascript复制
# 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

0 人点赞