树莓派K8s的监控系统(节点导出程序+Prometheus+InfluxDB+Grafana)
我用树莓派4搭建了一个Kubernetes集群,但是拥有这样的系统后,作为工程师,我们会想要创建一个酷炫的仪表盘来监控并进行修正。
在讨论Kubernetes监控时,Prometheus + Grafana是出色的选择,但仅有这些还不够有趣。因此,我根据独特的概念搭建了自己的监控系统。
系统配置

仪表板

概念
-
- ダッシュボードはスマホからも見れるようにインターネットに公開する
-
- 自宅のLANはインターネットに公開しない
-
- CPU温度をモニタリングする
- 運用コストはなるべく安価にすます
网络方面
考虑到安全问题,我们尽量避免将家庭网络公开。如果按照常规方式进行构建,Grafana → Prometheus → 被监视对象将形成一个拉取型监控系统,这将导致局域网与互联网之间发生通信。
因此,我們使用Prometheus的遠程存儲功能,指定了在云端搭建的InfluxDB作為遠程存儲,以此構建了Grafana → Influxdb ← Prometheus的系統架構,以避免從互聯網訪問LAN。
基础设施方面
由于Dashboard和InfluxDB需要在云上搭建,为了尽可能地节省成本,并想要在自有域名下运营,我们决定采用违背规定的GCP永久免费计划实例。 (之所以说违背规定,是因为一个账户只能免费使用一个实例,如果在其他地方使用会有麻烦)
我们使用.dev域名,该域名几乎每个工程师都拥有,并使用Let’s Encrypt证书。
为了能够访问Prometheus作为监控对象,我们选择了一些在普通家庭中多余的树莓派3来在局域网内搭建。
详细
Kubernetes状态指标
我們將在Kubernetes集群中建立kube-state-metrics,該指標可以在Prometheus中以Kubernetes格式獲取Kubernetes的資訊。基本上,按照README的指示使用kubectl apply就可以建立它,但我們需要將映像更改為支援ARM(因為Raspberry Pi的CPU是32位ARM處理器)的版本。

要在GitHub Actions上构建针对arm的图像,稍微需要一些技巧,下面我来介绍一下。
我们可以使用multiarch/qemu-user-static,通过模拟CPU信息来实现这一点。
工作流的设置如下所示:
name: main
on: [push, pull_request]
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: setup docker for arm
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- name: push image
run: |
docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }}
make quay-push
env:
GOARCH: arm
GOARM: 7
节点导出器
为了获取Kubernetes每个节点的CPU和内存信息,我们将在每个节点上安装Node exporter。
针对arm处理器的二进制文件可以在Releases中找到,但为了能够获取CPU温度,我们需要从最新的代码中自行构建。
(※由于最近添加了1.0.0-rc0的构建版本,所以那个也应该没问题)
# clone
$ git clone https://github.com/prometheus/node_exporter.git
# build for arm
$ GOOS=linux GOARCH=arm GOARM=7 go build

普罗米修斯
由于Prometheus的ARM二进制文件已在GitHub的Releases中发布,因此我们将直接使用它。
我也已将其制作为Ansible角色。
reireias/raspberrypi-ansible – roles/prometheus
Prometheus的设定文件被设置如下所示。
-
- node exporter用とkubernetes用のjobを設定
-
- node exporterはlabelの関係で3台それぞれを定義
- remote strage設定にInfluxDBのエンドポイントを指定
global:
scrape_interval: 60s # By default, scrape targets every 15 seconds.
evaluation_interval: 60s # By default, scrape targets every 15 seconds.
external_labels:
monitor: 'pikube'
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: node
static_configs:
# node exporterその1
- targets:
- 192.168.99.100:9100
labels:
node_name: pikube01
# node exporterその2
- targets:
- 192.168.99.101:9100
labels:
node_name: pikube02
# node exporterその3
- targets:
- 192.168.99.102:9100
labels:
node_name: pikube03
# kube-state-metrics
- job_name: kubernetes
static_configs:
- targets:
- 192.168.99.200:8080
# remote storageの設定
remote_write:
- url: 'https://{{ influxdb_domain }}/api/v1/prom/write?db=prometheus&u={{ influxdb_user }}&p={{ influxdb_pass }}'
remote_read:
- url: 'https://{{ influxdb_domain }}/api/v1/prom/read?db=prometheus&u={{ influxdb_user }}&p={{ influxdb_pass }}'
在GCE上使用InfluxDB和Grafana。
我正在GCP上的永久免费套餐中构建GCE实例,并搭建了InfluxDB和Grafana。
InfluxDB是一个专注于时间序列数据的数据库。
另外,当然访问是通过SSL进行的,我们配置了Nginx,并获取并安装了Let’s Encrypt的证书。由于Let’s Encrypt的证书有效期只有3个月,我们也使用cron来自动更新它。
Grafana使用图形用户界面进行配置。
可以指定InfluxDB作为数据源来创建仪表盘。
InfluxDB是专门用于处理时间序列数据的数据库,但是SQL语句可以相对常规地编写,所以并不会遇到太多问题。

使用GCP的永久免费额度来构建GCE实例,我参考了下面的文章。
在使用GCP的永久免费额度来启动服务时,我做了以下备忘录。
总结
我成功地建立了一个很棒的仪表盘!现在我可以在外面监控我的家庭Kubernetes集群了。(没有说肯定会去监控)