Prometheus を Docker for AWS にデプロイしてみた

docker

はじめに

こちらの記事で、Prometheus という OSS のシステムモニタリング&アラート監視ツールに触れました。 Prometheus への入門を兼ねて、AWS 上の Docker Swarm にデプロイしてみたいと思います。

Prometheus とは?

もともと SoundCloud で 2012年から OSS として開発され、公開されているシステム監視&アラートツールキットです。 2016年 Kubernetes の次のプロジェクトとしてCloud Native Computing Foundationに参加しています。

主な機能は、以下のとおりです。

  • 多次元データモデル (メトリック名とキー/値のペアで識別される時系列)
  • 柔軟なクエリ言語
  • 分散ストレージに依存しない; 自律的な単一のサーバーノード
  • 時系列のコレクションは、HTTPを介したプルモデルを介して発生します
  • プッシュする時系列は、中間ゲートウェイを介してサポートされている
  • サービスの検出または静的構成を介してターゲットが検出されます
  • 多彩なグラフやダッシュボードのサポート

詳細については、以下の公式ドキュメントや SoundCloud のブログ記事を参照ください。

なお、本記事では Docker for AWS 環境が構成されていることを前提に進めます。 Docker for AWS への入門がお済みでない読者の方は、以下の記事を参考に環境を構築してください。

Prometheus をデプロイする

Swarm ノードへ SSH で接続してください。

$ ssh -i <path-to-ssh-key> docker@<ssh-host>

swarm node に対して git と docker-compose をインストールします。 moby linux を利用しているので apk コマンドを利用します。

$ sudo su -
# apk update && apk add git
# apk add py-pip
# pip install docker-compose

GitHub からソースを Clone します。

$ git clone https://github.com/vegasbrianc/prometheus.git
$ cd prometheus

docker-compose でコンテナをデプロイします。

~/prometheus $ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Creating network "prometheus_front-tier" with driver "bridge"
Creating network "prometheus_back-tier" with driver "bridge"
Creating prometheus_alertmanager_1 ... 
Creating node-exporter ... 
Creating prometheus_cadvisor_1 ... 
Creating node-exporter
Creating prometheus_alertmanager_1
Creating prometheus_alertmanager_1 ... done
Creating prometheus ... 
Creating prometheus ... done
Creating prometheus_grafana_1 ... 
Creating prometheus_grafana_1 ... done
~/prometheus $ docker-compose ps
          Name                         Command               State           Ports          
-------------------------------------------------------------------------------------------
node-exporter               /bin/node_exporter -collec ...   Up      9100/tcp               
prometheus                  /bin/prometheus -config.fi ...   Up      0.0.0.0:9090->9090/tcp 
prometheus_alertmanager_1   /bin/alertmanager -config. ...   Up      0.0.0.0:9093->9093/tcp 
prometheus_cadvisor_1       /usr/bin/cadvisor -logtostderr   Up      8080/tcp               
prometheus_grafana_1        /run.sh                          Up      0.0.0.0:3000->3000/tcp 
~/prometheus $ 

最後に、Grafana が Swarm Node の Port#3000 で待ち受けているため ELB にリスナーポートを追加します。 <CIDR IP range>は、環境に合わせて適宜許可する CIDR IP range を入力してください。

$ export SGID=`aws ec2 describe-security-groups --filters Name=tag-value,Values=ManagerVpcSG --query SecurityGroups[].GroupId --output text`
$ aws ec2 authorize-security-group-ingress --group-id $SGID --protocol tcp --port 3000 --cidr <CIDR IP range>
$ export ELBName=`aws elb describe-load-balancers --query LoadBalancerDescriptions[].LoadBalancerName --output text`
$ aws elb create-load-balancer-listeners --load-balancer-name $ELBName --listeners Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=3000

ブラウザから ELB にアクセスし確認します。

 ~ $ open http://`aws elb describe-load-balancers --query LoadBalancerDescriptions[].DNSName --output text`

なお、ここまでで Docker for AWS への Prometheus デプロイ作業は完了です。 Grafana の設定手順については、以下の記事を参照してください。

今回は、Import Dashboard で以下の Docker Dashboard を利用するために Dashboard ID 179 を入力し Load ボタンをクリックします。

Grafana New dashboard

最後に、Options のデータ・ソースとして Prometheus を選択し、Import ボタンをクリックします。

Grafana New dashboard 1

Docker Dashboard が表示されれば設定完了です。

Grafana Docker Dashboard

いい感じですね。

さいごに

Grafana Labs のサイトを確認していたところ、データソースとして AWS CloudWatch や elasticsearch など30以上のソースにも対応しているようでかなり面白そうだなと感じました。 引き続き、勉強しながら Grafana についてもキャッチアップしていければと思います。

ではでは