追求完美家庭树莓派监控系统的漫长旅程

如果你是一名工程师,我认为你家里可能有一些树莓派正在运行,那么大家是如何进行这些设备的监控呢?

这次我要介绍一个热爱树莓派的工程师为了监控家中树莓派们而认真搭建监控系统的故事。

监视对象

我想在这个监视系统中监控以下目标。

ラズパイKubernetesクラスター

Kubernetesのメトリクス
クラスターを構成する3台のラズパイのメトリクス

汎用ラズパイ1台

P_20201008_145939.jpg

对于监视系统的要求

我們將梳理監視系統的需求。

    • ダッシュボードがある

かっこいいダッシュボードが欲しいので

インターネット越しにアクセスできる

急にダッシュボードを見たくなる時があるので

インターネットに自宅LANを公開しない

セキュリティ面
引っ越しやルーター買い替え時のメンテナンスコストは無くしたい

仕事ではないのでコストは極力抑える

だいたい月$10以下にしたい

选择监视工具

首先,我們考慮了要以哪些工具為中心。以下是我們有興趣並想要嘗試的工具列表。

    • Prometheus

 

    • Datadog

 

    • Amazon CloudWatch

 

    Google Cloud Monitoring

Prometheus是近来流行的一种Pull型度量收集工具,众所周知。它主要用于构建Kubernetes和本地环境的生态系统。熟练使用它给人以时髦的印象。

由于是Pull型,所以需要从Prometheus本身访问要监控的目标。因此,需要在局域网内托管它。

Datadog是一种SaaS监视工具,可以运行代理并与IaaS进行协作以收集指标。作为SaaS,它的管理成本较低是一个优点。

由于IaaS系统被设计为能够发送本地指标,因此可以从树莓派发送指标。但是,由于需要使用SDK等来实施/配置的部分较多,所以这次的优先级较低。

因此,我们决定以Prometheus为主要工具进行构建,优先级为Prometheus > Datadog >>> 其他。

对于普罗米修斯的研究

从这里开始将涉及到Prometheus及其相关工具的内容。

Prometheus的执行环境。

由于Prometheus是一种Pull型指标收集工具,因此需要在能够到达每个树莓派的网络上进行构建。

monitoring01.png

因此,Prometheus需要在家庭局域网内运行。
虽然可以准备一台专用机器,但由于通用的树莓派在性能上有余裕,所以我们决定在其上运行Prometheus。

monitoring02.png

收集指标

根据需要在仪表盘上显示的内容,需要以下的指标。

    • Kubernetes

 

    • Kubernetesの各Nodeに使っているラズパイ

 

    Prometheusを動かす汎用的ラズパイ自身

在获取Kubernetes的Pod和Service数量等信息时,使用kube-state-metrics。
由于树莓派的CPU为ARM架构,所以我自己重新构建了适用于树莓派的版本。

对于 k8s 的节点和通用的 Raspberry Pi,将使用 Node Exporter。

因为这个设置在README中可以实施,所以在这里不会详细介绍。现在,我们已经可以通过Prometheus获得Kubeneters的各种指标和树莓派资源了。

通过互联网访问的方式

提供可以通过互联网访问的仪表板的方法似乎有两种选择。

利用SaaS或IaaS等服务,在互联网上构建仪表板。
Prometheus本身具有本地的时序数据库,但也可以将数据导出到外部。
这个功能被称为远程存储。

通过以下方式进行配置,Prometheus本身可以在局域网内,远程存储和仪表盘可以在云端构建。
通信方向也是Prometheus→远程存储,因此无需将家庭局域网公开到互联网。

此外,还有一种选择是使用提供同时包含远程存储数据库和仪表板工具的SaaS服务,而无需分别准备它们。

monitoring03.png

2. 可以通过某种手段安全地连接到家庭实验室,并在局域网内构建仪表板
另一种方式是在家庭局域网内构建仪表板,并从互联网端安全地连接到家庭局域网。

monitoring04.png

由于第二个选项需要在每台设备上进行应用程序的安装,所以我们决定在这次考虑中选择第一种方案。

普罗米修斯的构成

