容器监控实践—cAdvisor

news/2024/7/7 11:12:17

概述

为了解决docker stats的问题(存储、展示),谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。

cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况

Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。

安装

  • 1.使用二进制部署
下载二进制:https://github.com/google/cadvisor/releases/latest
本地运行:./cadvisor  -port=8080 &>>/var/log/cadvisor.log
  • 2.使用docker部署
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest
注意:

在Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:

--privileged=true
  
启动后访问:http://127.0.0.1:8080查看页面,/metric查看指标

* 常见指标:http://yjph83.iteye.com/blog/2394091
* 指标分析:https://luoji.live/cadvisor/cadvisor-source-code-metrics-20160927.html`
  • 3.kubernetes中使用
* Daemonset部署: https://github.com/google/cadvisor/tree/master/deploy/kubernetes
* kubelet自带cadvisor监控所有节点,可以设置--cadvisor-port=8080指定端口(默认为4194)
* kubernetes 在2015-03-10 这个提交(Run cAdvisor inside the Kubelet. Victor Marmol 2015/3/10 13:39)中cAdvisor开始集成在kubelet中,目前的1.6及以后均存在

注意:

从 v1.7 开始,Kubelet metrics API 不再包含 cadvisor metrics,而是提供了一个独立的 API 接口:

* Kubelet metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics

* Cadvisor metrics: http://127.0.0.1:8001/api/v1/proxy/nodes/<node-name>/metrics/cadvisor

cadvisor 监听的端口将在 v1.12 中删除,建议所有外部工具使用 Kubelet Metrics API 替代。

常用搭配

1.cAdvisor+Heapster+influxdb

Heapster:在k8s集群中获取metrics和事件数据,写入InfluxDB,heapster收集的数据比cadvisor多,却全,而且存储在influxdb的也少。

Heapster将每个Node上的cAdvisor的数据进行汇总,然后导到InfluxDB。

Heapster的前提是使用cAdvisor采集每个node上主机和容器资源的使用情况,
再将所有node上的数据进行聚合。

这样不仅可以看到Kubernetes集群的资源情况,
还可以分别查看每个node/namespace及每个node/namespace下pod的资源情况。
可以从cluster,node,pod的各个层面提供详细的资源使用情况。
  • InfluxDB:时序数据库,提供数据的存储,存储在指定的目录下。
  • Grafana:提供了WEB控制台,自定义查询指标,从InfluxDB查询数据并展示。

cAdvisor+Prometheus+Grafana

访问http://localhost:8080/metrics,可以拿到cAdvisor暴露给 Prometheus的数据

其他内容参考后续的prometheus文章

深入解析

cAdvisor结构图

cadvisor地址:https://github.com/google/cad...

主函数逻辑:(cadvisor/cadvisor.go)

通过new出来的memoryStorage以及sysfs实例,创建一个manager实例,manager的interface中定义了许多用于获取容器和machine信息的函数

核心函数:

生成manager实例的时候,还需要传递两个额外的参数,分别是

  • maxHousekeepingInterval:存在内存的时间,默认60s
  • allowDynamicHousekeeping:是否允许动态配置housekeeping,也就是下一次开始搜集容器信息的时间,默认true

因为需要暴露服务,所以在handler文件中,将上面生成的containerManager注册进去(cadvisor/http/handler.go),之后就是启动manager,运行其Start方法,开始搜集信息,存储信息的循环操作。

以memory采集为例:

具体的信息还是通过runc/libcontainer获得,libcontainer是对cgroup的封装。在/sys/fs/cgroup/memory中包含大量的了memory相关的信息(参考docker原生监控文章)

Prometheus的收集器(cadvisor/metrics/prometheus.go)

更多源码参考文章:https://luoji.live/categories...

总结

优缺点:

  • 优点:谷歌开源产品,监控指标齐全,部署方便,而且有官方的docker镜像。
  • 缺点:是集成度不高,默认只在本地保存1分钟数据,但可以集成InfluxDB等存储

备注:

爱奇艺参照cadvisor开发的dadvisor,数据写入graphite,
等同于cadvisor+influxdb,但dadvisor并没有开源

本文为容器监控实践系列文章,完整内容见:container-monitor-book


http://www.niftyadmin.cn/n/2246207.html

相关文章

染陌足迹——SeeConf2019

水文预警&#xff01;&#xff01;多图预警&#xff01;&#xff01; 听了一整天&#xff0c;每位讲师的演讲都十分精彩&#xff0c;每个主题都能给我从另一个角度的思考与启迪&#xff0c;大部分主题都是以未来的交互设计作为维度来展开思考与探讨&#xff0c;以故事或者事例的…

Java的四种线程池的使用,以及自定义线程工厂

四种线程池四种线程池分别是&#xff1a;newCachedThreadPool、newFixedThreadPool 、newScheduledThreadPool 和newSingleThreadExecutor &#xff0c;下面对这几个线程池一一讲解。newCachedThreadPool&#xff1a;可缓存的线程池源码&#xff1a;public static ExecutorServ…

30K iOS程序员的简述:如何快速进阶成为高级开发人员 ...

前言&#xff1a; 本篇文章适用于所有在这个行业已经有了几年时间后想要在职业生涯中取得突破的开发人员&#xff0c;编程人员和程序员&#xff08;或者你可能刚刚开始&#xff0c;但希望你能看到你的路径&#xff09; 本文适合那些有着简单愿望的人&#xff1a;你想成为一名高…

初涉Windows Mobile 5.0的开发(起步篇)[Teaks]

这个周末构建了Windows Mobile 5.0的开发环境&#xff0c;也简单测试了一下&#xff0c;算是起步吧&#xff0c;下面是简要步骤&#xff1a; 工欲善其事&#xff0c;必先利其器。首先安装工具 1. 安装Visual Studio 2005 2.开发工具包, 我下的是800多M的那个&#xff0c;Window…

用Kotlin写一个基于Spring Boot的RESTful服务

Spring太复杂了&#xff0c;配置这个东西简直就是浪费生命。尤其在没有什么并发压力&#xff0c;随便搞一个RESTful服务 让整个业务跑起来先的情况下&#xff0c;更是么有必要纠结在一堆的XML配置上。显然这么想的人是很多的&#xff0c;于是就 有了Spring Boot。又由于Java 8太…

(原創) array傳進function該怎麼寫才好? (.NET) (C#)

Abstract在C/C&#xff0c;array傳進function有很多技巧&#xff0c;但在C#&#xff0c;卻非常的單純&#xff0c;因為array自帶GetLength()&#xff0c;本篇主要是針對C/C做比較。 Introduction 1/**//* 2(C) OOMusou 2007 http://oomusou.cnblogs.com 3 4Filename : Arra…

POJ2251---Dungeon Master---BFS最短路之三维迷宫

题目链接&#xff1a;http://poj.org/problem?id2251 题目大意&#xff1a;这个题是BFS的典型模板题&#xff0c;只不过有趣的是它将图形由平面变为了三维立体图形&#xff0c; 自认为难点在输入上&#xff0c;采用三维字符数组&#xff0c;三层循环&#xff0c;最外层循环对…

lex 命令

用途 生成一个与输入流的简单语法分析相匹配的 C 或 C 语言程序。 语法 lex [ -C ] [ -t ] [ -v| -n ] [ File... ] 描述 lex 命令读取 File 或标准输入&#xff0c;生成 C 语言程序并将它写到一个名为 lex.yy.c 的文件中。这个文件&#xff0c;lex.yy.c ,是一个兼容的 C 语言的…