今もう一度知ろう。 solarisのコンテナ型仮想化技術

43
今もう一度知ろう。 Solaris のコンテナ型 仮想化技術 みやざきさとる 日本 OpenSolaris ユーザグループ

Upload: satoru-miyazaki

Post on 20-Jul-2015

598 views

Category:

Technology


0 download

TRANSCRIPT

今もう一度知ろう。Solarisのコンテナ型仮想化技術

みやざきさとる日本 OpenSolaris ユーザグループ

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 2

Agenda

コンテナ型仮想化とは

Solaris Zone を使った

コンテナ型仮想化

Zone の使い方

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 3

自己紹介とある IT 企業の Solaris 使い

Twitter: s_miyaza

Solaris なのは趣味です

最近 Solaris のお仕事がありません…(´・ω・`)

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 4

コンテナ型仮想化とは

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 5

仮想化についておさらい同一ハードウェアで、別OSを動かす

別OS別アーキテクチャ

OSの物理的制約を回避し、柔軟に構成メモリディスクネットワーク

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 6

ネイティブ仮想化とコンテナ型仮想化

ネイティブ仮想化エミュレータにより子OSを動作OS側は無修正で動作オーバヘッドありVMware、 Xen、 KVMなど

コンテナ型仮想化OS権限を使用して子OSを分離同じOSが動作 (基本的には ...)

オーバヘッドなしJail、 Solaris Zone、 LXCなど

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 7

コンテナ型仮想化とはOSレベルでカプセル化

基本的に、同一OSで動作コンテナからは他コンテナ、親のリソースにアクセス不可親からはコンテナのリソースにアクセス可能

オーバヘッドなし同じOSで動くリソースも親まかせ

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 8

いろいろなコンテナChrootJailOpenVZ(Virtuozzo)LXCDockerSolaris Zone

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 9

Chroot

指定したパスを rootとして動作するchroot化のプロセスは上位にアクセス不可指定したパス以下に使用バイナリコピーネットワークは親OSのものを使用CPU/メモリなどの制限不可UNIX系OSならたいてい使用可能

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 10

Jail

FreeBSDで動作ファイルシステム、プロセス空間、ユーザアカウントなどを親OSから分離jailごとに一つの IPアドレスを使用可能

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 11

OpenVZ(Virtuozzo)

Linux上で動作 (OpenVZ用カーネル使用 )Parallels社が開発OSS版がOpenVZ、商用版が Virtuozzoリソースをコンテナごとに分離可能

ファイルシステムユーザグループプロセスツリーネットワークデバイス、 IPCオブジェクト

ライブマイグレーション可能

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 12

LXC

Linuxで動作 (2.6.29以降 )Namespace+CGroupsで実装Namespace

名前によってリソースをグループ化CGroups(Control Groups)

Namespaceによってグループされたリソースを制御CPU、メモリ、ブロック I/Oの制御

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 13

Docker

Linuxで動作アプリケーションコンテナ=特定アプリケーションのみ動作するLXCやNamespaceを使用して実装Docker の imageを git登録することで、簡易にデプロイ可能

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 14

•Solaris Zone を使ったコンテナ型仮想化

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 15

Solaris ZoneとはSolaris10以降で実装同じカーネルで複数OSを動作プロセス、ディスク、ネットワーク、ユーザグループなどを分離CPU、メモリなどの制限仮想化されたNetwork(Project Crossbow)を有効利用ZFS機能の有効利用OpenStack連携

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 16

Solaris Zone の構成

Solaris 大域ゾーン (Global Zone)

ローカルストレージ

iSCSI FC-SAN

非大域ゾーン(Non-Global Zone)

ZBE1

ZBE1

仮想 SW1

Net0

Net0 Net1

Zone2

ZBE2

ZBE2

DATA

Net0

仮想 SW2

Net1DATA

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 17

Zoneを作ってみる (1)

Zoneの設定zonecfg -z ゾーン名 create; commit

対話型設定も可能

% sudo /usr/sbin/zonecfg -z zone1 'create ; verify ; export ; commit ' create -bset zonepath=/system/zones/%{zonename}set autoboot=falseset autoshutdown=shutdownset ip-type=exclusiveadd anetset linkname=net0set lower-link=autoset configure-allowed-address=trueset link-protection=mac-nospoofset mac-address=autoend% sudo /usr/sbin/zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - zone1 configured /system/zones/zone1 solaris excl

% sudo /usr/sbin/zonecfg -z zone1zonecfg:zone1>

Page 18今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Zoneを使ってみる (1)の補足以下の設定値が必須

ZonepathSolaris11では以下のように自動設定

Solaris11以外では明示的に設定が必要Network設定

Solaris11では anetが自動設定netを使用して、 VNICを明示的に指定可能Solaris11以外では VNICの明示的な指定が必要詳しくは後述

set zonepath=/system/zones/%{zonename}

Page 19今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Zoneを作ってみる (2)zonecfg -z ゾーン名 createゾーン名の名前を付けた Zoneを作成zonecfg -z ゾーン名 verifyZoneの設定を確認zonecfg -z ゾーン名 exportZone の設定を出力この出力情報を基に Zone設定も可能

zonecfg -z ゾーン名 commitZoneの設定を確定

Solaris-1:% sudo /usr/sbin/zonecfg -z zone1 export > /net/solaris-2/share/zone1.cfg

Solaris-2:% sudo /usr/sbin/zonecfg -z zone1 -f /share/zone1.cfg

Page 20今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Zoneを作ってみる (3)

Zoneのインストールzoneadm -z ゾーン名 installpkgリポジトリへアクセスが必要デフォルトで http://pkg.oracle.com/solaris/release/

% sudo /usr/sbin/zoneadm -z zone1 installThe following ZFS file system(s) have been created: rpool/VARSHARE/zones/zone1Progress being logged to /var/log/zones/zoneadm.20150224T232755Z.zone1.install Image: Preparing at /system/zones/zone1/root.

(中略 )

Next Steps: Boot the zone, then log into the zone console (zlogin -C)

to complete the configuration process.

Log saved in non-global zone as /system/zones/zone1/root/var/log/zones/zoneadm.20150224T232755Z.zone1.instal

% sudo /usr/sbin/zoneadm list -cvパスワード : ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - zone1 installed /system/zones/zone1 solaris excl

Page 21今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Zoneを作ってみる (4)

Zoneのブートzonecfg -z ゾーン名 bootZoneの初期設定zlogin -C ゾーン名-C を指定して、コンソールモードで接続初回設定 (sysconfig)ホスト名ネットワーク設定タイムゾーン初期ユーザ・ rootのパスワード

初回以外は zlogin ゾーン名で接続

Page 22今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

リソースの分離同じカーネルを使用プロセスの分離CPU/メモリの制限ディスクの制限ネットワークの制限

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 23

同じカーネルを使用大域ゾーン

システムコール

メモリ割り当て

非大域ゾーン

プロセス

システムコール

メモリ割り当て

プロセス

カーネル

今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Page 24

大域ゾーンからみたプロセス大域ゾーンからは非大域ゾーンのプロセスが見える

非大域ゾーンのプロセス=大域ゾーンのプロセス (Zone名付 )

% ps -efZ ZONE UID PID PPID C STIME TTY TIME CMD global root 0 0 0 2月 07 ? 0:02 sched global root 5 0 0 2月 07 ? 85:24 zpool-rpool global root 1 0 0 2月 07 ? 0:01 /sbin/init global root 2 0 0 2月 07 ? 0:00 pageout global root 3 0 0 2月 07 ? 109:36 fsflush (中略)

global root 2356 1 0 2月 07 ? 0:00 zoneadmd -z zone1 zone1 root 3611 1 0 2月 07 ? 0:01 /usr/sbin/syslogd zone1 root 3591 3203 0 2月 07 zoneconsole 0:00 /usr/lib/saf/ttymon ... zone1 root 3589 1 0 2月 07 ? 0:07 /usr/lib/fm/fmd/fmd zone1 root 3582 3580 0 2月 07 ? 0:00 /usr/lib/autofs/automountd zone1 root 3496 1 0 2月 07 ? 0:00 /usr/sbin/cron zone1 root 3588 1 0 2月 07 ? 0:00 /usr/lib/inet/inetd start

Page 25今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

非大域ゾーンからみたプロセス

非大域ゾーンのプロセスしかみえない他の非大域 Zoneのプロセスも見えない

% sudo zlogin zone1 ps -efZPassword: ZONE UID PID PPID C STIME TTY TIME CMD zone1 root 3580 2952 0 Feb 07 ? 0:00 /usr/lib/autofs/automountd zone1 root 3438 2952 0 Feb 07 ? 0:15 /usr/sbin/nscd zone1 root 3110 2952 0 Feb 07 ? 0:01 /sbin/init zone1 root 3569 2952 0 Feb 07 ? 0:00 /usr/lib/inet/in.ndpd (中略)

zone1 root 3611 2952 0 Feb 07 ? 0:01 /usr/sbin/syslogd zone1 root 3591 3203 0 Feb 07 console 0:00 /usr/lib/saf/ttymon -g -d ... zone1 root 3589 2952 0 Feb 07 ? 0:07 /usr/lib/fm/fmd/fmd zone1 root 3582 3580 0 Feb 07 ? 0:00 /usr/lib/autofs/automountd zone1 root 3496 2952 0 Feb 07 ? 0:00 /usr/sbin/cron zone1 root 3588 2952 0 Feb 07 ? 0:00 /usr/lib/inet/inetd start

Page 26今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

CPUの制限Zoneの設定でCPUを制限

capped-cpuZoneで使用するCPU時間を制限1を指定すると 100%、 1.5を指定すると 150%動的変更可能 (Solaris11のみ )

dedicated-cpu(Solaris11のみ )特定のCPUを指定して割り当て

zonecfg:zone1> add capped-cpu zonecfg:zone1:capped-cpu> set ncpus=1zonecfg:zone1:capped-cpu> end

zonecfg:zone1> add dedicated-cpu zonecfg:zone1:dedicated-cpu> set ncpus=3-4zonecfg:zone1:dedicated-cpu> end

zonecfg:zone1> add capped-cpu zonecfg:zone1:capped-cpu> set ncpus=1zonecfg:zone1:capped-cpu> end

Page 27今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

メモリの制限Zone の設定でメモリを制限

capped-memoryゾーンが使用できるメモリの最大値を指定K 、 M 、 G 、 T の単位を指定可能

zonecfg:zone1> add capped-memory zonecfg:zone1:capped-memory> set physical=2Gzonecfg:zone1:capped-memory> end

Page 28今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

仮想化 Networkの利用Solaris11 、 OpenSolaris では Network が仮想化されている仮想 SW 、 NIC を自由に組み合わせ可能closed なネットワークも利用可能Zone に複数の仮想 NIC を割り当てることにより、自由なネットワーク構成可能Zone に割り当てられた仮想 NIC 以外は接続不可

Page 29今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

じゆうなねっとわーく

Solaris11/OpenIndiana

大域ゾーン

物理NIC

VNIC01

仮想 SW1

仮想 SW2

Zone1

VNIC1

Zone2

VNIC11

VNIC12

VNIC21

ルーティング

The Internet

Page 30今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Networkの制限割り当てた VNICに対して帯域幅を制限

dladmを使用maxbwを VNICに対して指定すると帯域幅を制限以下の例では、 100Mbpsに制限

flowadmを使用大域幅、優先度、接続先などより細かい制限が可能

% dladm show-linkprop -p maxbw zone1/net0LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLEzone1/net0 maxbw rw -- -- -- -- % sudo dladm set-linkprop -p maxbw=100 zone1/net0% dladm show-linkprop -p maxbw zone1/net0 LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLEzone1/net0 maxbw rw 100 100 -- --

Page 31今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

ZFSの使用ZFSをゾーンの配置に使用ZFSプール、 ZFSファイルセットの追加割り当て可能ゾーン内からは、ゾーンに割り当てられた領域以外アクセス不可FC、 iSCSIを zfs poolに割り当て可能※ Solaris11以降

Page 32今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

ZFSを使用したディスクの制限Zoneのパスに対して quotaを設定

ZFSの機能を使用して、制限可能以下は、 ZonePATHに対して、 1GBの quotaを設定% sudo /usr/sbin/zfs list rpool/VARSHARE/zones/zone1/rpool/ROOT/solarisNAME USED AVAIL REFER MOUNTPOINTrpool/VARSHARE/zones/zone1/rpool/ROOT/solaris 680M 23.2G 635M /system/zones/zone1/root% sudo /usr/sbin/zfs get mountpoint rpool/VARSHARE/zones/zone1/rpool/ROOT/solaris NAME PROPERTY VALUE SOURCErpool/VARSHARE/zones/zone1/rpool/ROOT/solaris mountpoint /system/zones/zone1/root temporary% sudo /usr/sbin/zfs get quota rpool/VARSHARE/zones/zone1/rpool/ROOT/solarisNAME PROPERTY VALUE SOURCErpool/VARSHARE/zones/zone1/rpool/ROOT/solaris quota none default% sudo /usr/sbin/zfs set quota=1G rpool/VARSHARE/zones/zone1/rpool/ROOT/solaris% sudo /usr/sbin/zfs get quota rpool/VARSHARE/zones/zone1/rpool/ROOT/solaris NAME PROPERTY VALUE SOURCErpool/VARSHARE/zones/zone1/rpool/ROOT/solaris quota 1G local

Page 33今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

ZFSを使用したデプロイ (1)

ゾーンの clone既存のゾーンと同じゾーンを作成zoneadm -z ゾーン名 clone 既存ゾーン名% sudo zonecfg -z zone2 'create; verify; commit'% sudo zoneadm list -v ID NAME STATUS PATH BRAND IP 0 global running / solaris shared% sudo zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - zone1 installed /system/zones/zone1 solaris excl - zone2 configured /system/zones/zone2 solaris excl % sudo zoneadm -z zone2 clone zone1The following ZFS file system(s) have been created: rpool/VARSHARE/zones/zone2Progress being logged to /var/log/zones/zoneadm.20150226T211933Z.zone2.cloneLog saved in non-global zone as /system/zones/zone2/root/var/log/zones/zoneadm.20150226T211933Z.zone2.clone% zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - zone1 installed /system/zones/zone1 solaris excl - zone2 installed /system/zones/zone2 solaris excl

Page 34今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

ZFSを使用したデプロイ (2)

ZFSの cloneを使用してデプロイZFS Cloneは、 snapshotを元に書き込み可能なファイルセットを作成する機能snapshot元との差分のみが書き込まれるディスクの有効利用

% zfs list

rpool/VARSHARE/zones/zone1/rpool/ROOT 717M 23.2G 31K legacyrpool/VARSHARE/zones/zone1/rpool/ROOT/solaris 717M 307M 664M /system/zones/zone1/rootrpool/VARSHARE/zones/zone1/rpool/ROOT/solaris/var 44.9M 307M 43.9M /system/zones/zone1/root/var

rpool/VARSHARE/zones/zone2/rpool/ROOT 5.03M 23.2G 31K legacyrpool/VARSHARE/zones/zone2/rpool/ROOT/solaris-0 5.03M 23.2G 667M /system/zones/zone2/rootrpool/VARSHARE/zones/zone2/rpool/ROOT/solaris-0/var 45K 23.2G 43.9M /system/zones/zone2/root/var

Page 35今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

ZFSの重複排除の有効利用ZFSの重複排除ブロック単位で同じデータを使いまわす変更分のみ増える

Zoneは rootパーティションがほぼ同じ=重複排除が効きやすい!

Global-Zone

Zone1 Zone2

Page 36今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

変わりもの ZoneたちBranded Zone

LXSolaris8/9Solaris10

Kernel Zone

Page 37今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

LX Zone

なぜか Zone内で Linuxが動くただし、CentOS3.8

OpenSolarisで動作Project Janusの成果カーネルをエミュレートなので遅い ...?

正式版 Solaris10/11ではサポートされず最近、 StormOS(by Joyent)で動きがUbuntu14.xが動いたとか…

Page 38今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Solaris8/9 Zone

Solaris10のみで動作古い Solaris8/9の延命P2Vでマイグレーション可能ライブマイグレーション可能らしい ...有償

Page 39今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Solaris10 Zone

Solaris11で動作P2V可能標準機能!

Page 40今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

Kernel Zone

Solaris11.2以降で動作Zoneは同じカーネルを使用Kernel Zoneは、別カーネルで動作他ゾーンの動作影響を受けないパッチレベルの異なるカーネルを動作可能

CPUの仮想化命令が必要VTi、AMD-V、 SPARC T4/T5

物理空きメモリ 8GB推奨ZFSのキャッシュ (ARC)を制限する必要あり

Page 41今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

OpenStackと連携Solaris11.2 から OpenStack サポート前回 (OSC2014 Tokyo/Fall) 発表http://www.slideshare.net/satorumiyazaki/oracle-solarisopenstackHavana ベースZone および KernelZone をサポートCinder(block storage) 、 Swift(Object Storage) でZFS サポートSolaris11.2 の仮想化ネットワークスイッチ( Elastic Virtual Switch) と Neutron の連携

Page 42今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

そんな Zoneの問題点初回起動が遅い

数分かかるサービスの初期化が遅い⇒AIマニフェストを指定して、インストールするPKGを制限する% zoneadm -z ゾーン名 install -m ai_manifest.xml初回設定 (sysconfig 実施 )⇒インストール時に sysconfig のマニフェスト指定 % zoneadm -z ゾーン名 install -c sc_manifest.xml

カーネルパニックすると皆こける⇒Kernel Zone くらいしか回避策なし

Page 43今もう一度知ろう。 Solaris のコンテナ型仮想化技術OSC2015 Tokyo/Spring

まとめSolaris Zone は、同じカーネルで動く=オーバヘッドが少ないCPU/Memory/Network 帯域 を制限ZFS の機能をフル活用

Clone重複排除サイズ制限

変態ゾーンもあるよLX とか、カーネルゾーンとか

OpenStack と連携もあるよ