lrlikebrother

Raspberry Pi 構築 サーバー監視編

サーバーの監視を行いたい

自分以外に友人を招待してMisskeyなどのサービスを提供しているのでサーバーが落ちたり

データが消失したりしてはいけないのでサーバーに不審なログが出ていないか

アクセス数やメモリ、ストレージの容量が足りているかを確認する必要が出てきた

サーバーの監視を行うサービスについて

「Prometheus」クエリを発行して起動しているサービスの監視ができる

「Node Exporter」マシン上で実行される個別のプロセスやサービスではなく、マシン自体のモニタリングができる

「cAdvisor」Dockerなどのコンテナの状況を監視できる

「Grafana」取得してきたログの数値などをグラフなどにして可視化する事ができる

オープンソースのサーバ監視ツール TOP5

Grafana & Prometheus & NodeExporter & cAdvisor構築

追記:docker-compose.yml

  prometheus:
    image: prom/prometheus
    volumes:
      - ./data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    restart: always

  node-exporter:
    image: quay.io/prometheus/node-exporter
    ports:
      - 9100:9100
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - ./rootfs:/rootfs

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.2

    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis

  grafana:
    image: grafana/grafana:7.5.9
    container_name: grafana
    hostname: grafana
    user: "0:"
    volumes:
      - ./data/grafana/grafana_data:/var/lib/grafana
    ports:
      - 15200:3000
    env_file:
      - ./data/grafana/grafana.env
    restart: always

  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

新規:prometheus.yml

global:
  scrape_interval: 15s # デフォルトの監視対象にpullする間隔
  external_labels: # 外部と通信するときのラベル
    monitor: 'codelab-monitor'
scrape_configs: # 監視対象ごとの設定
  - job_name: 'prometheus' # Prometheus自身の監視
    scrape_interval: 5s # デフォルトの間隔を上書き
    static_configs:
      #- targets: ['localhost:9090']
      - targets: ['192.168.x.xx:9090'] # prometheusを立てる環境によってURLを変える
  - job_name: 'node'
    static_configs:
      #- targets: ['localhost:9100']
      - targets: ['192.168.x.xx:9100'] # nodeを立てる環境によってURLを変える

  - job_name: cadvisor
    scrape_interval: 5s
    static_configs:
      #- targets: ['localhost:8080']
      - targets: ['192.168.x.xx:8080'] # cadvisorを立てる環境によってURLを変える

新規:grafana.env

GF_SERVER_DOMAIN=localhost 
# 環境によって変える

GF_SERVER_HTTP_PORT=3000
GF_SERVER_PROTOCOL=http
# https://example.com/grafana のようにサブディレクトリを切る場合
GF_SERVER_ROOT_URL=/

Prometheus構築参考記事

他のポートに被らないようにする

Grafanaの3000番ポートは私の場合

Misskeyサーバーで使用しているため別のポートから転送してあげる必要があった

cAdvisorを入れる際に苦労したこと

cAdvisorをDockerで立ち上げようとした時に以下のエラーを吐かれた

failed to get docker info: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

その後いろいろ調べていったところプロセッサの問題そうであった

やったこと

参考にした記事ではバージョンを指定していなかったが

Raspberry PiなどのARM系のマイクロプロセッサの場合はうまく動作せずにコンテナが立ち上がらない

ARMに対応していない記事が出てきたが過去のものであまり参考にならなかったが

最新バージョンであれば対応しているような内容を見つけた

イメージはこのように指定すれば行けた

image: gcr.io/cadvisor/cadvisor:v0.47.2

Grafanaを入れる時に苦労したこと

DockerでGrafanaを入れようとした際に以下のログが確認できた

You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migrate-to-v51-or-later

Grafanaのプロセスが自身の/var/lib/にアクセスする際に権限を持っていなかったことが問題

docker-compose.ymlのGrafanaのuserを設定する必要があった

user: “$PID:$GID”

参考記事

起動後のカスタマイズについて

とりあえず見たいものをPickupして監視することにした(間違った内容のものがあるかもしれないです)

コンテナ単位でのネットワークの受信バイト数の合計: rate(container_network_receive_bytes_total[5m])

コンテナ単位でのCPU使用率: rate(container_cpu_system_seconds_total[5m])

本体の残りストレージ残量: node_filesystem_free_bytes

本体の使用メモリー量: node_memory_MemFree_bytes

MisskeyサーバーのCPU使用率: rate(container_cpu_usage_seconds_total[5m])

Misskeyサーバーのメモリ使用率: container_memory_usage_bytes

Prometheusクエリ道場

*この記事はService分けまでしてくれているのでどの機能を使ってるかわかりやすい

Kubernetesにおけるストレージ関連のメトリクス一覧