今もう一度知ろう。 solarisのコンテナ型仮想化技術
TRANSCRIPT
今もう一度知ろう。 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 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 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 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 くらいしか回避策なし