lxc で始めるケチケチ仮想化生活?!

17
中井悦司 Twitter @enakai00 オープンクラウド・キャンパス LXCで始めるケチケチ仮想化生活?! ~Hadoop on LXCにチャレンジ! 2011/07/10 Version 1.2

Upload: etsuji-nakai

Post on 17-Jun-2015

15.908 views

Category:

Technology


0 download

DESCRIPTION

7/12までに完成版をアップします。

TRANSCRIPT

Page 1: Lxc で始めるケチケチ仮想化生活?!

中井悦司Twitter @enakai00

オープンクラウド・キャンパス

LXCで始めるケチケチ仮想化生活?!

~Hadoop on LXCにチャレンジ!

2011/07/10 Version 1.2

Page 2: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus2

LXCで始めるケチケチ仮想化生活?!

自己紹介

好評発売中

中井悦司(なかいえつじ)– Twitter @enakai00

日々の仕事– Senior Solution Architect

and Cloud Evangelist at Red Hat K.K.企業システムでオープンソースの活用を希望されるお客様を全力でご支援させていただきます。

昔とった杵柄– 素粒子論の研究(超弦理論とか)– 予備校講師(物理担当)– インフラエンジニア(Unix/Linux専門)

Page 3: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus3

LXCで始めるケチケチ仮想化生活?!

本日のお題

サーバ仮想化とLinuxコンテナ

LXCの基礎知識

Hadoop on LXCにチャレンジ!

本日のデモ環境は at+link よりご提供いただいています。

Supported by at+link

Page 4: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus4

LXCで始めるケチケチ仮想化生活?!

サーバ仮想化とLinuxコンテナ

Page 5: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus5

LXCで始めるケチケチ仮想化生活?!

よくあるサーバ仮想化の分類

物理マシン

物理マシン

ホスト OS

ハイパーバイザ (カーネルモジュール)

仮想マシン

ゲスト OS

Power Systems, Virtage など

VMware vSphere, Xen など

Linux KVM

ハードウェアによる仮想化(物理マシンにハイパーバイザを内蔵)

ソフトウェアによる仮想化(物理マシン上にハイパーバイザを導入)

ソフトウェアによる仮想化(ホスト OS にハイパーバイザ機能を追加)

物理マシン

OS

非仮想化環境

基本的には「物理マシン」と同等の「仮想マシン」を複数作り出す技術です。

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

ハイパーバイザ(ソフトウェア)

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

仮想マシン

ゲスト OS

物理マシン

ハイパーバイザ(ファームウェア)

Page 6: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus6

LXCで始めるケチケチ仮想化生活?!

コンテナ型仮想化とは

OSの内部は、物理リソースを管理するカーネル空間とユーザプロセス(アプリケーション)を実行するユーザ空間に分かれます。

コンテナ型仮想化は、カーネルの機能により、複数のユーザ空間を作り出すことで、ユーザプロセスから見えるリソースを分割します。リソースによって分割方法は異なります。(以下はLXCの例)

– プロセスリスト、ホストネーム、OSユーザ、ネットワーク、ファイルシステム、コンソールなど⇒ コンテナごとに異なる内容が見える

