Rancherとconfdとmetadata-service

[confd]:https://github.com/kelseyhightower/confd
[metadata]:http://rancher.com/docs/rancher/latest/en/rancher-services/metadata-service/
この記事は[Rancher Advent Calendar](https://adventar.org/calendars/2436)の12/3の記事になります。
  
きっかけ
===
Rancherでカタログを自分で作成する際、[rancher/community-catalog](https://github.com/rancher/community-catalog)は大変参考になります。んで、眺めていると気がつくことがあります。
**「何か〇〇-confってイメージ多いな」**
そこで〇〇-confのDockerfileを探ると、[rancher/catalog-dockerfile](https://github.com/rancher/catalog-dockerfiles)や、その派生などのあちこちで[confd][confd]というツールが使われていました。

confdって何？
====
[confd][confd]は軽量の構成管理ツールです。構成管理ツールというとansibleが有名ですが、それと比べて[confd][confd]が面白い点は、confdはバックエンドサービス(etcd, consul, dynamodb, redis, etc...)と連動して設定ファイルを書き換えることができる点です。  

[confd][confd]についての細かいところは他の方の記事に詳しく書かれているので是非そちらをご覧ください。
- [confdでちいさく始めるインフラ構築の自動化](https://qiita.com/keigodasu/items/d45dccf9412d92a71067)
- [confd を試す](https://qiita.com/summerwind/items/aa63d2e0cd096fda418d)

Rancherにおけるconfdの役割
===
それで[confd][confd]がどうRancherと関係するのかというと、[confdのQuick Start Guide](https://github.com/kelseyhightower/confd/blob/master/docs/quick-start-guide.md)にしれっとRancherの名前があるのがわかります。[confd][confd]はRancherをバックエンドサービスとして利用できるということです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/153776/817dd81a-fb86-1d46-b771-a43e625af742.png" width=70%>

でさらに読み進めていくと、[Rancherのmetadata-service][metadata]読んでね、って感じになります。つまり[confd][confd]は[metadata-service][metadata]と連携して動作します。
つまり↓こんな感じ
![rancher_confd.png](https://qiita-image-store.s3.amazonaws.com/0/153776/abd5be4a-1a94-23b2-174b-20d3248d2c0d.png)

①metadata-serviceと通信して、②その結果をconfファイル等に反映させているようです。
Stackを作成する時にその情報と連動できるため柔軟な設定変更が可能になります。

metadata-serviceを試してみよう
===
じゃあ、metadata-serviceと連動って具体的にどうなの？てなると思います。
[metadata-service][metadata]にもありますが、Rancher上で立てたコンテナからcurlで簡単に接続可能です。  

わかりやすく最初からcurlが入ってるcentosイメージで適当にStackを作ってみます。
<img width="1002" alt="スクリーンショット 2017-12-03 22.58.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/153776/f2076ae6-62c9-86bf-5537-e82e177aaddd.png">

早速コンテナに入り、curlでmetadata-serviceにアクセスしてみましょう。

```shell-session
[root@test-test-1 /]# curl http://rancher-metadata
2015-07-25
2015-12-19
2016-07-29
latest
```

[ここ](http://rancher.com/docs/rancher/latest/en/rancher-services/metadata-service/#versioning-of-metadata)みると各APIのバージョンと紐付いているようです。他のものは何なのでしょう？気になりますね。

|Version Reference|Version|
|:-:|:-:|
|v2|2015-12-19|
|v1|2015-07-25|

confdを使用したイメージのDockerfileをみると

```
CMD ["--backend", "rancher", "--prefix", "/2015-07-25"]
```

ってあって **この日付なんじゃい！？** と思っていたので納得です。
↓この辺とか
https://github.com/rancher/catalog-dockerfiles/blob/master/elasticsearch/containers/0.5.0/elasticsearch-conf/Dockerfile#L16

では次々掘り続けていきましょう。

```shell-session
[root@test-test-1 /]# curl http://rancher-metadata/2015-12-19/
containers/
hosts/
networks/
self/
services/
stacks/
version
```

色々情報が取れそうです。今回はserviceに行ってみましょう。(なお、実際に使用するのはselfだと思います。)

```shell-session
[root@test-test-1 /]# curl http://rancher-metadata/2015-12-19/services/ 
0=healthcheck
1=ipsec
2=router
3=network-manager
4=dns
5=scheduler
6=cni-driver
7=metadata
8=test
```

おお、今回作成した `test` が見えます。

```shell-session
[root@test-test-1 /]# curl http://rancher-metadata/2015-12-19/services/test
containers/
create_index
environment_uuid
expose/
external_ips/
fqdn
health_check
hostname
kind
labels/
lb_config
links/
metadata/
metadata_kind
name
ports/
primary_service_name
scale
sidekicks/
stack_name
stack_uuid
state
system
token
uuid
vip
```

おお、色々と更に細かい情報が。

```shell-session
[root@test-test-1 /]# curl http://rancher-metadata/2015-12-19/services/test/containers/
0=test-test-1
```

`containers` には今入っているコンテナが見えますね。これ以降もいろいろな情報が[metadata-service][metadata]から簡単に取得することが可能です。是非ご自身でも試してみてください。

まとめ
===
[metadata-service][metadata]で簡単にStackの情報が取得できることがわかりました。そしてその機能をconfdがうまく利用し、各MWの設定に反映しているということもわかりました。これでカタログ作成の幅が広がりますね。
(ホントはconfdのtemplateとかの設定例も出したかったのですが、時間が。。。また今度)