Linux——Docker监控

Docker监控

轻量级的系统监控程序

一、sysdig

运行sysdig容器

[root@docker ~]# docker  pull sysdig/sysdig
[root@docker ~]# docker run -it --rm --name sysdig --privileged=true --volume=/var/run/docker.sock:/host/var/run/docker.sock  --volume=/dev:/host/dev --volume=/proc:/host/proc:ro --volume=/boot:/host/boot:ro --volume=/lib/modules:/host/lib/modules:ro --volume=/usr:/host/usr:ro sysdig/sysdig

下载插件失败后可以运行下边的命令,重新下载

root@358c10c2ca15:/# sysdig-probe-loader 

下载成功之后,可以运行sysdig命令,查看监控项

root@358c10c2ca15:/# csysdig

Linux——Docker监控_第1张图片

二、Weave Scope

图形化的显示,能够直观的看到容器资源使用情况,便于理解,监控和控制容器

  • scope可以监控单台dockerhost,也可以监控多台的dockerhost,监控效果只需在运行scope launch 本机IP地址 其他IP地址 , 不过需要注意的是如果是多台的dockerhost,在运行前,保证主机名不能冲突,区别主机名.
  • 此服务会将宿主机的4040端口打开,然后虽然说使用此服务的人员可以访问,但,同样,如果是集群外的其他IP地址,也能够访问此服务,而且scope目前没有关于USER访问限制。所以,想要使用此服务,必须严格管理宿主机的4040端口的访问。而且最好,将默认的端口进行修改。
[root@docker ~]# curl -L git.io/scope -o /usr/local/bin/scope
[root@docker ~]# chmod  a+x /usr/local/bin/scope 
[root@docker ~]# scope  launch
Unable to find image 'weaveworks/scope:1.13.1' locally
1.13.1: Pulling from weaveworks/scope
c9b1b535fdd9: Pull complete 
550073704c23: Pull complete 
8738e5bbaf1d: Pull complete 
0a8826d26027: Pull complete 
387c1aa951b4: Pull complete 
e72d45461bb9: Pull complete 
75cc44b65e98: Pull complete 
11f7584a6ade: Pull complete 
a5aa3ebbe1c2: Pull complete 
7cdbc028c8d2: Pull complete 
Digest: sha256:4342f1c799aba244b975dcf12317eb11858f9879a3699818e2bf4c37887584dc
Status: Downloaded newer image for weaveworks/scope:1.13.1
dd8502a30203e4c17604ce589fe21413103d4977632321892315359233b1fb43
Scope probe started
Weave Scope is listening at the following URL(s):
  * http://192.168.122.1:4040/
  * http://192.168.1.40:4040/

Linux——Docker监控_第2张图片

三 、Prometheus(普鲁米修斯)

Prometheus官网

组件 说明
Prometheus Server 普罗米修斯的主服务器
NodeEXporter 负责收集Host硬件信息和操作系统信息
cAdvisor 负责收集Host上运行的容器信息
Grafana 负责展示普罗米修斯监控界面

环境:

主机名称 IP地址 安装组件
machine(主服务器) 192.168.1.40 NodeEXporter、cAdvisor、Prometheus Server、Grafana
node01 192.168.1.41 NodeEXporter、cAdvisor
node02 192.168.1.42 NodeEXporter、cAdvisor

1. 部署node-EXporter,和cAdvisor

所有服务器都部署

[root@docker ~]# docker run -d --name node-EXporter -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

PS:注意,这里使用了–net=host,这样Prometheus Server可以直接与Node-EXporter通信。

Linux——Docker监控_第3张图片

2.部署安装cAdvisor

所有服务器都部署

[root@docker ~]# docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor

Linux——Docker监控_第4张图片

3.在machine主机上部署Prometheus Server服务。

在部署prometheus之前,我们需要对它的配置文件进行修改,所以我们先运行一个容器,先将其配置文件拷贝出来。

[root@machine ~]#  docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
[root@machine ~]#  docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@machine ~]# cat prometheus.yml 
......
    static_configs:
    - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.1.41:8080','192.168.1.41:9100','192.168.1.42:8080','192.168.1.42:9100']