由于我们决定在互联网上建立仪表盘,所以Prometheus相关配置的模式已经初步确定下来。

远程存储:SaaS或IaaS

为了选择Remote Storage和Dashboard,我们首先要确认Prometheus支持的Remote Storage数据库。
根据官方文档,以下是可用于Remote Storage的数据库列表。

    • AppOptics

 

    • Azure Data Explorer

 

    • Azure Event Hubs

 

    • Chronix

 

    • Cortex

 

    • CrateDB

 

    • Elasticsearch

 

    • Gnocchi

 

    • Google BigQuery

 

    • Google Cloud Spanner

 

    • Graphite

 

    • InfluxDB

 

    • IRONdb

 

    • Kafka

 

    • M3DB

 

    • MetricFire

 

    • New Relic

 

    • OpenTSDB

 

    • PostgreSQL/TimescaleDB

 

    • QuasarDB

 

    • SignalFx

 

    • Splunk

 

    • TiKV

 

    • Thanos

 

    • VictoriaMetrics

 

    Wavefront

首先,让我们按照SaaS/PaaS/自行托管进行分类。
关于SaaS,我们还将记载有无免费计划(≠免费试用)。

SaaSあり

AppOptics

Free Planなし

Elasticsearch(ElasticC loud)

Free Planなし

InfluxDB

Free Planあり

MetricFire

Free Planなし

New Relic

Free Planあり

PostgreSQL

Free Planあり

TimescaleDB

Free Planなし

QuasarDB

Free Planなし

Splunk/SignalFx

Free Planなし

Wavefront

Free Planなし

PaaS

Azure Data Explorer
Azure Event Hubs
Google BigQuery
Google Cloud Spanner

自分でホストする必要あり

Chronix
Cortex
CrateDB
Gnocchi
Graphite
IRONdb
Kafka
M3DB
OpenTSDB
TiKV
Thanos
VictoriaMetrics

考慮使用SaaS

我仍然希望优先选择可用性高且管理成本少的SaaS服务。虽然我也查看了一些付费服务,但是由于它们通常是以日志存储为主,所以印象中价格较高。考虑到我希望每月控制在10美元以下的预算,因此我决定继续调查提供免费计划的服务。

以下是(根据我进行的调查)能够永久免费使用而不是仅限于n天试用之类的选择的三个计划。

    • InfluxDB

 

    • New Relic

 

    PostgreSQL
image.png

根据免费计划的限制,可注册的数据量和仪表板数量有所限制,但似乎已经满足了要求。请参考链接:https://www.influxdata.com/influxdb-cloud-pricing/

New Relic是一个可以收集APM等监控数据的SaaS服务。
即使是免费计划,也可以生成针对Prometheus的端点,并且还具备仪表盘功能,因此它似乎也能满足您的需求。
https://newrelic.com/pricing

在中文中,有一种名为ElephantSQL的服务,作为PostgreSQL的SaaS版本。
尽管有数据量等方面的限制,但似乎足够作为Prometheus的远程存储使用。
当然,它没有仪表盘功能,所以可能需要另外使用仪表盘SaaS或从自己托管的仪表盘进行连接。
你可以在https://www.elephantsql.com/plans.html 上找到更多信息。

验证

InfluxDB 云2.0

我立即使用免费计划创建了一个账户,并尝试配置了Prometheus的远程存储。

我根据InfluxDB的官方文档进行了设置。请参考以下链接:https://docs.influxdata.com/influxdb/v1.8/supported_protocols/prometheus/

当试图重新启动Prometheus服务器时,发现输出了以下错误日志。

server returned HTTP status 401 Unauthorized:{"code":"unauthorized","message":"unauthorized access"}"

经过各种调查,似乎是InfluxDB 2.0使用的身份验证头与Prometheus发送的头不匹配。
在Prometheus中,要配置带有身份验证的远程存储,请按下列方式操作。

remote_write:
  - url: https://example.com
    bearer_token: xxxx

