仮想化やコンテナとプログラムの関係

そもそもプログラムって何?に対して、"仮想化したときに結局ハイパーバイザー が何をしているか分からない”というコメントを頂いたので、仮想化やコンテナについて追加で執筆したい。なるべく仮想化の全体概要や分かりやすさを重視して説明してみたい。

1. 仮想化されるとプログラム的に何が変わるか? 

仮想化とは、エミュレート機能を使って物理ハードウェアを”仮想的に”実現する(Virtual Machine)仕組みである。そのため、OSやプログラムから見ると、普通の物理ハードウェア上に動作しているように見える。

Hypervisorの導入によってできるようになること

Hypervisorによってエミュレートすることで、仮想化された環境では3つの機能が追加される。

  1. ハードウェア機能の抽象化/互換性
    • ハードウェアの各種機能をHypervisorがエミュレートすることで、OSやプログラムはハードウェアの変更や機能差分の影響を受けなくなる。
    • その結果として、ハードウェアが進化したとしても、古いOSやプログラムを継続的に利用できるようになる。
  2. プログラム間の分離
    • HypervisorがVM間のアクセスを抑止することで、1つの物理ハードウェア上に複数の環境を用意することができる。
    • その結果、全く利用用途の異なるプログラムや、セキュリティの観点で同居させづらかったシステムを同一サーバで運用できるようになる。
  3. プログラム及び必要なリソース一式のカプセル化
    • Hypervisorはエミュレート対象のOS、プログラム、仮想CPU/メモリ/NIC/ファイルシステムの一式をファイルとして扱うことができる。
    • その結果、仮想化された環境のファイルの管理だけで保守や運用が可能となる。

Hypervisorのお仕事

Hypervisorの種類や設定によって、Hypervisorが具体的に行う仕事の範囲は異なるが、基本的には

  • ハードウェア機能のエミュレート(qemu)
  • VM内のメモリの論理アドレスと実際に格納されている物理メモリのアドレスの変換(メモリマッピングorメモリエミュレータ)

の2つが主な仕事となる。ここでは一例としてKVM + qemuを例に説明する。 

 

 
エミュレートする範囲によって、qemuタイプ、kqemuタイプ、kvmタイプがある。qemuは基本的に全てのハードウェア装置をソフトウェア的にエミュレートする。そのため、抽象度は高いが、ソフトウェア化されたことによるオーバーヘッドが大きい。一方で、kvmになると多くの機能はKernelサイドの機能となりエミュレートしている範囲が少なくなるので、オーべーヘッドが少ない代わりにハードウェアの機能を頼ることになる。

それではHypervisorのオーバーヘッドとは何かというと、VMの中では基本的に”仮想化されたVM内の論理メモリを参照”するため、実際の物理メモリのアドレスとは異なる。そもそもプログラムって何?をご参照頂ければ分かるが、ノイマン型コンピュータの場合は全てのプログラムはメモリの操作によって動作されるため、この論理メモリアドレスと物理メモリアドレスの変換こそが仮想化のオーバーヘッドとなる。従って、エミュレートする範囲が広くなるほど、この変換量が増え、オーバーヘッドが大きくなる。

また、この例では”VM用I/Oエミュレータ”は全てのパターンでエミュレート(qemu)の範囲に入っているが、SR-IOV等の準仮想化技術を使うと、該当のI/Oエミュレータを利用せずに、NIC等の物理ハードウェアの仮想化支援機構を利用することになる。

2. 仮想化とコンテナは何が異なるのか?

コンテナの定義については様々な定義があるが、 ここでは”仮想化技術の一つ”として説明したい。

コンテナにおいても、container-runtime (VMのhypervisor相当)によってできることは抽象化・分離・カプセル化の3つとなる。しかし、コンテナではhypervisorのような物理ハードウェアのエミュレートを行うのではなく、基本的にはそもそもプログラムって何?のマルチタスクの仕組みを利用している。


 コンテナでは、基本的にKernelのcgroupsという機能を利用して、APLがアクセスできるハードウェアリソースの範囲を制限している。例えばCPUやメモリのアクセスできる範囲をcgroupsで限定させてしまう。その結果、コンテナAPL間は分離される。また、cgroupsでアクセス範囲を限定させているだけなので、論理メモリアドレスと物理メモリアドレスの変換は不要になり、VMと比較するとオーバーヘッドは少なくなる。

しかしながら、コンテナではVMのようにエミュレートはしていないため、コンテナAPL間でOSは共有することになる。そのため、抽象化の観点ではVMに及ばないだろう。そのため、コンテナAPL間で運用として利用方法を共通化する必要があり、APLの自由度は減る。これはネットワークやストレージを大量に利用するAPLとしては大きな影響を受けやすいことを意味するだろう。

 

VMやコンテナという仮想化の仕組み自体はこのように非常にシンプルだが、実際にはHypervisorや物理ハードウェアの仮想化支援機構の進化、コンテナAPLの開発環境のライブラリやツール類等、様々な条件により実現できる機能が変わってくる。また、 言葉にすると抽象化・分離・カプセル化と非常にシンプルなキーワードだが、それによって仮想化前ではできなかったこと(クラウド化、ヒーリング、スケーリング等)が多々できるようになり、仮想化やコンテナで何をするか?というトレンドの変化も状況を複雑にしている。

コメント

このブログの人気の投稿

CISMとは?CCMとは?NFVでコンテナ管理はどうやるの?

モバイルネットワークの保守運用の基礎

VNFMとは?