ORNEW

CoreOSとRancherOS、どっちがいいのか?

Facebook にシェア
Pocket

Dockerを始めとしたコンテナ仮想化技術が浸透するにつれ、課題となったのはマルチホストでのクラスタ環境におけるコンテナオーケストレーションだ。コンテナオーケストレーションツールとして利用できるものとしては、MesosやKubernetes、Docker Swarmなどが存在する。

これらは基本的にはツール群であり、OSではない。コンテナによりサービスを構成する時に、OSのほとんどの機能が不要である可能性については皆が薄々感じていた。言い方を変えれば、OS上で動かしていたあらゆるサービスをコンテナとして稼働させるほうが良いのではないか、とも言える。故にDocker普及初期から幾つかのコンテナ専用OSが開発されており、近年になって安定版になるコンテナ専用OSが現れている。中でも私が注目しているのはCoreOSRancherOSだ。

コンテナ専用OSとは、コンテナを稼働させることに特化したOSである。UbuntuやDebianといった人気のLinuxディストリビューションに比べ、コンテナ専用OSでは余計なものを全て削ぎ落としているため、イメージサイズが小さく、ブートが非常に速い。

CoreOSとRancherOSの違いは幾つかあり、システムの扱いと、コンテナ仮想化ツールへの依存性が異なる。

CoreOSの特徴

公式サイト:https://coreos.com/

CoreOSは幾つかの基本的なツール群のみを含んだ軽量Linuxディストリビューションである。CoreOSを構成するのは、systemd、etcd、fleetと、Dockerやrktといったコンテナエンジンだ。rktもCoreOS社のコンテナエンジンである。

CoreOS社の傾向として、既存のシステムとの親和性とUnixの設計を重視している。例えばrktとDockerの違いは以下のとおりである(公式ドキュメントより)。

rkt Docker
Dockerコンテナの起動
イメージの署名検証 デフォルトで検証 クライアントベースであり、デーモンでの検証なし
特権の分離 非特権ユーザとして署名の取得・検証を行う Dockerデーモンがrootですべての操作を実行している
合成性 適切なUnixプロセスモデル、システム、標準のsysv init、runitなどでプロセスを管理する 子プロセスを管理するためにカスタムのコンテナ内のinitシステムが必要
プラグ可能な分離 chrootからcgroup、KVMまで複数のステージ1の分離 ネットワークブリッジまたはフル特権モードのためのドッカーデーモンオプションの観点からの分離
イメージの作成 シェルスクリプトに基づくコンテナ作成ツール、使い慣れたUNIXツールの活用 DockerデーモンによりDockerfileをビルド(rootで)
コンテナの配布 コンテナイメージはプレーンなtarballで、一般的なHTTPSのカスタムネームスペースとシグネチャのDNSディスカバリで配信されます Dockerレジストリ デフォルトで名前空間制限付き(docker.com)

CoreOSも、ベースはsystemdによるサービス管理であり、既存のサービスはそのままにコンテナサービスと併用することが可能である。etcdによりコンテナサービスを非コンテナサービスと連携させたり、fleetと併用してクラスタ管理を行うことも出来る。しかも、これらは汎用的なツール群であり、既存資産や、異なるコンテナエンジン、異なるコンテナオーケストレーションツールを包含する事ができる。

また、cloud-configが非推奨となり、Container Linux Configとignitionというものにより環境の設定を記述することが出来る。ignitionは基本的に直接書くことはなく、Container Linux Configを特定の環境向けのignitionにコンパイルする事で、コンパイル段階でのエラーチェックや、高い移植性を持ったマシン設定を簡潔に書くことを可能にしている。ignitionはブートの時にのみ読み込まれる。生成した正しいignitionファイル1つで、ブートと同時に完成されたマシンが出来上がる。

後述のRancherOSに比べると、基本ツール群があるため若干イメージサイズは大きく、またブート時の負荷が高いためブート速度も劣る。しかし、それでもLinuxディストリビューション全体で見ればかなり軽量な部類であり、ブートも十分速い。

RancherOSの特徴

公式サイト:http://rancher.com/rancher-os

RancherOSはより純粋なDockerコンテナ専用OSであり、システムのサービスがDockerコンテナとして提供される。カーネル上でシステムDockerが動作しており、一部のシステムレベルのサービスはこの上でシステムコンテナとして動作する。ユーザがDockerコンテナを走らせる場合は、システムDocker上に構築されたユーザDockerの上にユーザレベルコンテナを稼働する参考図

Docker以外が一切排除されているため、CoreOS以上に高速なブートと軽量イメージを実現している。数秒から十数秒程度で起動するらしい。

単体だとDockerの基本的な機能しか使えないため、必要に応じてオーケストレーションツールを併用することでコンテナ通信やクラスタ管理などを行う。RancherOSとは別にRancherというコンテナオーケストレーションツールも付属しており、各ノードでRancher Server/Agentコンテナを稼働するだけで簡単にクラスタ環境を構築することが出来る。管理用のWebサーバも稼働でき、GUIでコンテナ管理を行える。もちろん、Rancherではなく他のオーケストレーションツールを用いることも出来る。

Dockerの使い方さえわかれば、あとはコンテナを組み合わせるだけなので、使い方を学ぶコストが安い。実際にドキュメントを見ればわかるが、せいぜい一時間もあれば一通り読み終わってしまうだろう。

両者の比較

ここからは個人的な見解である。

CoreOS RancherOS 詳細
学習コスト 高め 低い CoreOSは、今までUnix系のOSを管理してきた人間であれば特に難しくはないが、何の知識もなくても始められるRancherOSに比べると難易度は高いと言わざるをえない。CoreOSの場合は少なくともsystemd、etcd、fleetの使い方は最低限マスターしないといけないが、RancherOSはコンテナを立てればあとはWeb UIで作業できる。
柔軟性 非常に高い 高い CoreOSはあらゆる仕組みを動作させるポテンシャルが有る。RancherOSはDockerへの依存が強く、今後新しい技術が出てくる可能性を考えると若干柔軟性には乏しい。ただ、Docker自体が十分に柔軟な機構なので、不便するほどではない可能性も有る。
移植性 高い 普通 CoreOSはContainer Linux Configのトランスパイアにより移植性に優れた設定ファイルを書くことが出来るため、容易に異なるプラットフォームへ展開できる。
軽量さ 小さい 非常に小さい RancherOSのインストールISOは22MB前後しかない。非常にロースペックなマシンでも稼働する。

・・・特徴を簡単に整理してみたが、正直どっちも似たようなもんである。サーバ管理経験のある人はCoreOSの方がいいと思うが、そうでない人はRancherOSの方がいいかもしれない。

私はCoreOSを使っているが、RancherOSにしたいというような理由は特に見つからない。逆もまた然りではないだろうか。こうなってくると、どちらを選ぶかはその開発者や企業が重要になる。

CoreOS社のCEOはletsencryptなどで有名なAlex Polviである。CoreOSはGoogleと連携してCoreOSをKubernetesで展開するTectonicをロンチするなど、大規模インフラで商業的な成果を出している。実際、CoreOSはGoogleクラスの大規模サービスを構築する負荷を軽減することを掲げている。CoreOSには元Googleのメンバも居るらしく、かなり密な関係を築いているようだ。

RancherOSのCEOはSheng Liangで、Sun時代にJNIの設計に携わったらしい。RancherOSのサイトを見ても特に商用展開に関する話は見つからなかった。

結論

両者ともに、コンテナ専用OSとしてのポテンシャルは十分であると思われる。個人的には、非常に活発で十分に今後も継続することが見込めるCoreOSがおすすめである。