Prometheus容器指标采集(四)
一、Docker命令查看容器资源使用情况
1.1 docker stats 帮助说明
# docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...] 显示实时的容器资源使用情况统计流 Options: -a, --all #显示所有容器(默认显示为正在运行) --format string #使用Go模板打印漂亮的images --no-stream #禁用流统计信息,仅获取第一个结果 --no-trunc #不要截断输出
1.2 docker stats 命令使用查看
# docker stats
默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容:
[CONTAINER]:以短格式显示容器的 ID。
[CPU %]:CPU 的使用情况。
[MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。
[MEM %]:以百分比的形式显示内存使用情况。
[NET I/O]:网络 I/O 数据。
[BLOCK I/O]:磁盘 I/O 数据。
[PIDS]:PID 号。
# docker stats --no-stream #只返回执行命令这个时刻的容器状态,只打印一次。
# docker stats --no-stream $(docker ps --format={{.Names}}) #当然也可以这样,只打印一次
# docker stats --no-stream 2c2ab0fcdf61 #只查看id是2c2ab0fcdf61的资源使用状态,当然也可以用NAME字段。
# docker stats --no-stream 2c2ab0fcdf61 3c5bb2e43fed #当然也可以指定多个容器的ID或者NAME来显示多个容器的指标监控。
# docker stats --no-stream --format "table{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" #当然也可以通过--format指定输出格式
上面的命令中我们只输出了 Name, CPUPerc 和 Memusage 三列。下面是自定义的格式中可以使用的所有占位符:
.Container #根据用户指定的名称显示容器的名称或 ID。 .Name #容器名称。 .ID #容器 ID。 .CPUPerc #CPU 使用率。 .MemUsage #内存使用量。 .NetIO #网络 I/O。 .BlockIO #磁盘 I/O。 .MemPerc #内存使用率。 .PIDs #PID 号。
# docker stats --no-stream 2c2ab0fcdf61 --format "{\"container\":\"{{ .Container }}\",\"memory\":{\"raw\":\"{{ .MemUsage }}\",\"percent\":\"{{ .MemPerc }}\"},\"cpu\":\"{{ .CPUPerc }}\"}" #当然也可以指定输出json格式
{"container":"2c2ab0fcdf61","memory":{"raw":"150.5MiB / 15.51GiB","percent":"0.95%"},"cpu":"0.06%"}
1.3 docker system df命令使用
# docker system df
#TYPE表示资源类型:Images是镜像,Containers是容器。
可以看到有68个镜像,磁盘占用了53.45GB,可以释放1.332GB的磁盘空间。
可以看到有211个容器,存活的容器有208个,使用了780.6MB磁盘空间,可以释放416.KB磁盘空间。
#另外需要注意的是:docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚吶。
# docker system df -v #可以看到详细的磁盘使用情况
# du -sh /var/lib/docker/containers/* #也可以查看每一个容器ID实际的磁盘占用,可能你看着磁盘空间比用docker system df -v大很多,是因为这个目录下面有容器的输出日志文件等一下其他东西。
博文来自:www.51niux.com
二、cadvisor采集容器数据
github地址:https://github.com/google/cadvisor
2.1 介绍和安装
介绍:
dokcer stats这种方式比较原始,因为你无法通过 http 的方式来获取数据,而且没有界面,数据可视化还需要做大量的工作。
为了解决docker监控问题,谷歌开源的cadvisor诞生了,cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取。
cAdvisor(Container Advisor)使容器用户了解其运行容器的资源使用情况和性能特征。 它是一个正在运行的守护程序,用于收集,聚合,处理和导出有关正在运行的容器的信息。 具体来说,对于每个容器,它保留资源隔离参数,历史资源使用情况,完整历史资源使用情况的直方图和网络统计信息。 此数据按容器和机器范围导出。cAdvisor具有对Docker容器的本机支持,并且应立即支持几乎所有其他类型的容器。
快速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
# docker ps|grep cadvisor #可以看到此容器已经运行起来了
dcc9fd925641 google/cadvisor:latest "/usr/bin/cadvisor -…" 27 seconds ago Up 26 seconds 0.0.0.0:8080->8080/tcp cadvisor
注意:
在Ret Hat,CentOS, Fedora 等发行版上需要传递如下参数,因为 SELinux 加强了安全策略:--privileged=true开启特权模式,启动后访问:http://IP:8080查看页面,/metric查看指标。
#通过访问web页面,控制台出现了,但是控制台显示的信息其实帮助不大,重点是:http://IP:8080/metrics我们要这个URL地址里面详细的容器的信息。
#docker logs -f cadvisor #在此容器所在的宿主机上面执行此命令查看有没有报错
W0115 03:13:34.690956 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/cpu,cpuacct/libcontainer_10621_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/cpu,cpuacct/libcontainer_10621_systemd_test_default.slice: no such file or directory W0115 03:13:34.691020 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/blkio/libcontainer_10621_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/blkio/libcontainer_10621_systemd_test_default.slice: no such file or directory W0115 03:13:34.699032 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/memory/libcontainer_10621_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): readdirent: no such file or directory W0115 03:13:34.699087 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/devices/libcontainer_10621_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/devices/libcontainer_10621_systemd_test_default.slice: no such file or directory W0115 03:13:44.687317 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/cpu,cpuacct/libcontainer_10669_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/cpu,cpuacct/libcontainer_10669_systemd_test_default.slice: no such file or directory W0115 03:13:44.687377 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/blkio/libcontainer_10669_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/blkio/libcontainer_10669_systemd_test_default.slice: no such file or directory W0115 03:13:44.695307 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/memory/libcontainer_10669_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): readdirent: no such file or directory W0115 03:13:44.695358 1 raw.go:87] Error while processing event ("/sys/fs/cgroup/devices/libcontainer_10669_systemd_test_default.slice": 0x40000100 == IN_CREATE|IN_ISDIR): inotify_add_watch /sys/fs/cgroup/devices/libcontainer_10669_systemd_test_default.slice: no such file or directory
#好多这种报错,就是需要在创建容器的时候需要加上--privileged=true开启特权用户。
#docker stop cadvisor
#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 --privileged=true --name=cadvisor google/cadvisor:latest
#再次查看日志发现已经没有那么多报错了,当然其他问题可以去github的Lssues来查看。
2.2 监控查看
容器查看:
#点进去就能看到相关图了,图的名称一眼就知道是啥图就不截图说明了。
主机查看:
除了监控容器之外,cAdvisor也提供了对Host的监控。退出Docker Containers,在首页就可以看到如下图所示的Host动态性能数据:
#自此图往下都是主机的监控图展示哈。
http://localhost:8080/metrics #这里面有采集的数据
cAdvisor的缺点也非常明显,那就是它的操作界面比较简陋,而且需要多个页面来回跳转。CAdvisor默认只保存2分钟的监控数据,所以需要将数据存储到其他地方或者有其他的工具将数据拿走。
博文来自:www.51niux.com
2.3 与Prometheus集成
修改配置:
修改/etc/prometheus/prometheus.yml,将cAdvisor添加监控数据采集任务目标当中:
- job_name: cadvisor static_configs: - targets: ['192.168.1.137:8080']
# curl -XPOST http://localhost:9090/-/reload
#通过prometheus的Targets可以看到已经加进来了。
查询一下数据:
#从上图可以看到已经可以查询出数据了,但是有一点我发现标签太多了,好多比较长我不需要啊,比如image啊,id啊等等。
下面表格中列举了一些CAdvisor中获取到的典型监控指标:
container_cpu_load_average_10s #gauge类型,过去10秒容器CPU的平均负载 container_cpu_usage_seconds_total #counter类型,容器在每个CPU内核上的累积占用时间 (单位:秒) container_cpu_system_seconds_total #counter类型,System CPU累积占用时间(单位:秒) container_cpu_user_seconds_total #counter类型,User CPU累积占用时间(单位:秒) container_fs_usage_bytes #gauge类型,容器中文件系统的使用量(单位:字节) container_fs_limit_bytes #gauge类型,容器可以使用的文件系统总量(单位:字节) container_fs_reads_bytes_total #counter类型,容器累积读取数据的总量(单位:字节) container_fs_writes_bytes_total #counter类型,容器累积写入数据的总量(单位:字节) container_memory_max_usage_bytes #gauge类型,容器的最大内存使用量(单位:字节) container_memory_usage_bytes #gauge类型,容器当前的内存使用量(单位:字节) container_spec_memory_limit_bytes #gauge类型,容器的内存使用量限制 machine_memory_bytes #gauge类型,当前主机的内存总量 container_network_receive_bytes_total #counter类型,容器网络累积接收数据总量(单位:字节) container_network_transmit_bytes_total #counter类型,容器网络累积传输数据总量(单位:字节)
kubernetes中使用:
Daemonset部署: 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 替代。
Kubernetes 社区提供了一些列的工具来监控容器和集群的状态,并借助 Prometheus 提供告警的功能:
cAdvisor #负责单节点内部的容器和节点资源使用统计,内置在 Kubelet 内部,并通过 Kubelet /metrics/cadvisor 对外提供 API InfluxDB #是一个开源分布式时序、事件和指标数据库;而 Grafana 则是 InfluxDB 的 Dashboard,提供了强大的图表展示功能。它们常被组合使用展示图表化的监控数据。 metrics-server #提供了整个集群的资源监控数据,但要注意 Metrics API 只可以查询当前的度量数据,并不保存历史数据 Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据 kube-state-metrics 提供了 Kubernetes 资源对象(如 DaemonSet、Deployments 等)的度量。 Prometheus 是另外一个监控和时间序列数据库,还提供了告警的功能。 Node Problem Detector 监测 Node 本身的硬件、内核或者运行时等问题。 Heapster提供了整个集群的资源监控,并支持持久化数据存储到 InfluxDB 等后端存储中(已弃用)
除了以上监控工具,还有很多其他的开源或商业系统可用来辅助监控,如Sysdig,Weave scope,Datadog,Sematext
去掉一些没用的标签:
- job_name: cadvisor metrics_path: '/metrics' #指定url的path当然默认也是这个 static_configs: - targets: ['192.168.1.137:8080'] metric_relabel_configs: - regex: '(container_label_annotation_io_kubernetes_container_hash|container_label_annotation_io_kubernetes_container_ports|container_label_annotation_io_kubernetes_container_restartCount|container_label_annotation_io_kubernetes_container_terminationMessagePath|container_label_annotation_io_kubernetes_container_terminationMessagePolicy|container_label_annotation_io_kubernetes_pod_terminationGracePeriod|container_label_io_kubernetes_container_logpath|container_label_io_kubernetes_pod_uid|container_label_io_kubernetes_sandbox_id|container_label_controller_revision_hash)' action: labeldrop
# curl -XPOST http://localhost:9090/-/reload #过一小会再刷新就会发现好多标签已经被删掉了。
#另外container_label_io_kubernetes_docker_type这个标签可以看指标时哪种类型