您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

搭建容器监控平台

本节,我们上手搭建容器监控平台。我们监控 Docker 主机上运行的容器状态,并监控 cAdvisor 容器,如果此容器,会触发告警。

创建如下目录结构。

# 全局配置@H__34@
global@H__34@:@H__34@
    # 每5s收集一据@H__34@
    scrape_interval@H__34@:@H__34@ 5s
    # 每5s执行一次告警规则检测@H__34@
    evaluation_interval@H__34@:@H__34@ 5s
    # @H__34@
    external_labels@H__34@:@H__34@
        monitor@H__34@:@H__34@ 'monitor'@H__34@
# 告警配置@H__34@
alerting@H__34@:@H__34@
    alertmanagers@H__34@:@H__34@
        -@H__34@ static_cons@H__34@:@H__34@
            -@H__34@ targets@H__34@:@H__34@ [@H__34@'alertmanager:9093'@H__34@]@H__34@
# 指定规则@R__1970@@H__34@
rule_files@H__34@:@H__34@
    -@H__34@ rules/*.yml
# 数据抓取配置@H__34@
scrape_cons@H__34@:@H__34@
    -@H__34@ job_name@H__34@:@H__34@ 'prometheus'@H__34@
      static_cons@H__34@:@H__34@
          -@H__34@ targets@H__34@:@H__34@ [@H__34@'prometheus:9090'@H__34@]@H__34@
    -@H__34@ job_name@H__34@:@H__34@ 'cadvisor'@H__34@
      static_cons@H__34@:@H__34@
          -@H__34@ targets@H__34@:@H__34@ [@H__34@'cadvisor:8080'@H__34@]@H__34@

groups@H__34@:@H__34@
    -@H__34@ name@H__34@:@H__34@ rule-@H__34@
      rules@H__34@:@H__34@
          -@H__34@ alert@H__34@:@H__34@ "服务运行告警"@H__34@
            expr@H__34@:@H__34@ up{@H__34@job="cadvisor"}@H__34@ < 1
            # 告警等待时间@H__34@
            for@H__34@:@H__34@ 1m
            labels@H__34@:@H__34@
                severity@H__34@:@H__34@ warning
            annotations@H__34@:@H__34@
                summary@H__34@:@H__34@ "服务名@H__34@:@H__34@ {@H__34@{@H__34@$labels.alertname}@H__34@}@H__34@"
                description@H__34@:@H__34@ "容器cadvisor已停止"@H__34@

alertmanager 触发告警后会,我们需要先配置邮箱,这里以 QQ 邮箱为例。
邮箱,选择设置:

Tips:
25 端口用于转发,没有考虑认证、加密等问题。587 端口专门被设计用来提交,传输可以加密。这里我们使用 587 端口。

接下来编辑 alertmanager @R__1970@ con.yml:

# 全局配置项@H__34@
 global@H__34@:@H__34@
   resolve_timeout@H__34@:@H__34@ 5m  #处理超时时间,认为5min@H__34@
   smtp_smarthost@H__34@:@H__34@ 'smtp.qq.com:@H__34@587'  # 邮箱smtp服务器代理,这里以为例@H__34@
   smtp_from@H__34@:@H__34@ 'xxx@qq.com'  # 发送邮箱@H__34@
   smtp_auth_username@H__34@:@H__34@ 'xxx@qq.com'  # 邮箱账号@H__34@
   smtp_auth_password@H__34@:@H__34@ 'xxxxxxxxxxxx'  # 邮箱授权码@H__34@

# 定义模板信息@H__34@
 templates@H__34@:@H__34@
   -@H__34@ '/etc/alertmanager/templates/*.html'@H__34@

# 定义路由树信息@H__34@
 route@H__34@:@H__34@
   group_by@H__34@:@H__34@ [@H__34@'alertname'@H__34@]@H__34@ # 报警分组依据@H__34@
   group_wait@H__34@:@H__34@ 10s # 最初即第一次等待多久时间发送一组警报的@H__34@
   group_interval@H__34@:@H__34@ 10s # 在发送新警报前的等待时间@H__34@
   repeat_interval@H__34@:@H__34@ 1m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于发送太多频繁,被smtp服务器拒绝@H__34@
   receiver@H__34@:@H__34@ 'email' # 发送警报的接收者的,以下receivers name的@H__34@

# 定义警报接收者信息@H__34@
 receivers@H__34@:@H__34@
   -@H__34@ name@H__34@:@H__34@ 'email' # 警报@H__34@
     email_cons@H__34@:@H__34@ # 邮箱配置@H__34@
     -@H__34@ to@H__34@:@H__34@ 'aaa@xxx.com'  # 接收警报的email配置@H__34@
       html@H__34@:@H__34@ '{@H__34@{@H__34@ template "alert.html" . }@H__34@}@H__34@' # 设定邮箱的@H__34@
       headers@H__34@:@H__34@ {@H__34@ Subject@H__34@:@H__34@ "[WARN] 报警"@H__34@}@H__34@ # 的@H__34@
{{ define "alert.html" }}
<@H__34@table@H__34@ border@H__34@=@H__34@"@H__34@1"@H__34@@H__34@>@H__34@@H__34@
        <@H__34@tr@H__34@>@H__34@@H__34@
                <@H__34@td@H__34@>@H__34@@H__34@报警项</@H__34@td@H__34@>@H__34@@H__34@
                <@H__34@td@H__34@>@H__34@@H__34@实例</@H__34@td@H__34@>@H__34@@H__34@
                <@H__34@td@H__34@>@H__34@@H__34@报警</@H__34@td@H__34@>@H__34@@H__34@
                <@H__34@td@H__34@>@H__34@@H__34@开始时间</@H__34@td@H__34@>@H__34@@H__34@
        </@H__34@tr@H__34@>@H__34@@H__34@
        {{ range $i, $alert := .Alerts }}
                <@H__34@tr@H__34@>@H__34@@H__34@
                        <@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Labels "alertname" }}</@H__34@td@H__34@>@H__34@@H__34@
                        <@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Labels "instance" }}</@H__34@td@H__34@>@H__34@@H__34@
                        <@H__34@td@H__34@>@H__34@@H__34@{{ index $alert.Annotations "description" }}</@H__34@td@H__34@>@H__34@@H__34@
                        <@H__34@td@H__34@>@H__34@@H__34@{{ $alert.StartsAt }}</@H__34@td@H__34@>@H__34@@H__34@
                </@H__34@tr@H__34@>@H__34@@H__34@
        {{ end }}
</@H__34@table@H__34@>@H__34@@H__34@
{{ end }}
version@H__34@:@H__34@ "3.8"@H__34@
services@H__34@:@H__34@
    cAdvisor@H__34@:@H__34@
      image@H__34@:@H__34@ google/cadvisor:@H__34@v0.33.0
      container_name@H__34@:@H__34@ cadvisor
      restart@H__34@:@H__34@ always
      deploy@H__34@:@H__34@
          resources@H__34@:@H__34@
              limits@H__34@:@H__34@
                  s@H__34@:@H__34@ '0.20'@H__34@
                  memory@H__34@:@H__34@ 500M
      networks@H__34@:@H__34@
          -@H__34@ monitor
      volumes@H__34@:@H__34@
          -@H__34@ /:@H__34@/rootfs:@H__34@ro
          -@H__34@ /var/run:@H__34@/var/run:@H__34@ro
          -@H__34@ /sys:@H__34@/sys:@H__34@ro
          -@H__34@ /var/lib/docker/:@H__34@/var/lib/docker:@H__34@ro
          -@H__34@ /dev/disk/:@H__34@/dev/disk:@H__34@ro

    Prometheus@H__34@:@H__34@
      image@H__34@:@H__34@ prom/prometheus:@H__34@v2.19.2
      container_name@H__34@:@H__34@ prometheus
      restart@H__34@:@H__34@ always
      deploy@H__34@:@H__34@
          resources@H__34@:@H__34@
              limits@H__34@:@H__34@
                  s@H__34@:@H__34@ '0.20'@H__34@
                  memory@H__34@:@H__34@ 500M
      volumes@H__34@:@H__34@
          -@H__34@ ./prometheus/conf:@H__34@/etc/prometheus:@H__34@ro
      networks@H__34@:@H__34@
          -@H__34@ monitor
      depends_on@H__34@:@H__34@
          -@H__34@ cAdvisor
      ports@H__34@:@H__34@
          -@H__34@ "9090:9090"@H__34@


    alertmanager@H__34@:@H__34@
      image@H__34@:@H__34@ prom/alertmanager:@H__34@v0.21.0
      container_name@H__34@:@H__34@ alertmanager
      restart@H__34@:@H__34@ always
      deploy@H__34@:@H__34@
          resources@H__34@:@H__34@
              limits@H__34@:@H__34@
                  s@H__34@:@H__34@ '0.20'@H__34@
                  memory@H__34@:@H__34@ 500M
      networks@H__34@:@H__34@
          -@H__34@ monitor
      ports@H__34@:@H__34@
          -@H__34@ "9093:9093"@H__34@
      depends_on@H__34@:@H__34@
          -@H__34@ Prometheus
      volumes@H__34@:@H__34@
          -@H__34@ ./alertmanager/conf/con.yml:@H__34@/etc/alertmanager/con.yml
          -@H__34@ ./alertmanager/templates:@H__34@/etc/alertmanager/templates
      command@H__34@:@H__34@
          -@H__34@ '--con.file=/etc/alertmanager/con.yml'@H__34@
          -@H__34@ '--storage.path=/alertmanager'@H__34@
          -@H__34@ '--log.level=info'@H__34@

    Grafana@H__34@:@H__34@
      image@H__34@:@H__34@ grafana/grafana:@H__34@7.0.5
      container_name@H__34@:@H__34@ grafana
      restart@H__34@:@H__34@ always
      deploy@H__34@:@H__34@
          resources@H__34@:@H__34@
              limits@H__34@:@H__34@
                  s@H__34@:@H__34@ '0.20'@H__34@
                  memory@H__34@:@H__34@ 500M
      networks@H__34@:@H__34@
          -@H__34@ monitor
      environment@H__34@:@H__34@
          -@H__34@ GF_S_ADMIN_PASSWORD=123456
      depends_on@H__34@:@H__34@
          -@H__34@ Prometheus
      ports@H__34@:@H__34@
          -@H__34@ "3000:3000"@H__34@

networks@H__34@:@H__34@
  monitor@H__34@:@H__34@
    name@H__34@:@H__34@ monitornet
    driver@H__34@:@H__34@ bridge

在 compose @R__1970@中,我们配置了容器的 和内存限制:

...@H__34@
      deploy@H__34@:@H__34@
          resources@H__34@:@H__34@
              limits@H__34@:@H__34@
                  # 最多使用20%@H__34@
                  s@H__34@:@H__34@ '0.20'@H__34@
                  # 内存最多使用500M@H__34@
                  memory@H__34@:@H__34@ 500M
...@H__34@

需要使用--compatibility兼容模式使它生效。

# 启动@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility up -@H__34@d
# 移除@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility down
# 重启@H__34@
docker-@H__34@compose -@H__34@-@H__34@compatibility restart
docker-compose --compatibility up -d

启动之后,使用浏览器打开 , 即可访问 grafana Web 。

使用admin123456 密码(GF_S_ADMIN_PASSWORD指定)。

成功后,。

选择 Prometheus 数据源:

填写 Prometheus 地址:

保存配置:

选择导入 Dashboard:

回到 Grafana ,将下载的 json 导入:

打开 prometheus web UI ,点击 alert 页,查看监控告警状态:

docker stop cadvisor

几秒后刷新,发现告警进入 Pending 暂挂状态:

一分钟后(rule_1.yml 中 for = 1m 配置)告警进入 firing 状态。

查收告警:

修复故障后恢复正常:

docker start cadvisor

本节构建了具有告警的容器监控平台,由于篇幅有限,仅能在@R__1970@中,对一些基本常用的配置进行解释,还有其他更多更全的强大配置,需要读者自行参考各个服务的官方文档。


联系我
置顶