もっと瞬殺で作るMesos + Marathon + Dockerクラスタ環境 on Azure

この牛尾さんの記事からまだ1年半くらいしか経ってないのに、もうほんとに色々と変化の流れが速すぎて、僕はもう少し枯れたところでどんぐり拾いみたいなのするのが好きなのに、どうしてこうなった感。

qiita.com

僕のこの記事自体ももう来年には古くなってるんだろうな。あ、なので、2016年10月現在の情報ですので注意してくださいー。

Microservicesの素振り環境

Microservicesって仕事でいきなり「やってみたい!」って言って導入できるようなもんじゃないなって思って。技術力も運用力も組織力も、色んなもののレベルが高くないとひどく失敗してしまいそうだなって。とはいっても、結構色んな問題を解決してくれる一面もありそうだから、まずはどんなものなのか、技術的に少し体験しておきたい。というのが動機。

Javaが好きなので、Spring Cloudで作ったアプリをDockerに入れて、複数うごかして(∩´∀`)∩ワーイみたいにできたい!

Azure Container Service

牛尾サンの記事みたいにVagrantを複数upしようとすると、逆に僕の貧弱なMBAが瞬殺されてしまうので、どこかで動かしたい。てことで、Azureをウロウロして、Azure Container Serviceというものを見つけたのでそれを使ってみることにした。

全く触ったことのない状況で、Azureのポータルを開いて、全然分かんなくて、そっと閉じたあの日からもう2ヶ月。最近ほんのちょっとだけ慣れてきた。

DC/OS

Azure Container ServiceにはMesosphere DC/OSバージョンとDocker Swarmバージョンがあって、なんとなくDC/OSを選んだ。DC/OSの今の僕の認識はこんな感じ。

f:id:bufferings:20161015223549p:plain

複数のマシンを1つのリソースのようにして捉えることができて、その上でコンテナを動かすことができる感じ。もう少し詳しく見るとこうなってる。

f:id:bufferings:20161015224151p:plain
(from https://mesosphere.com/product/ )

インフラの上に Apache Mesos がかぶさってる。Mesosのおかげで、インフラのことを気にせずに「CPU 0.2 と、メモリ 512MB使うタスクを実行させてほしいんだけど!」って言えて。Mesosがどっかでそのタスクを実行してくれる。

で、そのMesosの上にDC/OSがかぶさってる。DC/OSはMesosを便利に使えるように色々気の利くことをしてくれてるみたい。Mesosを直接使ったことがないから、どれがDC/OSの機能なのかよく分かってない。

で、そのDC/OS上で「サービス」というものをワンクリックで起動できる。Marathonもそのサービスの1つで、最初から動いてる。他にも、Chronosとか、Kafkaとかもあるんだけど、動かしたことない。

そうそう、Mesos自体はタスクを実行する機能を持ってるんだけど、Webアプリみたいに長く動き続けたり複数インスタンスをコントロールしたりするのにはちょっと不便なので、Marathonというフレームワークが使われる。Marathonはコンテナベースでアプリケーションを実行できて、Docker以外にもたぶん実行できるみたいなんだけど、やってないから知らない。

知らないことばかりだけど、簡単な図にするとこんな感じ。

f:id:bufferings:20161015225457p:plain

んーやっぱ違うかな(おい

MesosにはMasterとAgentがあって、Masterが色々とコントロールしてる。Agentは各サーバーに入れて、使えるCPUやメモリなどの情報をMasterに伝える。なので、こんな印象。マスター用のマシンにMesos Master、DC/OS、Marathonが入ってる感じする。

f:id:bufferings:20161015230241p:plain

DC/OS on Azure Container Service

Azure Container Serviceで提供されているDC/OSはこんな感じになってる。public用のVM群(スケールセットというみたい)とprivate用のスケールセットに分かれてる。インターネットからは、public用のスケールセットに対して、デフォルトで80,443,8080のポートでアクセスができる。管理者はSSHトンネルを使ってMasterノードにアクセスする。

f:id:bufferings:20161015230854p:plain

環境構築

てことで、環境構築をしてみよう。ほんとすぐ終わる。

https://portal.azure.com を開いて、「+」→「Containers」→「Azure Container Service」。(あ、僕、英語に慣れたいなと思って英語のまま使ってるんだけど、Azure PortalのUIは日本語対応してます。)

f:id:bufferings:20161015231818p:plain

あとはもうユーザー名とか、リージョンとかの項目を順番に埋めていくだけ。

途中でAgent数を入力する部分があって、これは僕があとでVampを使いたいと思っていて1個じゃたりないので、2個にする。スペックは、MasterはD2固定らしいけどAgentの方は変更できる。僕はずっと動かさずに都度止めちゃうので、D2でいっかなってところ。

f:id:bufferings:20161015232543p:plain

ここまで1,2分くらいかな。あとは10分くらい待っといたら完了する。のでトータル15分くらいあればクラスタ環境が構築できる!

構築終わった

そうすると、色々なリソースが作成されてるんだけど、よく分かんない。覚えたのは、masterと、agent-privateと、agent-public。これらが上で僕が書いた図のmaster、private、publicにあたる。

f:id:bufferings:20161015233900p:plain

Marathonにつないでみよう

$ sudo ssh -L 80:localhost:80 -N {指定したユーザー名}@{指定したプレフィックス名}mgmt.{指定したリージョン}.cloudapp.azure.com -p 2200

こんな感じでSSHトンネルつくる。DNS名の部分はdcos-master-ip-xxxってリソースの説明の部分に書いてある。

で、以下のアドレスにアクセスするとMarathonのGUIが開く。(∩´∀`)∩ワーイ

http://localhost/marathon

f:id:bufferings:20161015235032p:plain

アプリをデプロイしてみよう

Marathonの「Create Application」をクリック。ちょっとGUIで説明するの面倒なので、右上のJSON ModeをONにしてこんな感じにする。nginxのDockerImageをDockerHubから取ってきてデプロイ。(あ、nginxのバージョン番号指定してない・・・。指定した方が良いです。)

f:id:bufferings:20161016000017p:plain

今回は単なる動作確認だけなので、acceptedResourceRolesにslave_publicを指定することにする。そうするとMesos Agentのpublic側で実行されるので外部からアクセスできる(以前はMesos AgentのことをSlaveと呼んでたみたい)。acceptedResourceRolesに何も指定しない場合は、private側で実行される。

通常は、アプリをprivate側にデプロイして直接アクセスできないようにしておいて、public側にgatewayになるようなアプリをデプロイして、それ経由でprivate側のアプリを使うんだろうなーって思う。

デプロイが終わるとこんな感じ。

f:id:bufferings:20161016000112p:plain

アプリにアクセス

ドメイン名はリソースの中のdcos-agent-ip-xxxのところに書いてある。

f:id:bufferings:20161016000133p:plain

(∩´∀`)∩ワーイ

てことで、Dockerアプリをポチポチデプロイできるクラスタ環境を15分くらいでゲットしたーー!!!

おまけ

DC/OS のダッシュボード

http://localhost/

f:id:bufferings:20161016001336p:plain

Mesos のダッシュボード

http://localhost/mesos

f:id:bufferings:20161016001416p:plain