柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

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

image.png

默认情况下,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来显示多个容器的指标监控。image.png

# docker stats  --no-stream --format "table{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"   #当然也可以通过--format指定输出格式

image.png

上面的命令中我们只输出了 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

image.png

#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查看指标。

image.png

#通过访问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 监控查看

容器查看:

image.png


image.png

#点进去就能看到相关图了,图的名称一眼就知道是啥图就不截图说明了。

主机查看:

除了监控容器之外,cAdvisor也提供了对Host的监控。退出Docker Containers,在首页就可以看到如下图所示的Host动态性能数据:

image.png

#自此图往下都是主机的监控图展示哈。

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  

image.png

#通过prometheus的Targets可以看到已经加进来了。

查询一下数据:

image.png

#从上图可以看到已经可以查询出数据了,但是有一点我发现标签太多了,好多比较长我不需要啊,比如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这个标签可以看指标时哪种类型


作者:忙碌的柴少 分类:prometheus 浏览:117 评论:0
留言列表
发表评论
来宾的头像