构建Docker容器监控系统

在对容器进行测试和运维的过程中,经常需要对其进行监控,监控信息的主要来源就是日志。

Prometheus

Prometheus 是系统监控常用的工具。该项目最初是在SoundCloud上进行构建,由前google员工开发。为了让项目得到更多的关注,也是为了吸引更多的开发者对其进行完善,项目的开发者于 2012年对其进行开源,并于2016年加入CNCF,从而使其成为了继k8s之后的第二个托管项目。

Prometheus主要有以下特性:

  1. 多维数据模型:每条数据是包括度量名称和健值对标示的时间序列数据。例如对docker系统进行监控的过程中,获得了一下数据,其中metrics为container_cpu_user_seconds_total,一个健值对为image="goharbor/harbor-portal:v1.9.1"

container_cpu_user_seconds_total{container_label_build_date="20190906",container_label_com_docker_compose_config_hash="e9b74016b82d3dcef80df09387bcea54c6f96c1727a18a4df88bdcb4e9e4e8e4",container_label_com_docker_compose_container_number="1",container_label_com_docker_compose_oneoff="False",container_label_com_docker_compose_project="harbor",container_label_com_docker_compose_service="portal",container_label_com_docker_compose_version="1.24.1",container_label_maintainer="",container_label_name="Photon OS 2.0 Base Image",container_label_vendor="VMware",id="/docker/b84902ed5f168c2e17e9fca0328d5bbe12c87a7a24e646bc514715d46e5965f1",image="goharbor/harbor-portal:v1.9.1",name="harbor-portal"} 60.99

  1. PromSQL:灵活性查询语言,可以利用多维数据完成复杂的查询。
  2. 不依赖分布式存储,单个服务器节点可以直接工作。对部署环境的要求较低。
  3. 基于Http的pull方式采集时间序列数据。很多监控对象本身没有提供http的接口,Prometheus的生态系统中有许多工具可以为其他形式的日志提供http接口。
  4. 推送时间序列数据通过PushGateway组件支持,临时性的任务,减少开销。
  5. 通过服务发现或静态配置发现目标,在k8s中较为常用。
  6. 多种图形模式及仪表盘支持。事实上,Prometheus本身的仪表盘并不是很出众,可以通过集成其他的工具取得更加丰富生动的展示效果。

架构

pro_framework.png

short-lived jobs:短任务。
jobs/exporters:长期任务,可以用于收集nginx,mysql等服务的日志。
service discovery:自动发现监控对象,在k8s中经常使用。
Alertmanager:用于报警。Prometheus本身不支持报警,需要集成其他插件。
promQL:基于promQL,可以通过grafana增强展示效果。

用docker安装Prometheus

docker pull prom/Prometheus

运行容器

docker run -d -p 9090:9090 prom/Prometheus

此时容器还不能使用,因为还没有为其提供配置文件。可以从容器内copy出配置文件:

cd /opt
docker cp :/etc/prometheus/prometheus.yml ./

删除原容器,并重新启动,这一次将本地的配置文件bind入容器:

docker run -d -p 9090:9090 -v /opt/prometheus.yml:/etc/prometheus/prometheus.yml  prom/prometheus

配置文件的主要内容:
global:全局配置,采集时间间隔等等

global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.

rules:阈值有没有达到,如果阈值达到就报警

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

默认情况下,Prometheus监控自己。

访问

http://:9090/


prom_ui.png
  • alerts:报警
  • graph:SQL语句
  • Status:pro本身的情况

cAdvisor

Prometheus不支持直接采集docker容器内日志 ,因为它只能从http接口获得信息,而docker容器默认情况下不提供日志的http接口。cAdvisor(container advisor)是Google的开源项目,用于收集正在运行的容器资源使用和性能信息,并对外提供http接口。

docker安装

docker run   --volume=/:/rootfs:ro   --volume=/var/run:/var/run:ro   --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

访问UI

http://:8080/


cAdvisor_ui.png

HTTP API

http://:8080/metrics

修改Prometheus的配置文件/opt/prometheus.yml,添加一个job

- job_name: 'docker'
static_configs:
- targets: [':8080']
static_configs表示是手动配置。

重启Prometheus容器

docker restart 8a8d08043423

重新访问Prometheus,中已经能看到容器的metrics了:


prom_docker.png

Grafana

Grafana是一个开源的度量分析和可视化系统。

Docker安装

docker run -d --name=grafana -p 3000:3000 grafana/grafana

访问UI

http://:3000/


grafana_ui.png

登录并修改管理员密码:
admin/admin->admin/Welcome1@

添加数据源

data sources,

  1. 选择prom
  2. http url http://:9090
  3. save & test

还可以添加各种各样的数据源

grafana_dbsource.png

添加仪表盘

create->dashboard
可以导入模版,Grafana官网提供了许多模版以供使用。
https://grafana.com/grafana/dashboards
这里我选择了
https://grafana.com/grafana/dashboards/193
现在可以在Grafana的dashboard中看到和修改视图了:

grafana_edit.png

【1】https://prometheus.io/
【2】https://github.com/google/cadvisor
【3】https://grafana.com/

你可能感兴趣的:(构建Docker容器监控系统)