树莓派K8s的监控系统(节点导出程序+Prometheus+InfluxDB+Grafana)

我用树莓派4搭建了一个Kubernetes集群,但是拥有这样的系统后,作为工程师,我们会想要创建一个酷炫的仪表盘来监控并进行修正。

在讨论Kubernetes监控时,Prometheus + Grafana是出色的选择,但仅有这些还不够有趣。因此,我根据独特的概念搭建了自己的监控系统。

系统配置

monitoring.png

仪表板

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

概念

    • ダッシュボードはスマホからも見れるようにインターネットに公開する

 

    • 自宅の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處理器)的版本。

undefined

要在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
undefined

普罗米修斯

由于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语句可以相对常规地编写,所以并不会遇到太多问题。

undefined

使用GCP的永久免费额度来构建GCE实例,我参考了下面的文章。
在使用GCP的永久免费额度来启动服务时,我做了以下备忘录。

总结

我成功地建立了一个很棒的仪表盘!现在我可以在外面监控我的家庭Kubernetes集群了。(没有说肯定会去监控)

bannerAds