PrometheusからcAdvisorのメトリクスを取得する ~docker runで立ち上げ~

# はじめに
[Kubernetesの監視について調べた時](https://qiita.com/FY0323/items/82eeca93d00cbb4682e7)、cAdvisorを使う必要がありそうだと思ったのですが、cAdvisorのことをよく理解しておらず、「Kubernetesを立ち上げたら一緒に立ち上がったりするもの?」などと考えていました。このままではマズイので、cAdvisorのことを使い方から調べました。ここでは最低限cAdvisorを動かしてPrometheus(+Grafana)でメトリクスを取得できるようにします。

# cAdvisorとは
cAdvisor(Container Advisor)は、稼働中のコンテナの情報を集め出力し、リソースとパフォーマンス状況を教えてくれるツールです。取得するリソースは各コンテナの稼働状況(running,stoppedなど)、CPUやメモリの使用量などです。
![logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/9edaeff6-c342-5902-6e22-c3152238aca7.jpeg)
[公式のgithubページ](https://github.com/google/cadvisor)はこちらです。

# cAdvisorを起動
cAdvisorはdockerコンテナイメージで提供されているので、dockerコマンドや構成管理ファイルを用いて立ち上げます。ここではdocker runで直接起動する方法を紹介します。

## 実施環境
[こちらの記事](https://qiita.com/FY0323/items/72616d6e280ec7f2fdaf)と同様です。PrometheusやGrafanaの使い方等もこちらのページからご覧ください。

OS: Centos7
Kubernetes version: 1.13.1
User: 以下の作業は全てrootユーザで実行しています。

## docker runコマンド
[公式のgithubページ](https://github.com/google/cadvisor/blob/master/docs/running.md)を参照しながら、以下のようにコマンドを入力してコンテナを立ち上げました。

```
[root@k8s-master ~]# docker run --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
20fea528ac6bca0f2dd7b0d71a077920cdc770634af34a3da0e6f898938a9617
[root@k8s-master ~]# docker ps --filter "name=cadvisor"
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
20fea528ac6b        google/cadvisor:latest   "/usr/bin/cadvisor..."   17 minutes ago      Up 17 minutes       0.0.0.0:8080->8080/tcp   cadvisor
[root@k8s-master ~]# 
```

GUIから```http://<ホストのグローバルIPアドレス:8080>```にアクセスします。
![cadvisor-prometheus-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/446a59d4-cd6b-4f0a-9438-73ec9c38afc1.jpeg)
デフォルトで表示されているのは、CPUやメモリ、ネットワークなどです。
![cadvisor-prometheus-6.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/a7956e35-42cc-24f8-9771-e942742539f9.jpeg)
![cadvisor-prometheus-7.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/fbcdbbe4-690e-c50c-1041-607c48b49366.jpeg)
![cadvisor-prometheus-8.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/c90be39e-a770-d9cb-83b7-fba460196ec5.jpeg)
![cadvisor-prometheus-9.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/7a6bfd8c-c815-fa4f-6bfa-a142e120f962.jpeg)
メトリクスの一覧は、例えば```http://<ホストのグローバルIPアドレス:8080/metrics>```にアクセスすると表示されます。
![cadvisor-prometheus-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/abdd005d-490e-c8fa-9aaa-48606f74a957.jpeg)

# Prometheus(+Grafana)からメトリクスを取得する
cAdvisorが起動できたので、Prometheusからメトリクスを取得します。[Prometheusの公式ページ](https://prometheus.io/docs/guides/cadvisor/)に方法が紹介されています。

## コンフィグファイルの編集
Prometheusのコンフィグファイルに当たる```prometheus.yml```を編集し、ターゲットにcAdvisorを追加します。

```prometheus.yml
# 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

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

# ここからcAdvisorの部分に該当する
  - job_name: cadvisor
    scrape_interval: 5s
    static_configs:
    - targets: ['localhost:8080']
```

## PrometheusにGUIからアクセス
コンフィグファイルの編集を完了したらPrometheusを起動し、GUIから```http://<ホストのグローバルIPアドレス:9090>```にアクセスします。そして画面上部の```Status```→```Targets```をクリックすると、cAdvisorが表示されるのが確認できます。
![cadvisor-prometheus-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/0e9bd97a-45e9-8031-12c4-31324822ad0c.jpeg)
これでPrometheusでcAdvisorのメトリクスを収集できます。試しに```cadvisor_version_info```というわかりやすいメトリクスを取得してみます。
![cadvisor-prometheus-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/a023f0e2-0692-a17e-2673-dd3e4fcd3fca.jpeg)
取得が確認できました。

## GrafanaにGUIからアクセス
Grafanaからでももちろん確認できます。Prometheus Dashboardから新しいグラフを作成し、取得メトリクスを```cadvisor_version_info```と指定します。
![cadvisor-prometheus-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/177048/c4a41c19-b122-5faf-6784-7e08a64ba0f3.jpeg)

# まとめ
何も考えずにcAdvisorを起動するだけでしたら、このように簡単にできました。またPrometheus(+Grafana)からメトリクスを取得するのもそれほど難しくはなさそうです。
ただcAdvisorは長期間データを保存することができないため、InfluxDB等と組み合わせて使うことが多いようです。
また今回はdocker runコマンドで起動しましたが、yamlファイルを作成して起動することもできます。[公式ページではkustomizeを利用したデプロイ方法](https://github.com/google/cadvisor/tree/master/deploy/kubernetes)を紹介しています。

# 参考リンク
[【Docker】cAdvisorによるDockerコンテナの監視について](https://qiita.com/Yarimizu14/items/cf4fe14f4a5e3124b4ff)
[How to monitor docker containers using cAdvisor [ Part 1 ]](https://www.neteye-blog.com/2018/04/how-to-monitor-docker-containers-using-cadvisor-part-1/)
[How to monitor docker containers using cAdvisor [ Part 2 ]](https://www.neteye-blog.com/2018/05/how-to-monitor-docker-containers-using-cadvisor-part-2/)