– CPU、メモリ、デバイス(/dev/*)⇒ 物理マシン全体の情報が見えるが、cgroupsでコンテナごとに利用範囲を制限

カーネル空間

ユー

ザプ

ロセ

・・・

物理マシン 物理マシン

OS

コンテナ型仮想化非仮想化環境

ユー

ザプ

ロセ

ユー

ザプ

ロセ

ス ユーザ空間

カーネル空間

ユー

ザプ

ロセ

ユー

ザプ

ロセ

ユーザ空間

ユー

ザプ

ロセ

ユー

ザプ

ロセ

ユーザ空間

・・・

Page 7: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus7

LXCで始めるケチケチ仮想化生活?!

LXC(Linux コンテナ)の特徴

Linuxカーネル(メインラインカーネル)がネイティブに持つ機能を利用して実現します。– RHEL6.0/6.1では、デフォルト・カーネルで利用可能(Technical Preview)

コンテナを操作するツールは用意が必要です。– RHEL6.0/6.1には含まれていないので、

sourceforgeからLXCツールをダウンロードして使用します。(http://lxc.sourceforge.net/)

※ libvirtからもLXCを操作することができますが、完成度はあと一歩。(libvirtチームにて鋭意開発中)

KVMの仮想マシン上などでも利用できます。– クラウドから借り出したVM環境をさらにLXCで分

割することも可能です。

Page 8: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus8

LXCで始めるケチケチ仮想化生活?!

LXCの基礎知識

Page 9: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus9

LXCで始めるケチケチ仮想化生活?!

LXCのリソース分割 (1/4) ~ プロセステーブル

各コンテナのプロセスは、同じLinuxカーネルで実行されます。– Linux以外のOSをコンテナで実行することはできません。

プロセステーブルはコンテナごとに独立しているので、他のコンテナのプロセスは見えません。

– コンテナ外部にあたるホストLinux上では全てのプロセスが見えます。– ホストLinux上のプロセステーブルでは、コンテナに属するプロセスに

は、コンテナ名ラベルが付与されます。

ホストLinuxのプロセステーブル (コンテナ内部ではそのコンテナに属するプロセスしか見えない)# lxc-ps -efCONTAINER UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun03 ? 00:00:00 /sbin/init root 2 0 0 Jun03 ? 00:00:00 [kthreadd]... root 10258 1 0 10:30 ? 00:00:00 lxc-start -n 005 -d005 root 10266 10258 0 10:30 ? 00:00:00 /sbin/init root 10268 1 0 10:30 ? 00:00:00 lxc-start -n 006 -d006 root 10278 10268 0 10:30 ? 00:00:00 /sbin/init006 root 10801 10278 0 10:30 ? 00:00:00 /sbin/rsyslogd -c 4...005 root 10989 10266 0 10:30 ? 00:00:00 crond005 root 11027 10266 0 10:30 pts/4 00:00:00 /sbin/agetty /dev/console 38400 vt100-nav... root 14452 12337 0 14:20 pts/3 00:00:00 lxc-start -n 003003 root 14455 14452 0 14:20 ? 00:00:00 /sbin/init003 root 14626 14455 0 14:20 ? 00:00:00 /sbin/rsyslogd -c 4

物理マシン

カーネル空間

ユー

ザプ

ロセ

ユー

ザプ

ロセ

ユーザ空間

ユー

ザプ

ロセ

ユー

ザプ

ロセ

ユーザ空間

・・・

Page 10: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus10

LXCで始めるケチケチ仮想化生活?!

LXCのリソース分割 (2/4) ~ ファイルシステム

コンテナごとに特定ディレクトリにchrootします。

– 昔ながらのchroot jailと同じです。– コンテナごとのルートファイルシステ

ムを任意のディレクトリにマウントしておきます。

コンテナで特定デーモンだけを動かす場合

⇒ 昔ながらのchroot jail風の使い方– デーモンの稼働に必要なファイルだけ

があればOKです。

コンテナでゲストOSをまるごと動かす場合

⇒ サーバ仮想化風の使い方– ゲストOSのルートファイルシステムを

まるごとマウントします。– KVMのゲストOSイメージファイルを

loopマウントして利用するなどもありです。

# ls -l /lxc/rootfs/合計 28drwxr-xr-x 2 root root 4096 5月 28 13:53 2011 001drwxr-xr-x 2 root root 4096 5月 28 15:13 2011 002dr-xr-xr-x. 23 root root 4096 5月 30 12:41 2011 003dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 004dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 005dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 006dr-xr-xr-x. 23 root root 4096 5月 30 12:41 2011 007

# ls -l /lxc/rootfs/003合計 104dr-xr-xr-x. 2 root root 4096 5月 25 20:24 2011 bindrwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 bootdrwxr-xr-x. 2 root root 4096 7月 14 20:45 2010 cgroupdrwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 devdrwxr-xr-x. 57 root root 4096 6月 4 14:20 2011 etcdrwxr-xr-x. 3 root root 4096 5月 29 05:35 2011 homedr-xr-xr-x. 8 root root 4096 5月 25 20:24 2011 libdr-xr-xr-x. 7 root root 12288 5月 25 20:24 2011 lib64drwx------. 12 root root 16384 5月 25 20:22 2011 lost+founddrwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 mediadrwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 mntdrwxr-xr-x. 5 root root 4096 5月 31 11:48 2011 optdrwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 procdr-xr-x---. 5 root root 4096 5月 31 13:01 2011 rootdr-xr-xr-x. 2 root root 4096 5月 25 20:25 2011 sbindrwxr-xr-x. 2 root root 4096 5月 25 20:23 2011 selinuxdrwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 srvdrwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 sysdrwxrwxrwt. 2 root root 4096 6月 4 14:18 2011 tmpdrwxr-xr-x. 14 root root 4096 5月 29 05:33 2011 usrdrwxr-xr-x. 17 root root 4096 5月 25 20:23 2011 var

コン

テナ

ごと

のル

ート

ファ

イル

シス

テム

をマ

ウン

Page 11: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus11

LXCで始めるケチケチ仮想化生活?!

LXCのリソース分割 (3/4) ~ ネットワーク

各コンテナには、仮想NIC(veth)をアサインして、ホストOSの物理NICにブリッジ接続します。

– vethはLinuxカーネルが標準で提供する機能です。2つのvethのペアを(クロスケーブルで直結したかのように)接続して、同じサーバ上のプロセス間で擬似的なネットワーク通信を実現します。

LXCではvethペアの一方をコンテナ内部に見せて、もう一方を仮想ブリッジに接続することで、コンテナ内部と外部ネットワークを接続します。

– コンテナ内部ではデバイス名をeth0に書き換えています。※ KVMの仮想ネットワーク環境と似ていますが、KVMではTAPデバイスを使用する点が異なります。

veth0 veth1

eth0

プロセス A プロセス B

外部ネットワーク

vethの基本的なイメージ

vethXeth0

外部ネットワーク

br0

eth0(vethY)

コンテナ内部

仮想ブリッジ

LXCでの実際のvethの使い方(コンテナ内部と物理NICをブリッジ接続)

vethW

eth0(vethZ)

コンテナ内部

Page 12: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus12

LXCで始めるケチケチ仮想化生活?!

LXC のリソース分割 (4/4) ~ CPU / メモリ / デバイス

CPU/メモリ/デバイス(/dev/*)は、全てのコンテナから物理サーバ全体のリソースが見えます。

– Control Groups (cgroups)を利用して、各コンテナで実際に利用できるCPU/メモリ/デバイスを設定します。

– cgroupsの説明はこちらを参照: http://d.hatena.ne.jp/enakai00/20110605/1307240161

次のような設定が可能です。– コンテナが使用するCPUコア(cpuset.cpus)

⇒ CPUコアの番号を指定。

– CPUの優先順位 (cpu.shares)⇒ 2~262144を指定。値に比例した実行時間が与えられる。

– メモリ使用量の上限 (memory. limit_in_bytes, memory. memsw.limit_in_bytes) ⇒ 物理メモリ、および、物理メモリ+Swapの上限を指定。

– IOの優先順位 (blkio.weight)⇒ 100~1000 を指定。値に比例したIO処理時間が与えられる。

– ネットワーク帯域の指定 (net_cls.classid) ⇒ 送出パケットに「クラスラベル」を付与する。クラスラベルに対応する帯域はtcコマンドによる設定が必要。

– アクセスを許可するデバイス (devices.deny, devices.allow) ⇒ Major, Minor番号でアクセスを許可するデバイスを指定。

Page 13: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus13

LXCで始めるケチケチ仮想化生活?!

コンテナ設定ファイルの例

ネットワーク構成

ルートファイルシステムと特殊ファイルシステムの指定

cgroupsによるCPU/Memory配分の指定

cgroupsによるデバイスアクセスの制限

# cat /lxc/conf/001.conf# network configurationlxc.utsname = 001lxc.network.type = vethlxc.network.name = eth0lxc.network.flags = uplxc.network.link = br0lxc.network.ipv4 = 192.168.122.101/24

# file system configurationlxc.rootfs = /lxc/rootfs/001lxc.mount.entry=/dev /lxc/rootfs/001/dev/ none bind 0 0lxc.mount.entry=devpts /lxc/rootfs/001/dev/pts devpts gid=5,mode=620,newinstance,ptmxmode=0666 0 0lxc.mount.entry=proc /lxc/rootfs/001/proc proc nodev,noexec,nosuid 0 0lxc.mount.entry=sysfs /lxc/rootfs/001/sys sysfs defaults 0 0lxc.mount.entry=none /lxc/rootfs/001/proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0

# resource allocationslxc.cgroup.cpuset.cpus = 0lxc.cgroup.cpu.shares = 512lxc.cgroup.memory.limit_in_bytes = 268435456lxc.cgroup.memory.memsw.limit_in_bytes = 536870912

# device access listlxc.cgroup.devices.deny = a *:* rwmlxc.cgroup.devices.allow = c 1:11 rwmlxc.cgroup.devices.allow = c 1:3 rwmlxc.cgroup.devices.allow = c 1:5 rwmlxc.cgroup.devices.allow = c 5:1 rwmlxc.cgroup.devices.allow = c 5:0 rwmlxc.cgroup.devices.allow = c 4:* rwmlxc.cgroup.devices.allow = c 1:9 rwmlxc.cgroup.devices.allow = c 1:8 rwmlxc.cgroup.devices.allow = c 5:2 rwmlxc.cgroup.devices.allow = c 136:* rwmlxc.cgroup.devices.allow = c 254:0 rwm

Page 14: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus14

LXCで始めるケチケチ仮想化生活?!

なにはともあれ動かしてみる コンテナ操作の基本コマンド

– コンテナ作成 # lxc-create -n <コンテナ名> -f <コンテナ設定ファイル>– コンテナ開始 # lxc-start -n <コンテナ名> [-d]– コンテナ停止 # lxc-stop -n <コンテナ名>– コンテナ削除 # lxc-destroy -n <コンテナ名>※ 詳細手順はこちらを参照 http://d.hatena.ne.jp/enakai00/20110529/1306658627

 ※ ホストOSで次のコマンドによりコンテナのメモリ使用量が分かります。# lxc-cgroup -n <コンテナ名> memory.usage_in_bytes (物理メモリ使用量)

# lxc-cgroup -n <コンテナ名> memory.memsw.usage_in_bytes (物理メモリ+Swap使用量)

コンテナ実行時の注意点– コンテナでゲストOSを起動すると、おもむろ

に/sbin/initが実行されて、ユーザ空間の起動シーケンスが始まります。(/etc/rc.sysinitなど、物理環境を操作する設定ファイルは事前に修正が必要です。)

– コンテナを安全に(お行儀よく)停止する時は、ゲストOSでpoweroffを実行します。

– メモリ使用量の上限に達するとコンテナ内のプロセスが強制停止します。最悪、コンテナ全体が停止するので、コンテナのメモリ使用量には注意を払って下さい。

Page 15: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus15

LXCで始めるケチケチ仮想化生活?!

Hadoop on LXCにチャレンジ!

Page 16: Lxc で始めるケチケチ仮想化生活?!

Open Cloud Campus16

LXCで始めるケチケチ仮想化生活?!

Hodoop on LXC (on KVM)

実機デモをご覧下さい・・・・。– KVMゲストの上でLXCを使ってHadoopクラスタを構成します。

LXCを使えば、Amazon EC2のVMを1 個だけ借りて、Hadoopクラスタを構成することもできるはずです (*)。

– 性能面では考慮が必要ですが、機能検証などには利用できるかも?– OpenStackなどオープンソースのクラウドソフトウェアも LXC への対応をすすめています。

(*)【AWS発表】 Red Hat Enterprise LinuxをAmazon EC 上で時間課金で利用可能に http://bit.ly/ivDH7i

Page 17: Lxc で始めるケチケチ仮想化生活?!

中井悦司Twitter @enakai00

オープンクラウド・キャンパス

みなさんもLXCでケチケチ仮想化生活を始めてみてください!