無料で使えるGCEのf1-microインスタンスで、Grafana+Prometheusのモニタリング環境を構築する
2018年、あけましておめでとうございます。拙い内容ではあるものの、本年も頑張って技術的な試みについて発信していけたらと。
年末年始でGrafanaとPrometheusを個人VPSのモニタリング環境として構築したので、その作業ログをまとめておく。
今回構築した雑な構成図
私は個人の開発環境としてさくらのVPSを所有しており、
をまとめて動かしている。
GCEにおいて、USリージョンのf1-microインスタンスが無料枠(Always Free Products)として利用可能であることを昨年末に知り、せっかくまとまった時間があるのでこの機会を活用してVPSのモニタリング環境を構築しようと考えた。
アプリケーションは、昨年業務で携わった新規プロダクトでお世話になっているGrafana + Prometheusを利用することにした。
なお、このエントリで紹介する環境ではVPS側にUbuntu14.04を、GCE側にUbuntu17.10をOSとして利用している。
GCEのセットアップ
GCEのコンソール から行える。
設定内容の「ゾーン」において、us-(central|east|west)1-*
を選択すると、右列の推定費用の欄に下記の注記が表示される。
今月の f1-micro インスタンス使用量は、最初の 744 時間分が無料です。
実際に「今月の請求額」を見てみると、稼働中のf1-microインスタンスに対して無料枠が適用されているのが確認できる。
フォームに沿って構築すると、管理画面内に無事にインスタンスが構築された。細かいセットアップ方法については今回紹介を割愛するが、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_create
は false
に設定。
[auth.github] enabled = false ... [auth.google] enabled = false ... [auth.proxy] enabled = false [auth.basic] enabled = true [auth.ldap] enabled = false ...
auth
は basic
のみ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はData Sourceのtypeとして Prometheus
をサポートしているので、こちらを選択する。
設定時に注意すべき点が何点かあるので列挙しておく。
Access
にはproxy
を選択。Prometheus
側でBasic認証をかけているので、HTTP Auth
のBasic Auth
のチェックマークをONにしておく。Basic Auth Details
のUser
とPassword
には、前述のPrometheus
のセットアップ時に設定した/path/to/prometheus_passwdfile
のUserName/Passwordを指定する。
Data source is working
が表示されることを確認する。
Dashboardの設定
動作確認のため、 Node exporter single server という公開されたdashboardをインポートする。
左上のロゴアイコンをクリックし Dashboard
-> Home
を選択後、 Import Dashboard
をクリックし上述のdashboardを取り込む。
Options
でdata sourceを選べばインポートが成功し、メトリクスが確認できるようになる。
これで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に投稿する
といったことができるようにしていきたい。
今年もどうぞよろしくお願いいたします。