KubernetesとMesos:Dockerのスケジューリングツールの違いを理解する
注目されるDockerのスケジューリングツール
Dockerには、基本機能だけでは自分自身がインストールされているホストのコンテナしか管理できず、複数ホストのコンテナを管理できないという問題がある。そのため、実際にサーバを複数台利用するような規模でDocker環境を運用することを考えると、コンテナのクラスタリングやスケジューリングなど、複数ホストにまたがってコンテナをオーケストレーションする仕組みが必須となる。
そのため、Docker環境の管理を行うスケジューリングツールが注目を集め、数多くの製品が登場しているが、その中で特に注目されているものに、KubernetesとMesosがある。KubernetesとMesosは、複数ホストのコンテナを簡単に管理できるという点では共通しているが、機能の対象範囲には違いがある。
今回は、KubernetesとMesosの特徴と相違点について整理し、それぞれに適した使いどころについて紹介する。
Kubernetes vs. Mesos
KubernetesとMesosの基本情報は以下の通りとなる。
製品名 | Kubernetes | Mesos |
---|---|---|
開発元 | The Apache Software Foundation | |
公式サイト | http://kubernetes.io/ | http://mesos.apache.org/ |
特長 | 複数のホストにまたがってDockerコンテナの管理、スケジューリングを可能にする | ホストのリソース消費量に応じて、効率的にDockerコンテナを配置する |
開発言語 | Go | C++、Java、Scala、Python |
ライセンス | Apache License 2.0 | Apache License 2.0 |
関連ツール | etcd flannel | ZooKeeper Marathon Chronos |
KubernetesもMesosも、単体ではシンプルな機能しか持っていないため、実際に複数ホストをまたいでコンテナを管理する際は、関連ツールと組み合わせて利用する。たとえば、どちらもコンテナの情報はKVSで管理しており、Kubernetesはetcd、MesosはZooKeeperを利用している。複数ホストのコンテナを管理する上で、KubernetesとMesosで利用できる機能は、以下の通りとなる。
製品名 | Kubernetes | Mesos | Kubernetes+flannel | Mesos+Marathon |
---|---|---|---|---|
コンテナのグルーピング | ○ | × | ○ | ○ |
コンテナのスケールアウト | ○ | × | ○ | ○ |
コンテナのオートスケール | × | × | × | × |
異常終了したコンテナの再配置 | ○ | × | ○ | ○ |
HTTPロードバランサ | ○ | × | ○ | × |
ホストをまたぐコンテナ同士の通信 | × | × | ○ | × |
ホストのリソース監視 | × | ○ | × | ○ |
ホストのリソースマネジメント | × | ○ | × | ○ |
Web UIでの管理 | × | ○ | × | ○ |
Kubernetesの使いどころ
Kubernetesの特徴は、同じ役割をもつコンテナのグループ(Pod)に対して、1つのエンドポイント(Service)を持てる点である。Serviceはロードバランサのような働きを持っており、Serviceへのアクセスをラウンドロビンで各Podに転送する(図1)。
これにより、同じ役割のコンテナをスケールアウトしたり、コンテナが稼動するホストが変化したりしても、同一のURLでコンテナのアプリケーションにアクセスし続けることができる。
また、複数のホストをまたぐことによって生じるDockerのネットワーク問題は、関連ツールであるflannelが解決してくれる。通常Dockerは、ホストごとにプライベートなネットワークを構築するため、ホストが異なるコンテナ同士は直接通信できない。だがflannelを利用することで、ホストをまたいだオーバーレイネットワーク上にDockerのネットワークを構築することができ、ホストが異なるコンテナ同士でも通信が行える。
以上のように、Kubernetesはコンテナやホストが複数台になることで発生する問題を上手に解決してくれる。このことから、たとえば以下のような環境に適している。
- Web、AP、DBのようなクラスタ構成のシステム
- HTTPロードバランサを利用したい場合
- コンテナを同一のサブネットで稼動させたい場合
余談ではあるが、Google Cloud PlatformのサービスであるGoogle Container Engine(GKE)では、Kubernetesを利用したコンテナ管理機能が提供されており、Kubernetesの機能に加え、オートスケールや監視などもサポートされている。
Mesosの使いどころ
Mesosの特徴は、複数のホストを1つの巨大なマシンのように扱える点である。Mesosの公式サイトでは、「Mesosは分散システムのカーネルである」という表現がなされており、複数ホストのCPUやメモリ、ディスクを抽象化して、1つのリソースプールとして扱える(図2)。Mesosが管理するホスト群を、あたかもマルチコアのCPUのように扱うことができると考えると、イメージしやすいかもしれない。
Mesos上でコンテナを稼動させるには、関連ツールのMarathonやChronosのようなフレームワークが必要となる。MarathonはLinuxにおけるsystemdやupstartのような存在で、コンテナの起動・終了の管理や設定を行うことができる。一方のChronosは、cronのような存在で、定期的なジョブ実行を設定できる。
起動されるコンテナはMesosによって適切なホスト上に配置されるので、各ホストのリソース消費量に気を使う必要なく、必要なだけコンテナをスケールアウトさせられる。
以上のように、Mesosは複数のホストをあたかも1つのマシンであるかのように扱え、ホストごとのリソース消費量に気を使う必要はなくなる。このことから、以下のような環境に適している。
- バッチ処理など一度に大量のリソースを必要とする処理
- 定期的にジョブを実行したい場合
- 性能の違うホストマシンが混在している環境
Kubernetesと Mesosを組み合わせる
ここまででわかるように、KubernetesとMesosの両者はコンテナ管理において異なる役割を担っていると言える。そのため、Dockerのスケジューリングツールとしてどちらか一方を選ぶということではなく、必要なら両者を組み合わせて利用することも考えられる。実際に、MesosphereがMesos上で動作するフレームワークとして、Kubernetesを利用するチュートリアルなどが公開されている。
その他のDockerスケジューリングツール
今回紹介したKubernetesとMesos以外にも、Dockerのスケジューリングツールが多数登場している。たとえば、Docker社のDocker Swarmや、CoreOSに標準搭載されているfleetなどがある。また、GKEやAmazon EC2 Container Serviceなど、クラウド上でコンテナを管理するサービスも登場している。
Dockerのスケジューリングツールは、どれもまだ登場してから日が浅く、機能が不十分なものも多い。しかし、開発は非常に活発に行われており、必要な機能は続々と実装されていくと考えている。たとえば、ホストごとにクォータをかける機能などが提供されると予測される。今後の動向に引き続き注目していきたい。
次回は、Dockerが利用するファイルシステムの性能と改善方法について検証を行う予定だ。この点は、前回の検証で見られた性能劣化の原因と推察されている。