K2NR.ME

このエントリーをはてなブックマークに追加 Tweet

Dokkaa

Dokkaaはマルチホスト・マルチコンテナ環境におけるdockerコンテナクラスタのオーケストレーション、サービスディスカバリ、ヘルスチェック、オートスケーリング等を管理するツールです。

ソースコード

dokkaaは複数のレポジトリで開発しています。

開発の動機

dockerをマルチホストで扱うためには(現状dockerだけでは解決できない)多くの課題があります。 Dokkaaの目的はマルチホストでのコンテナクラスタを管理する際に発生する問題を解決して、シンプルにクラスタを管理できるようにすることです。

Dokkaaが解決しようとしている問題は大きく分けて以下の4つです。

この内、サービスディスカバリについては、私のブログで考察しているので、ご一読ください。

http://k2nr.me/blog/2014/08/21/docker-container-management.html

ヘルスチェック、オートスケーリングに関しては現在未実装です。

開発の現状

dokkaaは現在も私個人で鋭意開発中のプロダクトです。 現段階では未実装のもの、仕様が変わるもの、多数のバグが含まれています。 以下では、現段階で実装できている部分について説明します。

使い方

使い方に関しては私のブログにまとめていますので、そちらの「つかいかた」以降をご参照ください。

http://k2nr.me/blog/2014/09/18/dokkaa-the-simplest-docker-cluster-platform-for-microservices.html

技術的な説明

上記ブログの操作説明を例に、内部で何が起こっているのかを時系列で解説します。

0. 起動時

2ホスト起動していると仮定します。 それぞれホストA(10.0.0.1)とホストB(10.0.0.2)と呼びます。 起動時は各ホストでconductor、ambassador、skydnsの3つのdockerコンテナが起動しています。

1. etcdへのnginxの登録

ユーザーがetcdに起動したいコンテナ情報をjsonで登録します。 例では、次のようなjsonを

{
  "image": "dockerfile/nginx",
  "scale": 1,
  "services": {
    "nginx": 80
  }
}

次のようなコマンドを実行してetcdに登録します。

$ curl -L -XPUT -d value="`cat nginx.json`" \
    http://<dokkaa IP address>:4001/v2/keys/apps/dummy/nginx/manifest

2. conductorによるnginxコンテナの起動

etcdにコンテナの情報が追加されたことを検知したconductorはその情報をもとにコンテナを起動します。 具体的には

上記の処理を行います。以下補足です。

3. conductorがnginxサービスのSRVレコードをskydnsに登録

nginxコンテナを起動した結果、ホストAにバインドされたnginxコンテナの80番ポートが49785だったと仮定します。(実際にはホストの空いているポートにランダムにバインドされます)

nginxのjsonに記述されているnginxサービス(nginxコンテナの80番ポート)はホストA(10.0.0.1)の49785ポートなので、skydnsに次のSRVレコードを登録します。

見ての通りですが、ドメイン名のルールは<サービス名>.<app名>.skydns.localです。

4. etcdへのcrawlerの登録

nginxコンテナと同じようにして、crawlerをjson形式でetcdに追加します。

{
  "image": "dockerfile/ubuntu",
  "scale": 1,
  "command": [
      "/bin/bash",
      "-c",
      "while true; do curl http://$SERVICE_NGINX_ADDR:$SERVICE_NGINX_PORT; sleep 2; done"
  ],
  "links": [
      "nginx"
  ]
}
$ curl -L -XPUT --data-urlencode value="`cat crawler.json`" \
    http://<dokkaa IP address>:4001/v2/keys/apps/dummy/crawler/manifest

5. conductorによるcrawlerの起動

conductorがコンテナを起動します。 このとき、conductorはホストBで起動します。 dokkaaは各ホストで起動しているコンテナの数が同じになるように、コンテナをどのホストで起動するか制御しているためです。 またこの時、conductorはコンテナに以下の環境変数をセットします。

crawlerのjsonにはサービスの指定はないのでskydnsへのドメイン登録は行いません。

6. crawlerからcurlを実行

crawlerは延々curl http://$SERVICE_NGINX_ADDR:$SERVICE_NGINX_PORTを実行し続けるコンテナです。 curlの宛先はhttp://ambassador:10001なので、crawlerと同一ホスト(ホストB)のambassadorがまずリクエストを受けます。

7. ambassadorがcrawlerコンテナの環境変数を確認

リクエストを受けたambassadorはdocker remote APIを通じてcrawlerの環境変数$BACKENDS_10001の値を確認します。

8. ambassadorがskydnsにドメイン確認

$BACKENDS_10001はconductorによってnginx.dummy.skydns.localに設定されているので、ambassadorはnginx.dummy.skydns.localを名前解決するため、skydnsにこのドメインのSRVレコードの解決を要求します。 すると、skydnsはnginx.dummy.skydns.local10.0.0.1:49785に解決します。

9. ambassadorが通信をnginxコンテナにプロキシ

nginxサービスが10.0.0.1:49785で動いてることがわかったので、ambassadorはcrawlerからのリクエストを10.0.0.1:49785に転送します

まとめ

まだまだ未完成のプロジェクトですが、将来的にはdokkaaを使用することで、マルチホストに渡るdockerクラスタの構築を簡単に実現できるようになることを目指しています。上で挙げた、Dokkaaが解決しようとしている問題を再掲します。

これらの課題を、dokkaaユーザーは

  1. jsonを記述して
  2. dokkaaのコマンドを一つ実行する

だけで解決できるようになることが目的です。

今後の課題