仮想化とコンテナについて調べてみた。

仮想化とコンテナについて調べてみた。

GoogleCloudPlatform で Kuberentes Engine を利用しようと思っていたのですが、そもそも Kubernetesってなんだというところから始まり、コンテナってなんだ、ポッドってなんだと疑問が山積し、無知のまま突っ込んだら泥沼に足を取られる予感がしました。

ので本記事では、まずはGCP-KubernetesEngineに入る前準備として、コンテナという概念について調査して見ました。ので、今回はそれをまとめます。

 

コンテナってなに?をサーバ技術の遷移から考える

クライアント・サーバー時代

※画像引用 https://www.weeklybcn.com/journal/column/detail/20120209_40096.html

クラウドが普及する前、世の中ではクライアント・サーバーシステムが主流となっていました。クライアント・サーバ式では、コンピュータがサーバ(提供者)とクライアント(利用者)に役割分担され、データのやりとりが行われます。この方法であればデータはサーバに集積されるので、クライアントはデータを保持することなく、しかし容易にデータにアクセスすることができるようになります。

クライアント・サーバ式の問題と仮想化技術の登場

しかしクライアント・サーバ式には問題もありました。例えばサーバの拡張性の問題です。システムが大規模になり、一つのサーバに同時に多くのクライアントがアクセスするようになるとサーバは対応できないことが多く、またその解決のためにサーバーを拡張するということも容易に行うことができませんでした。仮に新たなサーバを作成したとしても、運用リスクや故障のリスクをサーバの数だけ抱えてしまうというリスクも持っていました。

そこで登場したのが、仮想化技術です。

仮想化技術では、一つの物理サーバの中に複数のサーバを仮想的に作成します。これにより、新たなサーバが必要になった場合でも既存のサーバの中に仮想のサーバを作成するという方法を取れるようになり、サーバ作成の敷居がグッと下がりました。

仮想マシンの種類

仮想マシンのパターンは二つに大別出来ます。

1つが「ホスト型」です。ホスト型では、物理サーバにベースとなるOSをインストールした上で仮想サーバを立ち上げます。そのため既存のコンピュータの構成を流用して仮想サーバを作成することが出来ますが、物理サーバのホストOSを経由するためオーバーヘッドが大きくなります。

※画像参考 https://thinkit.co.jp/story/2012/10/17/3722

もう1つのタイプが「ハイパーバイザー型」です。ハイパーバイザー型では、物理サーバにベースとなるOSをインストールする代わりに、ハイパーバイザーというソフトウェアをインストールします。ハイパーバイザーは最小限のOS相当の機能を持ちながらも、仮想サーバの管理に特化した構成を持っています。したがって、ホスト型に比べOSを経由するオーバーヘッドが生じません。ただし、当然の事ながらOSがある時のような操作は出来ません。

※画像参考 https://thinkit.co.jp/story/2012/10/17/3722

 

仮想マシンの問題とコンテナの登場

※画像引用 https://cn.teldevice.co.jp/column/10509/

しかしが仮想マシン式にも問題がありました。仮想サーバは物理サーバの中に論理的に作成されますが、仮想サーバの数だけ物理サーバの中に新たなOSが立ち上がります。例えば1つのサーバの中に仮想サーバが5個立ち上げれば、1つのOSの中に更に5つのOSが立ち上がることになります。これでは処理性能が低下することは、想像に難くありません。

そこで登場したのが、コンテナという技術です。物理サーバの中に仮想空間を作成するという点でコンテナは仮想マシンと同じですが、作成するのは「アプリケーションの実行環境」だけで、OSは物理サーバのものを流用します。これにより例えば1つの物理サーバの中で、その物理サーバのOSを利用したユーザ空間を5つ立ちあげる、といったことが可能になります。

仮想サーバはOSが多重起動していたので処理速度が低下していましたが、コンテナではOSが単一なので処理速度が低下することも軽減されます。ただし、仮想サーバではサーバ毎にOSを設定する余地がありましたが、コンテナではその自由さは失われます。

 

コンテナのデファクトスタンダード、Docker

コンテナの実行環境としてデファクトスタンダードの位置を築いているのが、Dockerです。

Dockerはコンテナの実行環境でもあり、コンテナそのものをDockerイメージとして作成することもできます。

Dockerを通じて作成されたDockerイメージを使用すれば、どの環境に対してもコンテナを起動させることができます。Javaのコンセプトとして「Write Once, Run Anywhere」というものがありますが、Dockerでは「Build Once, Run Anywhere」というコンセプトがあります。

またDockerイメージは持ち運びが容易なことから、可搬性が高いとも言われます。イメージだけを持ち歩くだけでコンテナを立ち上げることができるという点も、ハイパーバイザ型の仮想OS式に優れているところです。

 

仮想化の特徴まとめ

  • 仮想化は、物理サーバの中に論理的に仮想サーバを作成し、それぞれの仮想サーバを物理サーバと同じように扱うことを言います。
  • 仮想サーバは、それぞれ独自のOSを保持します。したがって、同一物理サーバの中に存在している仮想サーバでOSを異なるものに設定することが可能です。
  • 物理サーバにOSをインストールする方式の仮想マシンを「ホストOS型」、OSの代わりにハイパーバイザーというソフトウェアをインストールする方式の仮想マシンのことを「ハイパーバイザー型」と言います。

コンテナの特徴まとめ

  • コンテナ技術は、従来の仮想化技術と同じように単一物理サーバの中に複数の仮想サーバを作成する技術です。
  • コンテナにより作成される仮想空間は、所属する物理サーバとOSを共有します。それにより、従来の仮想マシンで生じていたオーバーヘッドが軽減されています。ただし逆に言えば、仮想空間ごとに異なるOSを設定出来ないという点では自由度が損なわれています。
  • デファクトスタンダードであるDockerにより作成されたDockerイメージは可搬性に優れ、どんな環境でも簡単にコンテナを起動させることができます。

参考

https://cloud.nifty.com/navi/tech/container_virtualization.htm

Kubernetes完全ガイド

Cloudカテゴリの最新記事