在各种ARM板上构建家庭Docker Swarm集群 Prometheus / Grafana / Cadvisor部分

因为正在创建集群(进行中),所以会留下这些备忘录。
本文将介绍如何监控家用ARM单板电脑。

我想要可视化集群状态,所以我会整理Prometheus及其相关内容。

家庭聚集系列

    • 第1弾: ハードウェア編

 

    • 第2弾: Portainer編

 

    • 第3弾: Ceph編(失敗)

 

    • 第4弾: SeaweedFS編

 

    • 第5弾: traefik編

 

    第6弾: prometheus/grafana編

介绍使用的软件

由于我们这次要使用多个软件,所以我们将分别进行编写。

关于普罗米修斯

这是一种监视系统的基础。从提供死活信息的服务中以指标的形式提供数据,可以收集日志,如果日志异常则发出警报,也可以可视化日志。然而,Prometheus本身只是各个“基础”(API),需与提供日志的Exporter、发送警报的AlertManager以及可视化日志的可视化工具一起使用。

关于cAdvisor

这是一种提供关于Docker容器资源使用情况和性能等日志的导出器(即Exporter)。(虽然Docker默认设置了Metrics-Port后可以从Docker本身输出指标,但因相关文章少,所以暂时决定尝试使用cAdvisor)。

关于node-exporter

这是一种提供正在运行的操作系统本身的CPU / 内存使用率等信息的导出程序。根据我在DockerHub上的查看,它似乎支持ARM64 / ARMv7,所以可以直接使用。但是,在DockerSwarm中直接使用会带来麻烦(见下文)。

关于Grafana

Prometheus是一种可视化工具,可以将各种监控基础设施的信息可视化。它的目的是可视化当前状态,而不是详细查看每个日志。(如果要可视化应用程序的操作日志等,则使用elasticstack等工具。)

引入

因此,由于已经设置好了Portainer和SeaweedFS,所以我们可以在WebUI上添加服务,并假设我们可以将配置文件保存在/mnt/seaweedfs中。

经常阅读SwarmProm

这个项目虽然相当古老且已存档,但现在仍然是有参考价值的。由于不支持ARM,可能需要多花点时间寻找相应的影像,但首先让我们读一读这个。

node-exporter的自定义镜像

在Docker Swarm中运行时,与在安装SeaweedFS时遇到的困境类似,每个节点上运行的容器只能传递相同的环境变量,这是一个问题。因此,如果按照正常方式传递,每个节点的node-exporter的名称将全部相同,导致无法正确可视化。与我在SeaweedFS的Swarm配置中尝试的方式类似,可以将每个节点分别配置为单独的服务,并逐个传递环境变量以使其正常运行,但是这将导致设置变得非常笨拙。因此,我似乎通过在容器启动时使用Shell读取主机名并将其写入配置文件来解决了这个问题。这次我借用了4个月前使用相同措施的非正式构建。(在生产环境中,请确保自己进行构建)

Grafana的自定义图像

這個映像看起來只是將Swarm的儀表板直接安裝在裡面。只要將這裡的一組儀表板掛載為最新的grafana容器的卷,就可以用來替代。根據查看DockerHub的官方映像,它似乎支持ARM64(v8)/ARMv7,所以可以直接使用最新版本的映像。

普罗米修斯的独特形象

只需要一种选择:此镜像似乎只是在一开始就放置了用于Prometheus的配置文件。只需将此处的配置文件群挂载为最新的Prometheus容器卷,即可代替。根据查看DockerHub的官方镜像,它似乎支持ARM64(v8)/ARMv7,因此可以直接使用最新版本的镜像。

cadvisor – cadvisor(容器监视器)

在 SwarmProm 中,我们直接使用了官方的图片。由于没有适用于ARM的构建版本,我在查看了这个问题后,借用了约5个月前的非官方构建版本(请确保在生产环境中要自己进行构建)。

扛包工

Caddy是一种使用Go语言开发的Web服务器。它通常用于对每个页面进行基本身份验证,但本次我们将不详细介绍。

告警管理器

