2014年01月

Retrobot はじめました

@mirakui さんの 1年前の自分と暮らす - 昼メシ物語 の記事を参考に自分も retrobot 導入してみた。=> @sonots_retro

レトロ画像は @ryopeko_retro 氏にどうやって作ってるの?ときいたところ、手軽にやるなら ImageMagick 入れて、

convert -sepia-tone 93% input.png output.png

で出来るよ、と教えてもらったのでそれでやった。@mirakui++ @ryopeko++ 

1年前というと Fluentd やり始めた頃だろうから、色々教えてあげたくなってしょうがない気がする。=> 去年の今日全然呟いてないからつまんない

追記: Instagram 使うのもお手軽ですね > レトロ画像 

Immutable Infrastructure Hackathon at :D を開催したら、configspec の敷居が高いのでコミッタになっていました

注: タイトルには釣り成分が含まれています

はてなの人達の開発合宿が羨ましかったので、昨日、社内の同志で集まって Immutable Infrastructure Hackathon at :D を開催しました。メンバーは自分(@sonots)と、最近 Node.js 日本ユーザグループ代表に就任した代表こと@yosuke_furukawa氏に、チーム Miami 仲間の@Spring_MT 氏、 @niku4i 氏、そして期待の若手 @takus 氏の5人でした。

ネタは各自バラバラで好きなものをやろうというスタンスで、自分は正月休みだし Serf 触ってみたの続きで、serf やろうかなぁと思っていたのですが、午前中には課題だと思っていた Serf の graceful restart の機能が すでにあることがわかったので、やることなくなっちゃった\(^o^)/ってかんじでした。

ということで、次に @mizzy さんが作っていた configspec という Immutable Infrastructure 用 Configuration Management Tool を触ってみることにしました。@mizzy さんの言を借りると、configspec は以下のような要件を満たすツールですね。

  • 冪等性とかどうでもいい
    • まっさらな状態からのセットアップでしか使わない
  • 依存関係とかどうでもいい
    • ファイル名順、上から書いた順で実行してく
  • 対象サーバに余分なものをインストールしたくない
    • 対象サーバに SSH さえできれば OK
  • シェルスクリプトよりは抽象度を高めたい
    • 今さらシェルスクリプトでのセットアップには戻りたくない… 

 で、自分としては一番試してみたかったのは、

機能で、これを使えば

  1. configspec で仮想サーバをセットアップする
  2. セットアップできたのを確認したら Dockerfile を吐き出す

というような手順を踏むことで、ひょっとして良い感じに動作保証された Dockerfile を作れたりするんじゃないか??と思ったので検証してみようと思った次第でした。結構 Dockerfile の動作検証辛いっすよね?


ということで、ふむふむ、なるほどー、と思いつつ README と コードを眺めてたのですが、

とのことだったので、まだそういう段階か、残念だなー、とか思っていたら、


という感じでいつのまにか、serverspec, configspec のコミッタになっていた。