[root@machine ~]# docker rm -f prometheus 
prometheus
[root@machine ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
WARNING: Published ports are discarded when using host network mode
88565574609b515e7ff6785e834a26e223ced08f6c90a4cbd502e0d52579225e

PS:这里指定了prometheus的监控项,包括它也会监控自己本机到的数据。
Linux——Docker监控_第5张图片
Linux——Docker监控_第6张图片
PS: 这里能够查看到我们各个监控项。

4.在machine上,部署grafana服务

[root@machine ~]# mkdir grafana-storage
[root@machine ~]# chmod 777 -R grafana-storage/
[root@machine ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana

账户:admin
密码:123.com
Linux——Docker监控_第7张图片
Linux——Docker监控_第8张图片

5.添加监控数据

Linux——Docker监控_第9张图片
Linux——Docker监控_第10张图片
Linux——Docker监控_第11张图片

6.导入监控模板

模板官网为:https://grafana.com/

1.通过模板的ID 号添加
Linux——Docker监控_第12张图片
Linux——Docker监控_第13张图片
Linux——Docker监控_第14张图片
Linux——Docker监控_第15张图片
Linux——Docker监控_第16张图片
Linux——Docker监控_第17张图片
Linux——Docker监控_第18张图片
2.通过JSON文件使用模板:
Linux——Docker监控_第19张图片

四、邮件报警

1.配置AlertManager

[root@machine ~]# docker run --name alertmanager -d -p 9093:9093 prom/alertmanager:latest
[root@machine ~]# docker cp  alertmanager:/etc/alertmanager/alertmanager.yml ./
[root@machine ~]# cp alertmanager.yml alertmanager.ymlbak

PS:现在是没有任何告警信息的,因为我们还没有配置报警规则来触发报警

Linux——Docker监控_第20张图片

2.AlertManager 配置邮件告警

1. 打开SMTP服务

PS:此处使用163邮箱,也可以使用其他邮箱,方法都一样
Linux——Docker监控_第21张图片

2.修改配置文件

主要配置的作用:

  • global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
  • route: 用来设置报警的分发策略,它是一个树状结构,按照深度 优先从左向右的顺序进行匹配。
  • receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
  • inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)
[root@machine ~]# cat alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_from: '******@163.com'
  smtp_smarthost: 'smtp.163.com:465'
  smtp_auth_username: '*******@163.com'
  smtp_auth_password: '********'
  smtp_require_tls: false
  smtp_hello: '163.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: '[email protected]'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
[root@machine ~]# docker rm -f alertmanager 
alertmanager
[root@machine ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest 
8a9835e97f039921187a85a2e71a8c869342a4f6aa721fadb9d4a27a9bc2728e

以上模板中涉及的163邮箱换成自己的即可,授权码也一样

以上配置我反复试验后,发现不同的环境参数配置也不一样,调试期间 出现了各种报错问题,将其中几个关键的配置说明一下:

  • smtp_smarthost: 这里为 163邮箱 SMTP 服务地址,官方地址为smtp.163.com 端口为 465 或 587,同时要设置开启 POP3/SMTP服务。
  • smtp_auth_password: 这里为第三方登录 163 邮箱的授权码,非163账户登录密码,否则会报错,获取方式在 163邮箱服务端设置开启 POP3/SMTP 服务时会提示。
  • smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue aSTARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificatesigned byunknown authority,需要在 email_configs 下配置insecure_skip_verify: true 来跳过tls 验证

3.配置AlertManager 告警规则

Prometheus官网rule参考

[root@machine ~]# mkdir -p prometheus/rules
[root@machine ~]# cd prometheus/rules/
[root@machine rules]# cat  node-up.rules 
groups:
- name: node-up
  rules:
  - alert: node-up   #告警名称
    expr: up{job="prometheus"} == 0   #和之前的Prometheus.yml里Job name相对应
    for: 15s   # 15秒之后会告警
    labels:
      severity: 1     #严重重读
      team: node
    annotations:
      summary: "{{ $labels.instance }} 已停止运行超过 15s!"
[root@machine ~]# vim prometheus.yml 
......
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 192.168.1.40:9093   #打开监听端扣

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/usr/local/prometheus/rules/*.rules"  #添加规则文件路径,注意事项容器内路径!!!
  # - "first_rules.yml"
  # - "second_rules.yml"
  ......
[root@machine ~]# docker rm -f prometheus 
prometheus
[root@machine ~]# docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules:/usr/local/prometheus/rules --name prometheus --net=host prom/prometheus
WARNING: Published ports are discarded when using host network mode
22e16c5d8a36d9e993105b29afc4490c9f6fa0e20d7813c3c93105e95c1c1522

PS:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job=“node-exporter” 是否活着,for 表示报警状态为Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager,labels 和 annotations 对该 alert 添加更多的标识说明信息,所有添加的标签注解信息,以及 prometheus.yml 中该 job 已添加 label 都会自动添加到邮件内容中。

Linux——Docker监控_第22张图片
Linux——Docker监控_第23张图片

4.触发报警发送 Email

PS:关闭node01的exporter组件失败

[root@docker01 ~]# docker stop zealous_mclean 
zealous_mclean

Linux——Docker监控_第24张图片
Linux——Docker监控_第25张图片

5.AlertManager 配置自定义邮件模板

[root@machine ~]# cd prometheus/
[root@machine prometheus]# mkdir alertmanager-tmpl
[root@machine prometheus]#  cd alertmanager-tmpl/
[root@machine alertmanager-tmpl]# vim email.tmpl 
{{ define "email.from" }}wfp88888@163.com{{ end }}
{{ define "email.to" }}wfp88888@163.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }}
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
触发时间: {{ .StartsAt.Format "2020-09-18 19:25:00" }}
=========end==========
{{ end }} {{ end }} [root@machine alertmanager-tmpl]# cd [root@machine ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '******@163.com' smtp_smarthost: 'smtp.163.com:465' smtp_auth_username: '*******@163.com' smtp_auth_password: '********' smtp_require_tls: false smtp_hello: '163.com' templates: - '/etc/alertmanager-tmpl/*.tmpl' #这里的路径是容器内的路径 route: group_by: ['alertname'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '{{ template "email.to" }}' html: '{{ template "email.to.html" . }}' #发送的html,从我们自定的模板找那个获取! send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] [root@machine ~]# docker rm -f alertmanager alertmanager [root@machine ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager 12aacd93931b5ec4563be8a1167437054d036ffb556c3ce0659df5ddd1c1d331

PS:再次关闭node01的exporter模拟组件失败

[root@docker01 ~]# docker stop zealous_mclean 
zealous_mclean

Linux——Docker监控_第26张图片
我们会看到,时间不对,这是因为邮件是全球服务,所以,我们需要更改一下语句,在时间上加上东八区时间!!

...
[root@machine ~]# vim prometheus/alertmanager-tmpl/email.tmpl 
......
10 告警主题: {{ .Annotations.summary }}
11 触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
... [root@machine ~]# docker restart alertmanager alertmanager

Linux——Docker监控_第27张图片

你可能感兴趣的:(Linux系列,虚拟化,docker)