FluentdをMesos + Docker + Marathonで動かしてみた

Fluentd Advent Calendar 2013の一部です。(PSTだとまだ20日なのでお許し下さい。。。)

最初はiOSからCocoaFluentLoggerでなんか送って遊んでみようかと思ってたんですが、単にタップした場所のログ送るくらいだったらあっさりできてしまって(CocoaFluentLoggerの出来が良い)、それ以上楽しいことをやるにはiOSのスキルが足りなかったので、急遽Mesosで遊ぶことにしました。動かなかったらごめんなさい!

概要

今回はMesosクラスタの上にFluentd(td-agent)を好きな数だけ配置して、フロントとしてHAProxyを立て、バックエンドにElasticsearchを置いてみました。結果はKibanaで見ます。

Fluentd, HAProxy, Elasticsearch, KibanaはどれもDockerのコンテナにしています。今回はFluentdのみMesosクラスタ上にMarathon使って展開して、残りはMesos master上に手でコンテナを起動しています。エンドポイント的な存在はMarathon使って配置するとhostやportが変わるのでちょっと向きません。なんかいい感じのFrameworkが必要ですね。

確認した環境

作り方

buildにあります。Ubuntu 13.04をベースにVagrantfileを書きました。細かいことを除くと、Mesosphere提供のスクリプトでMesosとかをまるっとインストールして、いくつかDockerコンテナをpullして、自作のコンテナをbuildしてます。でかいんですが、packageしたboxをdropboxに置いたので、試すときは自分でbox作る必要ありません。

試し方

先ほどのboxをbaseにVagrantfileを書きました。git cloneしてvagrant upしてみてください。Mesos masterが1台とMesos slaveが2台起動して、クラスタが組まれているはずです。始める前にDocker(LXC)のdnsmasqにhostsファイルを確実に反映させるために、lxc-netを再起動します。(Dockerコンテナはホストのdnsmasqで名前解決する設定にしてます) なんか調子が悪そうならvagrant reloadするといいかもしれません。。。

$ vagrant ssh mesos-master
$ sudo service lxc-net restart

$ vagrant ssh mesos-slave[12]
$ sudo service lxc-net restart

ではまずmesos-masterにログインして、ElasticsearchとKibanaを起動します。

$ vagrant ssh mesos-master
$ sudo docker run -d -p 9200:9200 arcus/elasticsearch
$ sudo docker run -d -p 8888:80 -e ES_PORT=9200 -e ES_HOST=mesos-master arcus/kibana

これで手元のブラウザからhttp://mesos-master:8888を見ると、Kibanaが見えると思います。(hostmanagerがlaptopのhostsに追加してくれてるはず)

次に、Marathon経由でtd-agentをMesos上に展開します。envを渡したいのでjsonを手で書いてます。

$ vagrant ssh mesos-master
$ cat /vagrant/td-agent.json
{
    "id": "td-agent",
    "instances": "2",
    "mem": "100",
    "cpus": "1",
    "executor": "/var/lib/mesos/executors/docker",
    "cmd": "td-agent",
    "env": {
        "ES_PORT": "9200",
        "ES_HOST": "mesos-master"
    }
}
$ cat /vagrant/td-agent.json | http POST http://mesos-master:8080/v1/apps/start
HTTP/1.1 204 No Content
Content-Type: application/json
Server: Jetty(8.y.z-SNAPSHOT)

Marathonのページ(http://mesos-master:8080)を見ると、td-agentが起動してると思います。

最後に、HAProxyをmesos-master上のDockerで起動します。

$ vagrant ssh mesos-master
$ sudo docker run -d -p 5555:8080 -e MARATHON_URL=http://mesos-master:8080 -e APP_ID=td-agent -e HEALTH_PATH=/?json=%7B%7D haproxy

あとは徐ろにmesos-master:5555に対してFluentdのin_httpのフォーマットでログを投げてあげると、Kibanaで結果が見れるはず。

$ vagrant ssh mesos-master
$ http POST http://mesos-master:5555/test a=1

Mesos slaveは片方落としてもそこで動いてたFluentdのインスタンスはMarathonによって別のslaveに移されます。ただし、HAProxyの方にそれを反映するために、コンテナを再起動(docker restart CONTAINER_ID)する必要があります。

苦労したポイント

Fluentd, ES, KibanaをDockerで動かすのは前回できていたので、あとはMesosとの結合が大変でした。Mesosphereのスクリプトが新しいDockerの形式に対応してなくてパッチ送ったり、Mesosのhost名とhostsファイルの関係で苦労したり、Vagrantのネットワーク設定で苦労したり。。。

あと、MarathonのAPIからHAProxyのconfigを作るスクリプト書いたりしました。Mesoshpereが同じのを提供してますが、アプリケーション専用のHAProxyにしたかったのでpythonでサクッと書きました。Fluentdのin_httpはなにかパラメータ送ってあげないと200番返してくれないのでヘルスチェック用のpathもカスタムできるようにしてます。

まとめ

言葉で説明するよりも、レポジトリを覗いて実際にマシンを動かしてもらえれば、Mesos + Docker + Marathonのおもしろさが少しは伝わるかと思います。また、もしこの環境の上で何かしようという方がいれば少しは参考にはなるかと思います。疑問等あればコメントかTwitterでどうぞ。

Fluentdについてまったく手を動かしてなくて申し訳ないです。本当は、HAProxyにログを投げるweb app書いて、それもMarathonで展開して、別のHAProxy立てて、Mesos素晴らしい!みたいなところまでやろうと思ったんですが、やる気が無くなったのでみなさんの宿題とします。やる気のある人は僕に聞いてもらえれば何をすればいいかは教えられますので興味ある方はぜひ。

僕はというと、ひとまず満足したので、iOS作りに精を出したいと思います^^

参考リンク

opp 14-09-06 (土) 9:00

こんにちは。
試そうと思い boxをダウンロードしようとしたところ、401 Not Authorized でした。
可能であれば対応お願いします。
(github のリリースページとか便利です)
古い記事にすみません。