在对容器进行测试和运维的过程中,经常需要对其进行监控,监控信息的主要来源就是日志。
Prometheus
Prometheus 是系统监控常用的工具。该项目最初是在SoundCloud上进行构建,由前google员工开发。为了让项目得到更多的关注,也是为了吸引更多的开发者对其进行完善,项目的开发者于 2012年对其进行开源,并于2016年加入CNCF,从而使其成为了继k8s之后的第二个托管项目。
Prometheus主要有以下特性:
- 多维数据模型:每条数据是包括度量名称和健值对标示的时间序列数据。例如对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
- PromSQL:灵活性查询语言,可以利用多维数据完成复杂的查询。
- 不依赖分布式存储,单个服务器节点可以直接工作。对部署环境的要求较低。
- 基于Http的pull方式采集时间序列数据。很多监控对象本身没有提供http的接口,Prometheus的生态系统中有许多工具可以为其他形式的日志提供http接口。
- 推送时间序列数据通过PushGateway组件支持,临时性的任务,减少开销。
- 通过服务发现或静态配置发现目标,在k8s中较为常用。
- 多种图形模式及仪表盘支持。事实上,Prometheus本身的仪表盘并不是很出众,可以通过集成其他的工具取得更加丰富生动的展示效果。
架构
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 <CONTAINER_ID>:/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://<HOSTNAME>:9090/
- 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://<HOSTNAME>:8080/
HTTP API
http://<HOSTNAME>:8080/metrics
修改Prometheus的配置文件/opt/prometheus.yml,添加一个job
- job_name: 'docker'
static_configs:
- targets: ['<HOSTNAME>:8080']
static_configs表示是手动配置。
重启Prometheus容器
docker restart 8a8d08043423
重新访问Prometheus,中已经能看到容器的metrics了:
Grafana
Grafana是一个开源的度量分析和可视化系统。
Docker安装
docker run -d --name=grafana -p 3000:3000 grafana/grafana
访问UI
http://<HOSTNAME>:3000/
登录并修改管理员密码:
admin/admin->admin/Welcome1@
添加数据源
data sources,
- 选择prom
- http url http://<HOSTNAME>:9090
- save & test
还可以添加各种各样的数据源
添加仪表盘
create->dashboard
可以导入模版,Grafana官网提供了许多模版以供使用。
https://grafana.com/grafana/dashboards
这里我选择了
https://grafana.com/grafana/dashboards/193
现在可以在Grafana的dashboard中看到和修改视图了:
【1】https://prometheus.io/
【2】https://github.com/google/cadvisor
【3】https://grafana.com/