Rancherとconfdとmetadata-service


この記事はRancher Advent Calendarの12/3の記事になります。

きっかけ

Rancherでカタログを自分で作成する際、rancher/community-catalogは大変参考になります。んで、眺めていると気がつくことがあります。
「何か〇〇-confってイメージ多いな」
そこで〇〇-confのDockerfileを探ると、rancher/catalog-dockerfileや、その派生などのあちこちでconfdというツールが使われていました。

confdって何?

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

confdについての細かいところは他の方の記事に詳しく書かれているので是非そちらをご覧ください。
- confdでちいさく始めるインフラ構築の自動化
- confd を試す

Rancherにおけるconfdの役割

それでconfdがどうRancherと関係するのかというと、confdのQuick Start GuideにしれっとRancherの名前があるのがわかります。confdはRancherをバックエンドサービスとして利用できるということです。

でさらに読み進めていくと、Rancherのmetadata-service読んでね、って感じになります。つまりconfdmetadata-serviceと連携して動作します。
つまり↓こんな感じ

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

metadata-serviceを試してみよう

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

わかりやすく最初からcurlが入ってるcentosイメージで適当にStackを作ってみます。

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

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

ここみると各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

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

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

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

[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 が見えます。

[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

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

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

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

まとめ

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