あ...ありのまま今起こったことを話すぜ。何を言っているかわからねーと思うが(ry




そんなこんなありまして、とりあえず ruby を rbenv で入れる時にいつもやっている以下の2行の内容を ~/.bash_profile に足す、もしくは /etc/profile.d/rbenv.sh に作る作業を configspec でできるようにしたいなぁと思って
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
しこしこコーディングして
プルリクしました!! 

これにより、

describe package('httpd') do
  it { should be_installed }
end

というパッケージインストールに加えて第二のコマンド、

describe file('remote_path') do
  it { should be_sourced_from('local_path') }
end

が実行できるようになりました!!chef でいうところの remote_file みたいなもので、ローカルのファイルをリモートにコピーするコマンドですね。まだパーミッションオプションとか足してないけど ^^; 裏側では Net::SCP でファイルがコピーされますね(`・ω・´)

ということで configspec はまだこれからのプロダクトなので、皆でプルリク送っていけばいいんじゃないかな!!コミッタになれる敷居は低い!!w

以上、@sonots でした。

正月休みだし Mesos-Docker でプライベート IaaS っぽいもの構築してみた

正月休みだし1人ハッカソンやろうかなぁと思って、Mesos-Docker でプライベート IaaS っぽいものを構築してみたのでそのメモ。昨日は Mesos を触ったのでその続き。

1

まえおき

最近流行りの Immutable Infrastructure というアイデアは AWS (EC2) のように手軽にインスタンスを作ったり、消したりできるような IaaS があったからこそ発展して出て来たアイデアだと思っている。気軽にインスタンスを作ったり、消したりできないと、稼働中クラスタ(Blue) から、新しく立ち上げたクラスタ (Green) に、LBの向き先をすげかえることでデプロイとするような Blue-Green Deployment なんて正直やる気も起きないと思う。作ったり消したりするだけで何時間かかるんだ、と。

ということで、まずはプライベート IaaS を作ってみようと思う。昨日 Mesos (+ Marathon) を触ったかんじでは、さらに Mesos-Docker を追加すればできそうなかんじ。Immutable Infrastructure 関係なく、社内 IaaS あったらあったで便利だしね ^^ 

おさらい

昨日、Mesos (+ Marathon) を触ってみて

  • Mesos はクラスタリソースマネージャで、物理マシン(物理じゃなくてもいいけど)を一杯ならべて1つのクラスタとして管理し、タスクを走らせる時に効率的にリソースの分配をして実行してくれるもの
  • Mesos は基本的にはタスクを走らせるときにリソースを割り当てて終わったら解放する動きをするため、ウェブアプリのように常時起動するようなアプリケーションを動かすためには別の仕組みが必要で、それを可能にするのが Marathon

ということがわかった。元々プライベート IaaS が作れるのかな?と思って触った Mesos だけれども、Mesos そのものはもっと用途が広くて、Jenkins のジョブを分散処理させるのに使えたりするということもわかった。

今日は、本来の目的だった プライベート IaaS 構築のために、続けて Mesos-Docker を触ってみる。

Mesos-Docker とは

Marthon でウェブアプリを動かせるようになったけれど、Mesos Slave 上でそのままアプリが動くため、例えば rails アプリを動かそうとおもった場合、どの Mesos Slave に配分されても動くように全ての Mesos Slave なホストに ruby とアプリをインストールしておかないといけないわけで、これが perl アプリ、python アプリ、memcached、nginx のように多岐にわたると辛い思いをすることが想像に難くない。

というわけで、Docker コンテナに環境を隔離して、Docker コンテナとアプリを同時に起動させたいと思うのは当然の発想なわけで、それを実現してくれるのが Mesos-Docker である!!ということらしい。

あとは、1. 稼働中インスタンスを Docker イメージに保存して、2. イメージから複数インスタンスを立ち上げる、なんてことができれば IaaS と呼んでいいんじゃないかな!!

ということで試してみる。

Docker のインストール

Mesos から Docker を動かすにあたって、もちろん Docker が動くようにしておく必要があるので入れておく。CentOS の場合、CentOS 6.5 から対応された、と聞いているのでCentOS 6.5 環境に Docker を入れてみる。CentOS 6.5 に Docker をインストールしてみた - Shin x blog を参考にさせて頂いた。

インストール。epel 入れて yum で入れるだけっぽい。簡単ですねー ^^

sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
sudo yum -y install docker-io
sudo chkconfig docker on
sudo service docker start

試す

docker run centos /bin/echo "Hello World"
Hello World

おkおk

補足:RHEL6.4やCentOS6.4でDockerを使う | iOSS という記事もあるので、CentOS 6.5 じゃなくても良いっぽいすね。なんだと。。。

Mesos-Docker のインストール

Mesos-Docker の Tutorial に従ってインストール。

Ubuntu 13.04 環境であれば、Mesos, Marathon, Mesos-Docker をまとめて入れてすぐ試せるようなスクリプトを Mesos-Dockerが用意してくれているのでそれで試せるっぽい。これだけ。

curl -fL https://raw.github.com/mesosphere/mesos-docker/master/bin/mesos-docker-setup | sudo bash

ただ、今回は CentOS 環境に Mesos, Marathon を入れているのと、仕組み理解のため手でインストールしたいので、Mesos-Docker だけ別途入れる。Mesos-Docker 自体は python スクリプト一枚にすぎないっぽい。Mesos, Marathon のインストールは昨日の記事参照。

Mesos-Docker スクリプトが python の mesos モジュールを使うらしいのでそれを入れる。まずは easy_install (もとい、distribute) を入れておく.

curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py

mesos の src ディレクトリに行って、egg ファイルを指定して easy_install を使って mesos モジュールを入れる

# cd /path/to/mesos
sudo easy_install ./src/python/dist/mesos-0.14.2-py2.6-linux-x86_64.egg

そしたら Mesos-Docker を所定の位置に配置する。スクリプト1枚。

sudo mkdir -p /var/lib/mesos/executors/
sudo wget https://raw.github.com/mesosphere/mesos-docker/master/bin/mesos-docker -O /var/lib/mesos/executors/docker
sudo chmod a+x /var/lib/mesos/executors/docker

これはついでだけど、Mesos-Docker のサンプルが python な http クライアント httpie を使っているので、一緒にインストールしておこう。curl でも良いとは思うんだけど。

sudo easy_install httpie

Mesos-Docker を試す

昨日触ってた Marathon の Web UI のほうだと、executor (さっき配置した /var/lib/mesos/executors/docker)を指定できないので、REST API を叩いてインスタンスを起動するらしい。Mesos-Docker が python で書かれているということもあって、curl じゃなくて python 製の httpie を推していたので、httpie で REST API を叩いてみる。

Tutorial 通りに johncosta/redis イメージを起動してみる。redis が動くらしい。Docker の動作確認のためにまず単体で動かしてみる. docker pull で時間かかるし。

docker pull johncosta/redis
docker run -p 13000:6379 johncosta/redis

動いたっぽいので、止めて、Marathon の REST API 経由で Mesos-Docker (/var/lib/mesos/executors/docker) を起動し、Docker イメージを起動してみる。インスタンス2つで、それぞれにメモリ 128MB と CPU 1 コア割り当てている。

http POST http://localhost:8080/v1/apps/start \
 id=multidis instances=2 mem=128 cpus=1 \
 executor=/var/lib/mesos/executors/docker \
 cmd='johncosta/redis'

Marathon の REST API と docker ps で確認。2インスタンスが起動していてそれぞれ 31001 と 31000 ポートが Docker イメージの redis が動いている 6379 ポートにマッピングされていることが確認できる。素晴らしい!!

$ http GET http://localhost:8080/v1/endpoints
multidis 10445 localhost:31001 localhost:31000
$ docker ps
CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS                     NAMES
1f334f44596b        johncosta/redis:latest         /usr/bin/redis-serve   20 seconds ago      Up 5 minutes        0.0.0.0:31000->6379/tcp   nostalgic_curie
9ba7e36da75f        johncosta/redis:latest         /usr/bin/redis-serve   20 seconds ago      Up 5 minutes        0.0.0.0:31001->6379/tcp   angry_engelbart

あと、プロセス見るとこんなかんじで起動しているっぽい。

$ ps -ef | grep docker
root      5755  5754  0 Jan5 ?        00:00:41 /usr/bin/docker -d
root     19494 18355  0 15:13 ?        00:00:00 python /var/lib/mesos/executors/docker johncosta/redis
root     19537 19494  0 15:13 ?        00:00:00 docker run -cidfile /tmp/docker_cid.29feb8be79825de5 -c 256 -m 549755813888 -e PORT=31000 -e PORT0=31000 -p 31000:6379 johncosta/redis

Mesos + Marathon だけの時とは違って、Mesos Slave を動かしているホストには Redis を入れていないあたりがポイントになるかな。

一応 redis につないで動作確認。Docker インスタンスにしか redis-cli 入れていないので、telnet で動作確認してみる。

$ telnet localhost 31000
telnet> SET foo bar
+ OK
telnet> GET foo
$3
bar

できてるっぽい ^^

Docker イメージを作って動かしてみる

Tutorial は終わったので、ちょっと応用ということで、試しに @kazeburo さんがやってたGrowthForecast イメージを作って動かしてみる。

以下の内容のDockerfile を用意して

FROM centos
RUN yum -y groupinstall "Development Tools"
RUN yum -y install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel git ipa-gothic-fonts
RUN git clone https://github.com/tagomoris/xbuild.git
RUN xbuild/perl-install 5.18.1 /opt/perl-5.18
RUN echo 'export $PATH=/opt/perl-5.18/bin:$PATH' > /etc/profile.d/xbuild-perl.sh
RUN /opt/perl-5.18/bin/cpanm -n GrowthForecast
RUN mkdir -p /var/lib/growthforecast
EXPOSE 5125
CMD ["/opt/perl-5.18/bin/growthforecast.pl","--data-dir","/var/lib/growthforecast"]

ビルド。kazeburo さんも言ってたけど perl のインストールからやっているので結構待つ。

docker build -t sonots/growthforecast .

Docker Repository に push。ここでも 8分ぐらい待つ。

docker push sonots/growthforecast

NOTE: push したので、誰でも `docker pull sonots/growthforecast`で GrowthForecast イメージが利用可能ですよ :D

Marathon の REST API を叩いてインスタンスを起動

http POST http://localhost:8080/v1/apps/start \
 id=multidis instances=1 mem=128 cpus=1 \
 executor=/var/lib/mesos/executors/docker \
 cmd='sonots/growthforecast'

今回はお試しなので Public な Docker Repository を使ったけれど、お試しでなければ Docker Private Repository を作ってそこに push すると良いと思う。@hansode 先輩の Private Docker Registryを、あっさりセットアップする | blog.hansode.org あたりが参考になると思う。

Docker イメージを更新してみる

あとは、AWS (EC2) というか一般的な IaaS を思い浮かべると、稼働中インスタンスをイメージに保存したり、それをロードしたりできるわけなので、稼働中インスタンスのイメージを保存できるか試してみた。

普通に考えたら ssh でログインしてイメージをいじる所だけど、イメージ作る時に 22 番ポートを EXPOSE し損なったので、docker run -i /bin/bash 経由で入っててきとうに更新してみる

$ docker run -i -t sonots/growthforecast /bin/bash
bash-4.1# touch foobar

別の端末から。docker commit するのに CONTAINER_ID とやらが必要らしいので docker ps して確認しておく。

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS               NAMES
9f1e6bd3b707        sonots/growthforecast:latest   /bin/bash              5 minutes ago       Up 5 minutes        5125/tcp            mad_shockley
1722e2132d86        johncosta/redis:latest         /usr/bin/redis-serve   About an hour ago   Up About an hour    6379/tcp            pensive_euclide

docker commit する。Dockerfile で書いていた EXPOSE とか ENV とかが無効になってしまうらしく、もう1度指定しないといけないっぽい。しかも書式が違う。腐ってる。。。T T

docker commit -run '
{
    "ExposedPorts": {
        "5125/tcp": {}
    }
}' 9f1e6bd3b707 sonots/growthforecast:ver0.1
a19c64a51f57240021a692763d3e4e1ffe4e3c30f9b6bb3d60ffc16d6cc3adc1

commit を push する。

$ docker push sonots/growthforecast
539c0211cd76: Image already pushed, skipping
e0a46671a1a1: Image already pushed, skipping
e9ac1d2181c2: Image already pushed, skipping
73b535b31569: Image already pushed, skipping
0ab2bcc34de5: Image already pushed, skipping
c93a9f909863: Image already pushed, skipping
612ae052964f: Image already pushed, skipping
8ca763201bcf: Image already pushed, skipping
f4dc9b0755e4: Image already pushed, skipping
7b1d554ace5c: Image already pushed, skipping
a19c64a51f57: Pushing [==========>                                        ] 2.048 kB/10.24 kB 25s
Pushing tags for rev [a19c64a51f57] on {https://registry-1.docker.io/v1/repositories/sonots/growthforecast/tags/ver0.1}

push された。あとは、再度 Marathon の REST API を叩いてインスタンスを起動すれば良い。

http POST http://localhost:8080/v1/apps/start \
 id=multidis instances=2 mem=128 cpus=1 \
 executor=/var/lib/mesos/executors/docker \
 cmd='sonots/growthforecast'

まとめ

Mesos-Docker を使って、1. 稼働中インスタンスをイメージに保存して、2. イメージから複数インスタンスを立ち上げる、という IaaS の基礎要素を実現できることが確認できた。あとはそれらをボタン1つでサクッとできるようにすれば、プライベート IaaS の出来上がり、ってかんじかな。

もう少しつっこんで、起動と同時に github からソースコードを pull してアプリを動かす、とかできるようにすると、プライベート PaaS も構築できるのかもしれない。オープンソースアプリだけでこういうものを、サクッとは言えなかったけど ^^; 自分で構築できるようになったとは時代も進んだもんですねー :D

まだまだ触ってみたレベルで、Mesos がやってるタスクの分配アルゴリズムや、リソースの利用を制限している仕組みなど、いろいろ良くわかっていなかったりするので、また時間を取って、もう少し深堀りしていきたい。

ぼやき

ただ、Mesos + Marathon + Docker + Mesos-Docker と4つもコンポーネントを組み合わせて作った上に、それぞれが依存をたくさん持っていて正直辛かった。言語も C++, Python, Java, Scala と多岐に渡ってるし 。

そして、virtualbox イメージ作ろうかと思って、1度環境クリーンにして作り直したら Mesos-Docker が動かなくなったというのはまた別の話。。。腐ってる。。。もう1日正月休みがあれば深堀り出来たと思うんだけど、無念><

以上、@sonotsでした。

追記: @riywo さんに教えてもらった。Vagrant で立ち上げるとデフォルト CPU 1 なので、Marathon にinstances=2 cpus=1 と指定するとコア数が足りなくて2つ目のインスタンスが立ち上がらない、ということだった。ログに ERROR でないとかマジ泣けるT T だから virtualbox 作ろうとしたらおかしくなったのか。Vagrantfile で

   config.vm.provider :virtualbox do |vb|
     vb.customize ["modifyvm", :id, "--cpus", "4"]
     vb.customize ["modifyvm", :id, "--memory", "1024"]
   end

 のように CPU コア数を MBA のコア数 4 に指定したところうまくいくようになった。riywo++

正月休みだし Mesos 触ってみた

正月休みだし1人ハッカソンやろうかなぁと思って、Mesos を触ってみたのでそのメモ。ちなみに昨日は Serf  を触った。

触ってみた動機

はてなの人たちがサービス開発合宿を開催しましたの中で、

ということをやっていておもしろそうだったので自分もやってみた。記事を読む限りは最近流行りの Immutable Infrastructure を実現するのに Mesos がとても重要なポジションを占めることになりそうな気がしたので今のうちに触っておこう、と。

もう少し言うと上記の記事を読む限り、Mesos を使うと従来 vm を建てる時に、リソースが空いている物理サーバを見つけるために

  1. 物理サーバにすでに載っている vm の一覧を作る
  2. vm がそれぞれ使っている CPUコア数, メモリリソースを取得し、合計する
  3. 物理サーバのリソース - 2の合計 = 空き、があるか確認する

とかやってる作業を自動化できるというか、つまるところ AWS (EC2) みたいなものを自分で作れるのかな?と思って確認のために触ってみた。プライベート IaaS キタコレ。

Mesos とは

「めそす」と読むっぽい。オフィシャルサイト mesos.apache.org の Introduction を適当に要訳するとこんなかんじ

リソース効率の高い分散システムを簡単に作れる Apache Mesos

Apache Mesos は、分散アプリケーション or フレームワークに対して、効率的なリソース分離、共有を提供するクラスタ管理ソフトです。Mesos を使うと、ノードの動的共有プール上で Hadoop, MPI, Hypertable, Spark, その他のアプリケーションを走らせることができます。

特徴

  • ZooKeeper を使ったフォールトトレラントな複製マスター
  • 10,000 ノードのスケーラビリティ
  • Linux コンテナとタスク間の分離
  • マルチリソーススケジューリング (メモリとCPU)
  • 新しい並列アプリケーションを開発するための Java, Python, C++ のAPI
  • クラスタの状態を表示するためのWeb UI

つまり、物理マシン(物理じゃなくてもいいけど)を一杯ならべて1つのクラスタとして管理し、タスクを走らせる時に効率的にリソースの分配をして実行してくれるものらしい。

Twitter で使っているとか。

Mesos のインストール

Getting Started をやってみる。

簡単に試すには Mesosphere, Inc が Mesos を AWS (EC2) 上で簡単に試せる Elastic Apache Mesos というものを提供しているようなのでそれを使うのが良さそう ※うまいかんじにリソース管理して vm インスタンス作ってくれる EC2 上でさらにリソース管理アプリを動かすとかなんかシュール^^

前提パッケージインストール

なんか色々必要っぽい。これは辛い ^^; なお、CentOS 6.2 環境2台で作業している。

sudo yum install gcc-c++
sudo yum install python26-devel python-devel
sudo yum install cppunit-devel
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum install libunwind-devel
sudo yum install java-1.7.0-openjdk-devel

Getting Started に書いてないけれど、以下も必要だった

sudo yum install zlib-devel libz*
sudo yum install libcurl*

Mesosのインストール

ダウンロードしてビルド

wget http://ftp.riken.jp/net/apache/mesos/0.14.2/mesos-0.14.2.tar.gz
tar zxvf mesos-0.14.2.tar.gz
cd mesos-0.14.2
./configure
make

20分ぐらい待つ ^^;

Example Frameworksを走らせてみる

ちょっと Mesos でいうところの Framework が何を意味しているのかわからないけれど、とにかく Getting Started どおりに動かしてみる

Mesos Master の起動。デフォルトは 5050 番ポートなんだけど、作業環境の諸事情により 8080 番ポートで起動。

$ bin/mesos-master.sh --port=8080
I0104 16:52:20.463269 42585 main.cpp:115] Starting Mesos master
I0104 16:52:20.463495 42605 master.cpp:269] Master started on 192.168.0.1:8080
I0104 16:52:20.463572 42605 master.cpp:284] Master ID: 201401041652-311501066-5050-42585

これで 192.168.0.1:8080 のIPアドレス:ポートで Mesos Master が起動したっぽい。Web UI があるらしいのでブラウザから

http://192.168.0.1:8080

にアクセスしてみるとダッシュボードが見れる。こんなかんじの画面

MesosDashboard_Main

次に Mesos Slave を起動してみる. 5051 ポートで起動したっぽい。

$ bin/mesos-slave.sh --master=192.168.0.1:8080
I0104 16:57:38.998226 49331 slave.cpp:114] Slave started on 1)@192.168.0.1:5051
I0104 16:57:38.998725 49331 slave.cpp:214] Slave resources: cpus(*):32; mem(*):22966; disk(*):272424; ports(*):[31000-32000]

Mesos Master 側を覗いてみると、以下のように slave が追加されたと表示されている。

I0104 16:57:39.001976 42609 master.cpp:1075] Attempting to register slave on host1 at slave(1)@192.168.0.0.1:5051
I0104 16:57:39.002029 42609 master.cpp:2167] Adding slave 201401041652-311501066-5050-42585-0 at hst1 with cpus(*):32; mem(*):22966; disk(*):272424; ports(*):[31000-32000]
I0104 16:57:39.002377 42627 hierarchical_allocator_process.hpp:445] Added slave 201401041652-311501066-5050-42585-0 (host1) with cpus(*):32; mem(*):22966; disk(*):272424; ports(*):[31000-32000] (and cpus(*):32; mem(*):22966; disk(*):272424; ports(*):[31000-32000] available)

Slave が1台だと面白みがないので、もう1台別のマシンも Mesos Slave として Master につないでみる。これで Slave 2台の構成に。

$ bin/mesos-slave.sh --master=192.168.0.1:8080

Mesos Dashboard の Slave タブを開くと追加されていることがわかる。

MesosDashboard_Slave

では、サンプルタスクを走らせてみる。Mesos の python 部分のテストを Mesos で走らせるサンプルっぽい?

src/examples/python/test-framework 192.168.0.1:8080

実行すると ActiveFrameworks に処理が表示され、終わると TerminatedFrameworks に表示がうつる。

MesosDashboard_Terminated

TerminatedFrameworks のリンクをクリックすると、どのホストでタスクが実行されたのかがわかる。

MesosDashboard_Completed

Host が2つにバラけているので、Mesos がうまい具合にタスク単位で複数 Slave に処理を分散させてくれているっぽいことがわかったけど、タスクの定義をどこでやっているのかがよくわからないので後で調べる。誰か教えて ;-)

Marathon とは

さきほど試したかんじだと、Mesos は基本的には、タスクを走らせるときにリソースを割り当てて、そのタスクが終わったらリソースを解放する、という動きをするものだった。

ウェブアプリのように常時起動するようなアプリケーションを動かす場合には、別の仕組みが必要で、それを可能にするのが Marathon という(メタ)フレームワークらしい。

Marathon の README を適当に要訳するとこんなかんじ。Mesos 触る前に読んだ時は意味不明だったけど、ちょっとは意味がわかるようになってきた。

Marathon は long-running サービスのための Mesos フレームワークです。Mesos が kernel だとしたら、Marathon はinit や upstart デーモンのようなものです。

Marathon はサービスを開始、停止、スケールさせるための REST API を提供します。Marathon は Scala で書かれており、複数の Marathon インスタンスを走らせる事で高可用性を確保できます。実行中タスクの状態は Mesos の抽象的な状態として保存されます。

Marathon はメタフレームワークなので、Chronos や Storm といった他の Mesos Framework を Marathon 上で走らせる事ができます。Marathon は標準シェルから起動できるものならなんでも原知らせる事ができます。Marathon 上で Marathon を走らせることもできます。

特に Mesos 試す前は「Mesos が kernel で」みたいなことが書いてあったから、本当に OS なのかと盛大に勘違いしていた。その上で Linux を動かすのかな?とか思ってたので、危なかった ^^;

Marathon のインストール

Marathon の README どおりに Mesos に Marathon を追加してみる。

事前準備

ZooKeeper 付きで起動しないといけないらしいので、ちょっと作業し直す。ZooKeeper は Mesos にくっついてダウンロードされている。

# cd /path/to/mesos
cd 3rdparty/zookeeper-3.3.4
cp conf/zoo_sample.cfg conf/zoo.cfg sudo ./bin/zkServer.sh start cd -

Mesos を ZooKeeper 付きで起動しなおす.

bin/mesos-master.sh --zk=zk://localhost:2181/mesos
bin/mesos-slave.sh --master=zk://localhost:2181/mesos

Marathonのビルド

git clone して mvn build して jar を作る。めんどい。

maven を入れる

wget http://ftp.tsukuba.wide.ad.jp/software/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.zip 
unzip apache-maven-3.1.1-bin.zip
sudo mv apache-maven-3.1.1 /opt/maven

marathon をビルド

cd
git clone git@github.com:mesosphere/marathon.git
cd marathon
/opt/maven/bin/mvn package

target/marathon-0.2.2-SNAPSHOT-jar-with-dependencies.jar ファイルが出来た。

Marathonを起動

bin/start --master zk://localhost:2181/mesos --zk_hosts localhost:2181

8080番ポートで Marathon UI が起動するらしいのでアクセスしてみる。

Marathon

右上の New ボタンを押すとアプリケーション設定がでてきて、実行するコマンドと割り当てるリソースを指定できる。 試しに仮想ウェブアプリということで ncコマンドで簡易HTTPサーバ をたてて遊んでみる。

while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l $PORT; done

Marathon_New

アプリが追加されるのでクリックしてみると、編集画面が表示されて、Scale ボタンからインスタンスの数を増やしたり、Destroy ボタンで破棄したり出来る模様。下の画像はインスタンスを2つにしてみた結果の画像。1つはホスト w5 で、もう1つはホスト w6 で実行されている。ぶ、分散されてる!:D

Marathon_Edit

ここで表示されているポート番号が $PORT 変数に設定されて、nc コマンドが起動されているっぽいので、curl で試してみる

$ curl http://localhost:31826
Hello World

おー、できた。さらに Mesos Slave でプロセスを確認すると、

$ ps -ef | grep "nc -l"
sonots     15994 15931  0 19:31 ?        00:00:00 sh -c while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l $PORT; done

と確かにプロセスが起動していることを確かめられた。なお、このプロセスの親プロセスが

$ ps -ef | grep 15931
sonots     15931  4165  0 19:31 ?        00:00:01 /home/sonots/mesos-0.14.2/src/.libs/lt-mesos-executor
sonots     15994 15931  0 19:31 ?        00:00:00 sh -c while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l $PORT; done

のように mesos-executer とやらになっていて、こいつがリソースの利用を制限したりしているのだろうけれど、この辺りまだどうやってるのかわかっていない。

あと、今回は UI 上でアプリを追加したり削除したりしてみたけれど、REST API が用意してあって、コマンドラインで追加、削除することも出来る模様。ありがたい。

Mesos-Docker

Marthon でウェブアプリを動かせるようになったけれど、Mesos Slave 上でそのままアプリが動くわけなので、例えば rails アプリを動かそうとおもった場合、どの Mesos Slave に配分されても動くように全ての Mesos Slave に ruby をインストールしておかないといけないわけで、これが perl アプリ、python アプリ、memcached、nginx のように多岐にわたると辛い思いをすることが想像に難くない。

というわけで、Docker コンテナに環境を隔離して、Docker コンテナとアプリを同時に起動させたい、というのは当然の発想だと思う。それを実現してくれるのが Mesos-Docker なんだと思う。便利!

ということでこの辺は明日やる。まだ触ってない ^^;

おまけ

せっかく調べたので蛇足っぽい気もするけど、もうちょっとメモを晒す

数少ない日本語リソースの中から Mesos: A Cloud Scheduler (1) - steps to phantasien の記事を引用させてもらうと

資源割り当ては大きな分散システムにとって一般的な問題。実際 Hadoop の中にはそんな仕組みがあるわけだけれど、同じ事を Hadoop 以外でもやりたい。

ということで、Mesos は、Hadoop がやっていた資源割り当てを、Hadoop 以外でも使えるように一般化したもの、と考えてよいらしい。 そちらの記事でも言及しているけど、今は Hadoop 本体でも YARN という形で、データ処理とクラスタリソースマネジメントを分離したらしいので、それと競合になっている。

その辺が気になる Hadoop 界隈の人は @kimutansk さんの Hadoop YARNとApache Mesosの違いって何? - 夢とガラクタの集積場 の記事を読むと良さそう。 要約すると、Hadoop で使うにはもちろん YARN のほうがいいけど、それ以外のアプリケーション(Dockerとか)目的で使うには Mesos のほうが仕組みが出来上がっているという印象。ってかんじですかね。

あと、Jenkins を Mesos 上で動かすこともできるっぽい => jenkinsci/mesos-plugin。 Jenkins slave でタスクを実行するときに、いいかんじにリソース配分してくれて並列実行してくれるのかな。なんか良さそう。今回は触ってないけど. 

まとめ

Mesos (+ Marathon) を触ってみた。

  1. Mesos はクラスタリソースマネージャ。物理マシン(物理じゃなくてもいいけど)を一杯ならべて1つのクラスタとして管理し、タスクを走らせる時に効率的にリソースの分配をして実行してくれるもの
  2. Mesos は基本的にはタスクを走らせるときにリソースを割り当てて終わったら解放する動きをするため、ウェブアプリのように常時起動するようなアプリケーションを動かすためには別の仕組みが必要で、それを可能にするのが Marathon

ということがわかった。元々プライベート IaaS が作れるのかな?と思って触った Mesos だけれども、Mesos そのものはもっと用途が広くて、Jenkins のジョブを分散処理させるのに使えたりするということもわかった。

まだ Mesos-Docker を触っていないので結論を出すのは早いのだけど、プライベート IaaS っぽいものを作れそうな気がしてきたし、はてなの人たちがやっていたような Immutable Infrastructure というか Blue-Green Deployment の仕組みも作れそうなのでワクテカしている ← 今ココ

ただ、タスクの分配アルゴリズムや、リソースの利用を制限している仕組みなど、詳細な仕組みがまだ良くわかっていなかったりするので、そのあたりは今後の課題としたい。誰か詳しい人教えて :D 

続き: 正月休みだし Mesos-Docker 触ってみた 

Further Reading

日本語リソースがほとんどないのだけれど、自分の観測範囲では Mesos の記事を書いているのは @jedipunkz 氏、@kimutansk氏、@riywo 氏のお三方ぐらいなのでこの三人をフォローしておけば良いのかな。特に @kimutansk 氏は論文まで読んでいるようで頭が下がります。参考になりますm(_ _)m

2013 年振り返り

もう1月4日になってしまったけれど、2013年を振り返ってみる。

1月

D社に10月に入社して、12月まではサンフランシスコ支社の仕事をすることになってちょくちょく出張とか行っていたのだけれども、1月半ばから落ち着いたので、この辺から本来やる予定だった Fluentd 関連の仕事をやりはじめたり、shibuya.rb など渋谷近隣の勉強会に参加し始めたと記憶。

capistrano-colorized-stream という便利 gem を作った話を shibuya.rb でしてきた。rubygems に登録した gem だとこれが1つ目かも。記念 gem。

2月

Fluentd Casual Talks #2 で Haikanko という Fluentd クラスタ管理ツールの話 をしてきた。まだ Fluentd 触り始めて少しの時にトークしない?と話を受けたので急いで動く所まで持っていった記憶。たった10分だったけど、人が多くて緊張した。

聞く側から話す側にまわったのはこの頃からか。

3月

記録によるとずっと Haikanko ごにょごにょしていたっぽい。3月中に社内で運用に載せたくて頑張った。

3月の時点ではオレオレだった Fluentd プラグインを、github に公開して gem 化したりもした。

4月

Haikanko OSS 版を公開した。社内依存のコードを切り離すのにすごい苦労した覚えがある。ロゴの pull request が来たりして、ソーシャルコーディング楽しい ^^ と思ったりした。

運用に載せてちょっと時間が経ったので、情報共有の意味も含めて社内でも Haikanko の話をした。

あと、お昼食べるのにタクシーで下北沢行ったりして、これがソシャゲ業界か!とガクブルしたりした。

5月

Haikanko も一旦形になったので、Yohoushi という名のグラフツールを作り始めた。まだ、RRDtool ベースなのか Javascript ベースなのか、それとも gnuplot ベースなのかとか悩んでいる段階だったと思う。名前も まだ Yohoushi じゃなかった。

あと、会社でやっている運動会@横浜スタジアムに奥さん連れていったりして、ソシャゲ業界すげーな、と思ったりした。

6月

Ruby Kaigi に始めて出席して(去年なかった)LT してきた。 前職の会社もスポンサーしてたりして、現職と前職のロゴと並んでたりしててちょっと感慨深かった。Ruby Kaigi すごい良かった。

この時 Haikanko の話をしたけれど、仕事としてはひたすら Yohoushi を作っていたと思う。

あと、Ruby Kaigi のときに Fluentd ユーザリストに載せないの?と言われたので会社に話したら載せてもらおう、ということになったのでやり取りしてた。載せてもらった。

7月

Ruby Kaigi の時に話があった Rails Tutorial 翻訳の話に参加して1章だけだけど翻訳業やった。1章だけなんだけど、すごい疲れた記憶がある。次はもっとうまくやれるはず。

そして、Yohoushi を公開した。Monitoring Casual Talks #4 と shibuya.rb で話してきた。

プライベートでは北海道旅行に行ったかな。涼しくてすごい良かった。

8月

なにやってたかな。仕事では Yohoushi に集中している間に溜まってしまった Haikanko チケットをとにかく片付けていた気がする。

Fluentdコア&プラグイン開発ハッカソン #1 &生ハム原木会 に参加して、Fluentd v11 用にプラグインをポーティングするとかやってた。@frsyuki 氏、@tagomoris 氏と直接話をしながら開発できてすごい良かった。またやりたい。

プライベートでは、始めて席とって花火見に行った。迫力がすごい。

9月

Ruby Kaigi の懇親会の時にるびまへの寄稿依頼を受けてFluentd v11 の話を書いた。その時にバグを「注意事項」みたいに書きたくなかったので、直してプルリクエスト送りまくってたら、Fluentdコミッタになっていた。

あと、YAPC::Asia があった。前回の参加は前職の最終出社日だったから1年たったんだな、としみじみ。 YAPC::Asia で @kazeburo さんにご挨拶したら GrowthForecast コミッタになっていた。Twitter 上だけで知っている人たちと実際に会ってはなせたのですごい良かった。

コミッタ権を色々もらった月だった。

10月

ISUCONにはじめて参加した。 ISUCONに参加するにあたって、チューニングパラメタ調べたり、あんまり関係ないかもしれないけど OS のカーネルレイヤー(というかシステムコールレイヤー)にも目が向いたりして、すごい意識改革のきっかけになった。 それまでは、リーダブルコード至上主義だったけど、リーダブルかつパフォーマンスも出るコードを書くように意識するようになった。

11月

会社のお金で RubyConf 2013 に参加した。DeNA++。初海外カンファレンス。Ruby コミッタ陣と実際に会ってはなせたのですごい良かった。Ruby にプルリク送った話 をしてきた。Ruby に貢献できて良かった。

ISUCON本戦が RubyConf と被っていて出れなかったのが残念だった。

12月

Fluentd Advent Calendar を作った。Advent Calendar を主催したのははじめてだった。最終的には全部埋まってたのありがたい。

Fluentd Casual Talks #3 でお話してきた。1年前は Fluentd 触り始めて1ヶ月経ってないような時だったが、今は主催者側にまわっていて(会場係)、Fluentd コミッタにもなっているのだから成長したものだ。

総括

2013年の目標としては、転職したということもあって、新しい会社で「〜と言ったら sonots」と言われるようなポジションを確立することであったが、現在社内において「Fluentd と言ったら sonots」と言われるようになっているのでその点は達成できたと思う。

社外向けには、「インフラ用のアプリを作っているD社の人」という認識を持たれたいと思っていたが、まだ Haikanko、Yohoushi ぐらいしか作れていないのでちょっと弱いかと思っている。前職でやってたプロビジョニング系は現職では未着手だし。

あと gem を一杯作るようになって良かったな、と思っていたけど今眺めてみたらほとんどが Fluentd プラグインなので 2014 年はもっと汎用的な便利 gem を一杯作っていったほうがいいなと思った。

あと実は読んだ本を列挙したかったのだけど、思いのほか少なかったのでやめた。 会社が変わって、帰ってくるのが遅くなったのが明らかに影響している。もっと本を読む時間を取りたい。

ウェブ業界で知り合いがたくさんできたのがすごい良かった。前職はウェブ業界ではなかったので、最初の頃はぼっちだったのだけど、最近だと勉強会にいけば知り合いがいるので楽しい。Twitter で〜がわからん、とか書くと皆教えてくれるとかホント助かります。ありがとうございます。皆++

2014年の目標

社内におけるポジショニングは確保できたが、それだといささか弱いことに気づいたので、ウェブ業界において「〜と言ったら sonots」のようなポジションを確立したい。なにを尖らせたらいいのかわかんないけど。

あと執筆業をまったくやれていないのでなんか書きたいし、でかい会場で発表してプレゼンス向上していきたい。

A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー