在各种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进行容器管理,所以只需简单地将其导入即可(省略其他步骤)。
起动后打开屏幕看一下

离开后的感受
激寒的笑话
可能比SeaweedFS想象的更不理想。
因为自己制作Docker镜像很麻烦,所以我把所有的配置文件放在了/mnt/seaweedfs中。但就像Traefik一样,对于一些频繁进行读写操作的文件,会变成NUL,总之,文件被破坏了。(因此,/var/lib/grafana没有挂载,而是作为卷存在)。对于只读文件来说,没有问题,但它看起来是个相当棘手的家伙。
没有温度表示
因为担心树莓派过热问题,所以希望能显示温度,并尝试使用cAdvisor进行安装。然而,似乎cAdvisor无法获取到温度信息(尝试自定义仪表板来显示node_thermal_zone_temp,但未成功获取)。可能需要添加额外的温度信息导出器。