OSの仮想化は、大きく分けてホストOS型とハイパーバイザ型に分けられる
ThinkITのこの画像がわかりやすい
-
ホストOS型
ホストOSの上に仮想化アプリケーション(VirtualBox、VMware workstation、KVM...)などを乗っけて、その上にOSを乗っける形
ホストOSの上に載っているアプリケーションと仮想化アプリケーションが並列している形
ゲストOSは、アプリケーションとして動く
通常のOSとして使用できるので、ホストOS上でアプリケーションを動かしたり監視できるのがメリット
ハイパーバイザ型とは異なり、ゲストOSだけでなくホストOSの処理にもリソースを割かれるので、処理が遅いことがデメリット -
ハイパーバイザ型
ハードウェアの上にハイパーバイザ(仮想化レイヤー:VMware vSphere ESX,Xen,KVM,,,,)を乗っけて、その上にOSを乗っける形
ホストOS型と異なり、ホストOS+仮想化アプリの二層の上に乗るのではなく、物理ハードウェアの上に仮想化レイヤが乗っかるハイパーバイザー型仮想化とは、仮想化専用OSの上で仮想OSを動作させる手法です。ESX, vSphere, Xenなどが該当します。ハイパーバイザー専用のOSなので、ハイパーバイザー型はホストOS型に比べてオーバーヘッドが少ないと言われます。
上記のハイパーバイザ専用OSという言葉が結構わかりやすい。
そしてパフォーマンスの面でホストOSより優れるさらにハイパーバイザ型の中でも完全仮想化と準仮想化に分けられる
完全仮想化は、ゲストOSに改変を加えずに使うもので、
準仮想化は、ゲストOSに仮想化に適するように改変を加えるしかし、最近ではCPUに仮想化支援機能がついており、この機能を使うことによって、完全仮想化でも実用上問題ない性能になっている
Xenはもとは準仮想化から始まっている。しかしIntel-VTなんかの仮想化支援機能の登場によって、
ソフトウェアがハードウェアをエミュレートしていた部分がCPUによって肩代わりされたことで、改変できないOSも準仮想化環境で扱えるようになった
KVMなどはこれを使って完全仮想化のデメリットであるオーバーヘッドを減らしたKVMは、Linuxカーネルをハイパーバイザとして使うので、シンプルで保守性が高い
KVMのゲストOSはホストのLinuxからみると単一のユーザープロセスであり、通常のプロセス管理の手法が使える
KVMは完全仮想化のみKVMは、ホスト型という人もハイパーバイザという人もいる
KVMは仮想化アプリケーションなので、ホスト型。でも、Linuxをハイパーバイザとして扱っているからハイパーバイザ型。という意見 -
コンテナ型
Google Container Engine がDockerをサポートしたことがきっかけでブームになる
コンテナ型とハイパーバイザ型と区別するかどうかは人によって意見が分かれる
ハイパーバイザ型と似ており、コンテナ(ゲストOS)が、ホストOSのカーネルを利用することで、オーバーヘッドが少ないことが特徴
ホストOSのカーネルを使うので、ゲストOSとか、仮想マシンとかいう言葉を使ってる人も使ってない人もいる
その代り、隔離空間だとか、ユーザ空間だとか、名前空間だとか、コンテナだとかいう言葉が新しく登場するDocker やその他の Linux コンテナの背景にあるコンセプトは堅実なものです。
-
重複したあるいは不要なOSエレメントをVM本体から排除することで、より高密度のサーバー設置を実現する非常に小さいVM
-
巧みにパッケージされた VM スタックであり、容易に移動、複製、管理でき、高い移植性が保証される
-
小さな VM ソフトウェア スタックを構成するため、複製や維持に多くの注意と労力を要する OS やツールのバージョン依存性に起因する面倒な問題を取り除く
-
準備時間を短縮することができるため、より柔軟なインフラストラクチャを容易に作ることができ、その時々のニーズに応じたより大きな自由度を可能にする
共有カーネル戦略がセキュリティ的に。。。っていうのと、同じOS(LinuxならLinuxということ、ディストリビューションは不問)しか使えないことがデメリット
あとは1つのコンテナがミスるとホストOS全体が高負荷になったり、ホストOSがダメになると全コンテナが道ずれになったりする
ただ、めちゃんこ速いし、コンテナ1つのサイズが小さくて手軽
一般的なOSのブート手順を必要としない
ハイパーバイザがハードウェアを仮想的に作り出しているのに対し、
コンテナ(Docker)はNamespaceとcgroupsという資源管理の仕組みを使うことで、複数のコンテナがプロセスとして稼働するだけなので、オーバーヘッドも、ハードウェア資源の消費も少なくて済むKVMの時と同じように、コンテナ型とハイパーバイザ型を区別しないという人や、コンテナ型とホストOS型を区別しないという人がいたりする
-
PaaSやInfrastructure as Codeの流行
-
Vagrant
VirtualBox等の操作を容易にしている+VagrantFIleによる環境構築の容易化、環境共有の容易化
そのため、仮想化の方法としてはホストOS型
ちなみにネットワーク関係の設定も楽 -
chef ソフトウェアのインストールを容易にするツール
ざっくりいえばサーバ設定ツール
プログラミングによってサーバ構築を行う
また、chefは何回やっても同じ結果になるという特徴を持つので、既にあるサーバで実行してもchefで記述した設定になる
このためchefのコードを見ればサーバの状態がわかる -
Docker Vagrantによく似ている
VagrantがホストOS型の管理ツールであるのに対し、Dockerはコンテナ型の管理ツール
なので圧倒的に速い
Vagrantと同じように、Dcokerfileという設定ファイルがあり、これをもとにコンテナ作成が可能
よって環境構築、環境共有が簡単
ただ、ネットワーク関係はVagrantの方が簡単
gitのように、Dockerは差分の概念がある
組み合わせとしては、Vagrant&chefが結構使われる
Vagrantで仮想環境を楽に操作・構築して、chefでサーバ設定を入れる
Vagrant&Dockerは、DockerがLinuxしか使えないことによってMacやWindowsにVagrantでLinuxを入れた上にDockerを使うみたいなことをしたりする、、かも
仮想環境の方式がホストOSとコンテナ型で違うので、微妙なのかも
Chef&Dockerは、Vagrant&chefと同じようなことが可能
ただ、Dockerfileがプログラムなので、Dockerだけでも自動化はできる
なんか色々懸念されているらしい
よく言われているのがセキュリティの問題
dockerを使うにはルート権限が必要なこと
デーモンが常に動いているので、dockerのホストでは常にルートのプロセスが動いていることになる
クライアントとデーモンはHTTPでやり取りするので、外部ホストからコマンドを叩ける
上でも書いたカーネルの共有という特徴も合わせて、セキュリティ的に・・・という話が良く出ている
さらに、Docker pull という、外部イメージの取得も安全なのか・・・という話もよく出ている
あとはDockerfileが少し扱いづらかったり、Dockerがベンダーロックインを招くんじゃないかとか、
将来的にもずっと、同じイメージから同じコンテナができるわけではないということとか、
Dockerがプラットフォームを目指しているのでシンプルさが云々かんぬんとか、、、、
いろいろ議論はあるみたい
Dockerに依存しすぎるのはあんましよくないというお話
チェックありがとうございました!
NAT、ブリッジ、NIC等のネットワーク関連がまだいまいちピンと来ないので、
ネットワークの方(2章)を進めつつこっちを充実させていく形にしたいと思います