tech::hexagram

personal note for technical issue.

無料で使えるGCEのf1-microインスタンスで、Grafana+Prometheusのモニタリング環境を構築する

2018年、あけましておめでとうございます。拙い内容ではあるものの、本年も頑張って技術的な試みについて発信していけたらと。

年末年始でGrafanaとPrometheusを個人VPSのモニタリング環境として構築したので、その作業ログをまとめておく。

今回構築した雑な構成図

image

私は個人の開発環境としてさくらのVPSを所有しており、

をまとめて動かしている。

GCEにおいて、USリージョンのf1-microインスタンスが無料枠(Always Free Products)として利用可能であることを昨年末に知り、せっかくまとまった時間があるのでこの機会を活用してVPSのモニタリング環境を構築しようと考えた。

アプリケーションは、昨年業務で携わった新規プロダクトでお世話になっているGrafana + Prometheusを利用することにした。

なお、このエントリで紹介する環境ではVPS側にUbuntu14.04を、GCE側にUbuntu17.10をOSとして利用している。

GCEのセットアップ

GCEのコンソール から行える。

image

設定内容の「ゾーン」において、us-(central|east|west)1-* を選択すると、右列の推定費用の欄に下記の注記が表示される。

今月の f1-micro インスタンス使用量は、最初の 744 時間分が無料です。

実際に「今月の請求額」を見てみると、稼働中のf1-microインスタンスに対して無料枠が適用されているのが確認できる。

image

フォームに沿って構築すると、管理画面内に無事にインスタンスが構築された。細かいセットアップ方法については今回紹介を割愛するが、AWSとは異なり若干手間取った部分だけ下記に列挙しておく。

  • 認証鍵を利用したSSH接続を行えるようにするには、管理画面からSSHの公開鍵をテキストエリアに貼り付け、ssh-rsa abcdef... user@example.com のようなフォーマットで貼り付けると user アカウントを作成した上で対応した秘密鍵SSHログインできるようになる。
  • アクセス制御についてはVPCネットワーク内の「ファイアウォールルール」で行い、ターゲット・ソースフィルタ、プロトコル/ポート、対応(許可|拒否)、優先度(数値が高いほど優先される)の組み合わせで設定し、設定したルールの名前をGCE側の ネットワークタグ に設定することで制御を追加できる。
    • AWSでのSecurity Groupと同様の概念

node-exporterをVPS側にセットアップ

監視対象となるVPS側で、メトリクスを取れるように node-exporter をインストールする。

バージョンは執筆時点で最新の0.15.2を選択した。構築にはAnsibleのcommunity cookbookである williamyeh.prometheus をPrometheus ver2.0対応させた cookbook を利用した。

VPS内で9100番ポートにメトリクスが吐かれていれば構築成功となる。

% curl -L http://localhost:9100/metrics
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 6.1981e-05
go_gc_duration_seconds{quantile="0.25"} 0.000111363
go_gc_duration_seconds{quantile="0.5"} 0.00013939
go_gc_duration_seconds{quantile="0.75"} 0.000190704
go_gc_duration_seconds{quantile="1"} 0.011059546
go_gc_duration_seconds_sum 8.914533513
go_gc_duration_seconds_count 28294
...

9100番ポートのアクセスをGCEからのみ許可する

次に、9100番ポートへアクセスできるIPアドレスをGCEのインスタンスに制限しておく。 ufw のコマンドを貼っておく。

% sudo ufw allow from XX.XX.XX.XX to any port 9100 proto tcp
% sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
9100/tcp                   ALLOW       XX.XX.XX.XX
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

ufw status で指定したGCEのIPアドレスFrom 側に設定されていればOK。

PrometheusをGCE側にセットアップ

バージョンは執筆時点で最新の2.0.0を選択。構築には前述のansible playbookを利用。

prometheus.ymlの設定

ひとまず動作確認程度に実装したため、VPS側で構築したnode_exporterを取得できるようにした。

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
      # Alert Managerは未設定

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.

# A scrape configuration containing exactly one endpoint to scrape:
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
          - 'localhost:9090' # GCE自身のメトリクス
  - job_name: 'manji602.com:node_exporter'
    static_configs:
      - targets:
          - 'XX.XX.XX.XX:9100' # VPS側の9100番ポートを指定する

nginxの設定

Prometheus自体は認証機構を有していないので、Basic認証をかけておく。

server {

    listen 80;

    server_name prometheus.hogehoge.com;

    index index.html index.htm;

    location / {
      proxy_http_version 1.1;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://localhost:9090;

      auth_basic "Prometheus";
      auth_basic_user_file "/path/to/prometheus_passwdfile";
    }
}

GrafanaをGCE側にセットアップ

バージョンは執筆時点で最新の4.6.3を選択。構築にはAnsibleのcommunity cookbookである Stouts.grafana を利用した。

grafana.iniの設定

細かい内容をすべて書くと膨大な量になってしまうのでかいつまんで記述しておく。

[database]
# Either "mysql", "postgres" or "sqlite3", it's your choice
type = sqlite3
host = 127.0.0.1:3306
name = grafana
user = root
password =