在这种情况下,请求将附带 Authorization: Bearer xxxx 头部发送到端点。
然而,在 InfluxDB 2.0 中,需要使用 Authorization: Token xxxx 的形式。
更多信息,请参考:https://docs.influxdata.com/influxdb/v2.0/reference/api/influxdb-1x/

Prometheus的问题已经被登记了,但似乎没有计划进行相应的处理。
https://github.com/prometheus/prometheus/issues/5657

由于在curl中连接已成功,所以我想,只要解决了这个头部问题,就可以进行数据投入了。因此我决定采用以下方法来解决头部问题。

这是一种通过使用Nginx作为中间代理并结合 proxy_set_header,向请求中插入 Authorization: Token xxxx 头部的方法。

# リクエストの流れ
Prometheus --> Nginx --> InfluxDB Cloud

不详细说明具体设置,但是通过这种方法,我们成功地突破了头部认证!

不过,还有另外一个错误!看起来Prometheus所发送的查询似乎不支持InfluxDB 2.0版本。
(由于之前使用Prometheus连接过InfluxDB 1.8系列,所以猜测是由于2.0版本引入了不兼容变更导致的问题。)

由于InfluxDB 2.0相对较新,我们决定暂时放弃InfluxDB Cloud,但对其未来抱有期望。请参考以下链接:https://github.com/influxdata/influxdb/releases

新颖可靠的监测系统

接下来我试了一下New Relic。

创建免费帐户并参考官方文档设置Prometheus的端点。生成类似于https://metric-api.newrelic.com/prometheus/v1/write?X-License-Key=xxxx&prometheus_server=prometheus的端点,将其设置为Prometheus的remote_write。

只需以上步骤,即可完成Remote Storage的设置。
接下来只需在Query Explorer等工具中进行确认,并根据以下文档创建仪表盘即可。
https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions

在New Relic中,您可以同时使用一个名为NRQL的专有查询语言和一个用于Prometheus的查询语言PromQL。根据我的实际试用感觉,它似乎是通过将PromQL转换为NRQL并运行的。

起初我觉得学习 NRQL 很麻烦,所以在面板查询中使用了 PromQL,然而有些转换未能正常工作,导致无法如愿地绘制图表,所以我决定学习 NRQL。

以下是完成的仪表板。

screencapture-one-newrelic-launcher-dashboards-launcher-2020-10-09-17_26_51.png

这感觉真不错。
能够在SaaS平台上免费实现这个是非常令人感激的。

「暂时将这里作为旅行终点吧。」

闲谈

实际上,在考虑使用SaaS之前,我们先自行搭建了InfluxDB和Grafana并运行了一段时间以构建仪表盘。
我们在GCP上使用了免费的f1.micro实例(1vCPU,0.6GB内存)进行搭建。

monitoring05.png
Screenshot from 2020-02-16 23-45-52.png

我在这个构想下运营了几个月,但是以下几点让我感到困扰。

    • GCEインスタンスの管理(CPUバーストによる課金、ディスク枯渇、メモリ枯渇)が面倒

 

    • NginxのログローテートやInfluxDBのデータの保存期限等を管理する必要がある

 

    Let’s Encryptの初期設定とcronによる更新スクリプトが必要

有几次由于内存不足或磁盘容量已满而导致停止运行,因此我决定转而使用SaaS来管理服务器,这也是我认为在令和时代不再需要自行管理服务器的原因。

实施等

请列出与本次文章相关的仓库。
希望能对构建类似结构时提供参考。

https://github.com/reireias/raspberrypi-ansible

k8sのノードやPrometheusを動かすラズパイ上の設定を行うAnsibleのコード
Node Exporterの設置などもこれで行っています

https://github.com/reireias/pikube-monitoring-ansible

余談で紹介した、Nginx + InfluxDB + Grafanaを構築するAnsibleのコード

https://github.com/reireias/kube-manifests

ラズパイk8sクラスター用のマニフェストファイル
kube-state-metricsの設定はここにかかれています

总结

你有没有想过将服务器管理和Prometheus的远程存储和仪表板转化为SaaS,这样就不用自己管理了。你也可以尝试构建自己家庭的监控系统,怎么样?

广告
将在 10 秒后关闭
bannerAds