在负荷变得很高且已经出现问题的时候,它可以通知到Slack等平台。由于今次只需要搭建最基本的功能,所以省略其他的细节。(之后我想使用LINE-Notify等工具实现这个功能)

只需要一种选择:看不见

这似乎是为了能够在网页上查看警报历史,但已经停止更新了三年。从追踪分叉的感觉来看,现在似乎使用一种叫做karma的东西?因为没有alertmanager,所以我们无论如何都决定不安装。

2 部署以下的yml文件

在目前这里是包含最新的野猫形象等内容的版本。

version: "3.4"

services:
  cadvisor:
    image: zcube/cadvisor:v0.37.5
    command: -logtostderr
    networks:
      - monitoring
    volumes:
      - /:/rootfs:ro
      - /sys:/sys:ro
      - /var/run:/var/run:rw
      - /var/lib/docker/:/var/lib/docker:ro
    deploy:
      mode: global
      resources:
        limits:
          memory: 128M
        reservations:
          memory: 64M
      restart_policy:
        condition: on-failure
  node-exporter:
    image: dakotairene/swarmprom-node-exporter:latest
    networks:
      - monitoring
    environment:
      - NODE_ID={{.Node.ID}}
      - HOST_HOSTNAME=/etc/nodename
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/host/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.textfile.directory=/etc/node-exporter/'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
      - '--no-collector.ipvs'
    volumes:
      - /:/host/rootfs
      - /proc:/host/proc
      - /sys:/host/sys
      - /etc/hostname:/etc/nodename
    deploy:
      mode: global
      resources:
        limits:
          memory: 128M
        reservations:
          memory: 64M
      restart_policy:
        condition: on-failure
  prometheus:
    image: prom/prometheus:v2.28.1
    networks:
      - monitoring
    ports:
      - '9054:9090'
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=15d'
    volumes:
      - /:/rootfs:ro
      - /sys:/sys:ro
      - /var/run:/var/run:rw
      - /var/lib/docker/:/var/lib/docker:ro
      - /mnt/seaweedfs/prometheus/volume:/prometheus
      - /mnt/seaweedfs/prometheus/config:/etc/prometheus
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          memory: 2048M
        reservations:
          memory: 128M
  grafana:
    image: grafana/grafana:7.5.10
    ports:
      - '9055:3000'
    networks:
      - monitoring
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning/
      - GF_SECURITY_ADMIN_USER=grafana-admin
      - GF_SECURITY_ADMIN_PASSWORD=grafana-password-admin
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - GrafanaVolume:/var/lib/grafana
      - /mnt/seaweedfs/grafana/datasources:/etc/grafana/provisioning/datasources
      - /mnt/seaweedfs/grafana/swarmprom_dashboards.yml:/etc/grafana/provisioning/dashboards/swarmprom_dashboards.yml:ro
      - /mnt/seaweedfs/grafana/dashboards:/etc/grafana/dashboards
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          memory: 128M
        reservations:
          memory: 64M
networks:
  monitoring:
    driver: overlay
    attachable: true
volumes:
  GrafanaVolume:
    driver: local

2.5 部署

由于使用Portainer进行容器管理,所以只需简单地将其导入即可(省略其他步骤)。

起动后打开屏幕看一下

image.png

离开后的感受

激寒的笑话

可能比SeaweedFS想象的更不理想。

因为自己制作Docker镜像很麻烦,所以我把所有的配置文件放在了/mnt/seaweedfs中。但就像Traefik一样,对于一些频繁进行读写操作的文件,会变成NUL,总之,文件被破坏了。(因此,/var/lib/grafana没有挂载,而是作为卷存在)。对于只读文件来说,没有问题,但它看起来是个相当棘手的家伙。

没有温度表示

因为担心树莓派过热问题,所以希望能显示温度,并尝试使用cAdvisor进行安装。然而,似乎cAdvisor无法获取到温度信息(尝试自定义仪表板来显示node_thermal_zone_temp,但未成功获取)。可能需要添加额外的温度信息导出器。

请提供一个需要改写的句子。

广告
将在 10 秒后关闭
bannerAds