databaseは最低限動けばいいのでデフォルトの sqlite3 を使用。

[users]
# disable user signup / registration
allow_sign_up = false

# Allow non admin users to create organizations
allow_org_create = false

# Set to true to automatically assign new users to the default organization (id 1)
auto_assign_org = true

# Default role new users will be automatically assigned (if disabled above is set to true)
auto_assign_org_role = Viewer

# Background text for the user field on the login page
login_hint = email or username

第三者が勝手に登録されても困るので、 allow_sign_up / allow_org_createfalse に設定。

[auth.github]
enabled = false
...

[auth.google]
enabled = false
...

[auth.proxy]
enabled = false

[auth.basic]
enabled = true

[auth.ldap]
enabled = false
...

authbasic のみtrueに設定。

grafana.ini に設定された初期ユーザー名・パスワードでログインできることを確認後、パスワード変更しておく。

nginxの設定

server {

    listen 80;

    server_name grafana.hogehoge.com;

    index index.html index.htm;

    location / {
      proxy_http_version 1.1;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://localhost:3000;
    }
}

Grafana自体には認証機構があるため、nginxの設定は一般的なリバースプロキシの内容を記述しておけば問題ない。

PrometheusをData Sourceに指定

grafana_datasource

GrafanaはData Sourceのtypeとして Prometheus をサポートしているので、こちらを選択する。

設定時に注意すべき点が何点かあるので列挙しておく。

  • Access には proxy を選択。
  • Prometheus 側でBasic認証をかけているので、 HTTP AuthBasic Auth のチェックマークをONにしておく。
    • Basic Auth DetailsUserPassword には、前述の Prometheus のセットアップ時に設定した /path/to/prometheus_passwdfile のUserName/Passwordを指定する。

Data source is working が表示されることを確認する。

Dashboardの設定

動作確認のため、 Node exporter single server という公開されたdashboardをインポートする。

image

左上のロゴアイコンをクリックし Dashboard -> Home を選択後、 Import Dashboard をクリックし上述のdashboardを取り込む。

image

image

Options でdata sourceを選べばインポートが成功し、メトリクスが確認できるようになる。

grafana_dashboard

これでVPSのメトリクスを直感的に把握することが出来る環境が整った。

GCEの負荷

f1-microインスタンスという貧弱環境でPrometheusとGrafanaを動かすことで、各リソースがどの程度使用されるのかを見てみる。

メモリ使用量

$ free
              total        used        free      shared  buff/cache   available
Mem:         598808      215160       72400        6660      311248      276900
Swap:             0           0           0

$ ps alx | awk '{printf ("%d\t%s\n", $8,$13)}' | sort -nr | head -10
67956  /opt/prometheus/prometheus-2.0.0.linux-amd64/prometheus
26812  /usr/sbin/grafana-server
19116  /usr/bin/python3
19012  /usr/bin/python3
18764  /usr/bin/python3
11396  /usr/lib/snapd/snapd
7084   /sbin/init
6996   sshd:
6712   /lib/systemd/systemd
5580   -bash

かなりカツカツだがなんとか動いている。AlertManagerを動かして賄えるかは未知数な部分。やはりメモリを食ってるのはPrometheusとGrafanaの2強の模様。

ディスク使用量

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            285M     0  285M   0% /dev
tmpfs            59M  6.5M   53M  12% /run
/dev/sda1       9.6G  2.4G  7.2G  25% /
tmpfs           293M     0  293M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           293M     0  293M   0% /sys/fs/cgroup
/dev/sda15      105M  3.4M  102M   4% /boot/efi
tmpfs            59M     0   59M   0% /run/user/1001

既に /dev/sda1 は25%を消費している。

$ sudo du -sk /* | sort -nr | head -5
1408132    /usr
689028 /var
110932 /lib
103884 /opt
39669  /boot

$ sudo du -sk /var/* | sort -nr | head -5
486160 /var/lib
199096 /var/cache
1956   /var/log
1728   /var/backups
28 /var/spool

$ sudo du -sk /var/log/* | sort -nr
408    /var/log/auth.log.1
280    /var/log/wtmp.1
204    /var/log/nginx
172    /var/log/auth.log
168    /var/log/grafana
116    /var/log/dpkg.log.1
100    /var/log/syslog
92 /var/log/cloud-init.log
72 /var/log/kern.log.1
48 /var/log/prometheus

Prometheusのログ自体はかなり少ない模様。

CPU使用率

$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0  63516  65432 263548    0    0     6    11   21   47  0  0 100  0  0
 0  0      0  63548  65432 263548    0    0     0     0   10   26  0  0 100  0  0
 0  0      0  63300  65436 263564    0    0     0    16   20   44  0  0 100  0  0

CPUは余裕あるみたい。

おわりに

今回は監視対象側へのexporterのインストールと、監視側のPrometheusとGrafanaの構築周りについて作業ログを紹介してみた。

今後の展開としては

  • 他のexporterの導入によるメトリクスのリッチ化
  • AlertManagerを導入しアラートルールを構築する
  • アラートの条件を満たした場合にSlackに投稿する

といったことができるようにしていきたい。

今年もどうぞよろしくお願いいたします。