在Docker Swarm模式下使用node_exporter
如今,普罗米修斯做得非常出色,让人感到快乐。
如果在prometheus.yml中以docker service –mode global方式启动node_exporter,并指定以下的job,它会从DNS的A记录随机地找到并提供给我们。
- job_name: 'node-exporter'
dns_sd_configs:
- names:
- 'tasks.node-exporter'
type: 'A'
port: 9100
然而,Prometheus为node_exporter分配的instance标签有些棘手,可能会变成像10.0.0.44:9100这样的IP地址和端口号的组合。
由于Docker容器的IP地址在重新启动时可能会发生变化,这可能会导致数据的一致性受损。
目前存在以下问题,使得很难为Prometheus分配一致性的实例标签。
-
- 現時点ではSwarmKit は SRVレコードを扱えない (See https://github.com/docker/docker/issues/24605)
-
- node_exporter 側で node名などのラベルをインジェクションする提案は蹴られて実装されていない (See https://github.com/prometheus/node_exporter/issues/319)
- Prometheus 側ではコンテナのIPアドレスからどのノードで動いているのかresolveする機能は実装されていない
因此,我們創建了一個版本,將以下功能添加到現有的Prometheus和node_exporter中。
-
- node_exporter の起動オプション –name /path/to/hostname_file を追加。
http://node-exporter:9100/name はhostname_fileの中身の文字列をそのまま返す
docker service create –mount type=bind,src=/etc/hostname,dst=/etc/host_hostname,ro=1 的に mount して使用する事を想定。
prometheus の設定ファイルの dns_sd_configs: に name: オプションを追加。
jobに対してinstanceラベルを直接問い合わせる
name: “/name” と指定する事を想定 http://host:port/name の応答をinstanceラベルとする
以下是设定文件的示例:
- job_name: 'node-exporter'
dns_sd_configs:
- names:
- 'tasks.node-exporter'
type: 'A'
port: 9100
name: "/name"
Docker仓库:
* https://hub.docker.com/r/s21g/prometheus/
* https://quay.io/repository/s21g/node-exporter
github:
* https://github.com/genki/prometheus – 为genki的prometheus存储库
* https://github.com/genki/node_exporter – 为genki的node_exporter存储库