一歩進んだxen仮想化環境構築 -...
TRANSCRIPT
1
一歩進んだXen仮想化環境構築
日本仮想化技術株式会社 技術部 野津 新
自己紹介
• Xenを主に担当 – Xenを利用したホスティングシステム – でもVMware関連の業務が多い
• Xenベースのクラウド(IaaS)管理ソリューションを開発中 – 実はPaaSやSaaSのほうが面白そうだと思っている
2
2
アジェンダ
• Xenの概要 • ストレージ
– ストレージ構成 – QCOW2ディスクイメージの利用
• ネットワーク – Xenネットワークのしくみを確認 – ユーザに管理権限を与えるリスクと対策
3
Xen環境の構成要素 • Xenハイパーバイザ
– CPU、メモリをドメイン(=VM)に割り当てる – ドメインに割り込みを配信する – デバイスの制御はしない
• Domain-U – 一般のVM、いわゆるゲスト
• Domain-0 – 管理VM – Domain-Uの制御(起動、停止...) – 物理デバイスの制御 – Domain-UのディスクIO、ネットワークIOを物理デバイスに反映 – 一般アプリケーションを実行することも可能だが通常は管理に専念
4
3
Domain-Uの仮想化タイプ • 準仮想化(PVドメイン)
– Xen上で動作するように変更されたゲストOS(カーネル、ドライバ)が必要
– 主要Linuxディストリビューションは対応済み • 完全仮想化(HVMドメイン)
– ゲストOSの改変不要 • Windows等をゲストOSとして利用可能
– CPUの仮想化支援機能が必要 – 準仮想化と同等の性能を発揮するにはゲストOSに準仮想化ドライバが必要
• ディスク、ネットワーク • 準仮想化では利用できないゲストOSの場合だけ完全仮想化を選択する
5
Xenを採用している仮想化製品 • Xen自体の機能はほぼ共通
• 管理方法の違いが大きい – テンプレート – クラスタ/HA – ストレージ管理
• 各Linuxディストリビューション – virt-managerによる管理が標準的
– Xenのバージョンは3.0~3.4まで様々
• Citrix Xen Server – XenCenterによる管理
• Oracle VM – Webベースの管理
6
4
ストレージの選択
• ストレージは運用形態やコストへの影響大 • ストレージ接続方式の選択肢
– ローカルストレージ – 共有ストレージ(FC,iSCSI,AoE,DRBD,...) – NFS
• 仮想ディスクイメージの選択肢 – ブロックデバイス – 論理ボリューム(LVM) – ディスクイメージファイル
• ファイル形式にも複数の選択肢 • 共有ストレージ上では共有ファイルシステムが必要
7
単一ホスト+ローカルストレージ構成
• 一般的なハードウェアだけで実現可能
• ローカルストレージに仮想ディスクを置く
• リソース不足の場合はハードウェア増強
• 耐障害性は低い – ホスト停止時には全
VMが停止
Xenホスト
ローカル ストレージ
VM VM VM
8
5
複数ホスト+共有ストレージ構成 • 共有ストレージ
– NFSでも可 • リソース不足の場合はホストの数を増やす – ストレージやファイルシステムによる上限に注意
• ホスト停止の場合は他のホストにVMを移動 – 計画停止なら停止前にライブマイグレーション
– 計画外停止なら別ホストでの再起動
Xen ホスト1
Xen ホスト2
Xen ホスト3
共有ストレージ
VM
VMを 移動可能
9
複数ホスト+DRBD構成 • DRBD
– ネットワークを介してブロックデバイスの内容を同一に保つ技術
– ローカルストレージを共有ストレージのように使用できる
– 低コスト – ホスト数は最大3
Xenホスト1
VM
Xenホスト2
VMを 移動可能
DRBDで同期
10
6
複数ホスト+ローカルストレージ構成 • 仮想化環境による冗長化に頼らない構成 – 仮想化はリソース配分のため
• アプリケーションの要件 – アプリケーション自身に冗長化機能が必要
– いくつかのVMが停止しても影響が小さい
– VM内には重要なデータを保存しない
• 例:冗長化されたWebサーバで、データは別の場所にあるDBサーバに保存
Xenホスト1
VM
Xenホスト2 Xenホスト3
VM VM VM VM VM
重要なデータは外部へ
11
ディスクイメージファイル
• ファイルをVMのディスクとして使用する • 複数の形式が使用可能
– RAW,QCOW(QCOW2),VMDK... – 相互に変換可能
• 仮想化に有利な機能を備えている – シン・プロビジョニング – Copy-on-Write – スナップショット
12
7
QCOW2
• QEMUの標準的なディスクイメージ形式 – QEMU Copy-On-Write 2 – QCOWの後継
• 2からスナップショット機能が追加された
– KVMでも使える
13
copy-on-write(COW) • ベースと差分の2ファイル構成 – 作成直後の差分ファイルは空っぽ
• 書き込みは差分ファイルへ
• 差分とベースをマージして読み取る – 差分内になければベースファイルから読む
• 差分はセクタ単位 • VMがCOWを意識する必要はない
AB CD EF AB XD EF
VMからは こう見える
AB CD EF
CD
AB CD EF
XD
AB CD EF AB XD EF
例:3文字目のCをXに書き換える 普通のディスクイメージの場合
COWの場合(上:差分 下:ベース) copy
write
14
8
COWのメリット-高速デプロイ • 同じVMを複数作成する時はディスクイメージファイルをコピーすると簡単
• 通常のディスクイメージファイル – ファイルまるごとコピー – 完了まで時間がかかる
• COWディスクイメージファイル – 差分ファイルだけをコピー、または差分ファイルだけを新しく作成
– まるごとコピーと比べてかなり短時間で完了
15
COWのメリット-ストレージの節約
• ベースファイルは複数のVMで共有できる • 差分ファイルのサイズはそれほど大きくならないのでストレージ使用量を節約できる – ストレージ使用量の合計は ベースファイル+VM1の差分ファイル+VM2の差分ファイル+...
– 書き換えの多い部分には使うべきでない • 最終的にはベースファイルと同じサイズまで大きくなる可能性があることに注意 – ストレージ空き容量の監視は必要
16
9
QCOW2ベースファイルの準備
• ベースディスクファイルはRAW形式のみ – QCOW2の制限ではなくXenのblktapの制限
• 普通にVMを作成し、OSのインストール等を行う
• このVMのディスクイメージファイルをベースディスクファイルとして使用する
17
QCOW2差分ファイルの作成と使用
• 差分ファイルの作成 – qemu-img-xen create –b ベースファイル名 -f
qcow2 差分ファイル名 • VMへのアタッチ
– バックエンドをtap:qcow2と指定 – disk=[ "tap:qcow2:差分ファイル名,xvda,w" ]
• 統合、形式変換、スナップショットもqemu-img-xenコマンドで – qemu-img-xen commit/convert/snapshot ... – 詳細はman qemu-img
18
10
QCOW2使用上の注意 • Xenのバージョンによっては使用できない
– 3.4以降が確実 • ベースに変更を加えると差分側が使えなくなる可能性がある – 原則として禁止
• リサイズは困難 – COWを統合してRAW形式にする – RAW形式でリサイズ
• ddコマンドなどでファイルサイズを大きくする – QCOW2に戻す
19
QCOW2の応用(1)
• ベースファイルはローカルストレージへ、差分ファイルは共有ストレージへ – 同一のベースファイルを全ホストに置く
• 共有ディスクの容量と読み取り負荷を減らす
• マイグレーションも可能
20
Xen ホスト2
Xen ホスト1
ベース ベース
差分 差分
11
QCOW2の応用(2) • ベースファイルは共有ストレージ、差分ファイルはローカルストレージヘ
• 書き込み負荷が共有ストレージにかからない
• マイグレーションはできない
• ロードバランサ下でスケールアウトするシステム向き
21
Xen ホスト2
Xen ホスト1
ベース
差分 差分
Xenホスト
Xenのネットワーク-VIFとVM • VMを起動すると
Domain-0にvifX.YというNICができる – 普通のNICと同じように扱える
• どこに接続されている? – Domain-UのNICと1対1に接続
• XはドメインID、YはDomain-U内でいくつめのNICかを表す
– vifX.Yから送信されたパケットはVM(ドメインID=X)のethYから出てくる
– 受信はその逆
実機A
eth0
実機B
eth0
eth1
DomU
eth0
Dom0
eth0 vifX.Y
vifX.YとDomUのeth0の関係は 実機Aのeth1と実機Bのeth0の関係と 同じ
22
12
Xenのネットワーク-VIFから物理NICへの転送
• VIF単独ではDomain-0とDomain-Uの通信しかできない
• Domain-Uが外部のネットワークとつながるにはvifX.Y-物理NIC間での転送が必要 – ブリッジ – IP転送
Domain-0
Domain-U
eth0
eth0
vifX.Y
転送が必要
23
ブリッジ/IP転送
ブリッジ
• あるNICから受信したEthernetパケットを他のNICに転送するためのしくみ
• ブリッジ=仮想スイッチングハブ – NIC=仮想スイッチングハブのポート
IP転送 • あるNICから受信したIPパケットを他のNICに転送するためのしくみ – IP以外のパケットは転送しない(捨てる)
– ブリッジに比べて適用範囲が限定される
• 大抵の用途に適用可能
• 必ずしもネットワークを分割しなくてよい – Proxy Arpによる擬似ブリッジ
24
13
手動でのブリッジ構成手順
• ブリッジの作成 – brctl addbr br0
• 物理NIC,VIFをブリッジに加える – brctl addif br0 eth0 – brctl addif br0 vif1.0
• 物理NIC,VIF,ブリッジを活性化 – ifconfig eth0 up – ifconfig vif1.0 up – ifconfig br0 up
25
Xenのネットワーク設定スクリプト • ネットワークの構成を自動化 • ネットワークスクリプト
– Xen管理サービス起動時に実行される – ホスト内で一回だけ実行する手順
• VIFスクリプト – VM起動時・停止時に実行される
• 正確にはアタッチ/デタッチのとき • udevにより実行される
– 各VIFに対して個別に実行する手順 • ネットワーク形態ごとにスクリプトが用意されている
– どのスクリプトを使うか/etc/xen/xend-configで設定 – (network-script network-bridge) – (vif-script vif-bridge)
26
14
VMがブリッジに接続されるまで • Domain-0のネットワークが起動
– Linux標準のネットワーク設定サービス – 物理NIC活性化、IPアドレス等割り当て
• Xenのネットワークスクリプトを実行 – network-bridgeスクリプト – ブリッジの作成 – 物理NICをブリッジに加える – 物理NICに割り当てられていたIPアドレスをブリッジに移植
• VM起動時にVIFスクリプトが実行される – vif-bridgeスクリプト – VIFをブリッジに加える
27
IP転送(擬似ブリッジ)構成手順 • IP転送の有効化
– echo 1 >/proc/sys/net/ipv4/ip_forward • 物理NICとVIFを活性化
– 物理NICにはIPアドレスが必要 – VIFにはIPアドレス不要
• VMへのルートをVIFに設定 – route add (VMのIPアドレス)vifX.Y
• 物理NICとVIFにProxyArpを許可 – echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp – echo 1 >/proc/sys/net/ipv4/conf/vifX.Y/proxy_arp
• ネットワーク設定スクリプトはnetwork-routeとvif-route – (network-script network-route) – (vif-script vif-route)
28
15
複雑な構成
• 複数のブリッジ – VLAN – 冗長化
• Xenのネットワークスクリプトをカスタマイズして対応可能だが・・・
• OSのネットワーク管理機能でブリッジを作るほうが管理しやすい – Xenのネットワークスクリプトは必要事項を理解するためだけのものと考えて、実際には使用しないことを推奨
• Xenのネットワークスクリプトの無効化 – xend-config.sxpで(network-script)
29
参考:OSの機能でブリッジを作成する方法
• ブリッジbr0を作成し、eth0をbr0のポートにする場合の例
• CentOSでは自分で設定ファイルを作成/書き換え – SUSEはYaSTで
DEVICE=br0 TYPE=Bridge BOOTPROTO=static IPADDR=(Dom0が使うIPアドレス) NETMASK=(ネットマスク) ONBOOT=yes
/etc/sysconfig/network-scripts/ifcfg-br0
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=none HWADDR=(eth0のMACアドレス) ONBOOT=yes BRIDGE=br0
30
16
参考:NIC冗長化 • Domain-0でボンディングを利用
– 通常のLinuxと同じ • ボンディングデバイスをブリッジのポートとする
• NICが切り替わったときに外部からVMへの通信が回復するのに時間がかかることがある – 切り替わり時にVMのMACアドレスがスイッチに再通知(Gratuitous ARP)されないことが原因
– 対策1:スイッチのARPキャッシュの寿命を短くする – 対策2:ブリッジではなくIP転送を使う
31
管理者権限とネットワーク
• 仮想化環境ではユーザにゲストOSの管理者権限を与える運用が可能 – ユーザに最大限のカスタマイズを許可 – ホスティングやIaaS用途で有効
• ネットワークに関するリスク – 正規のIPアドレス以外の使用 – 他のユーザのVMへの不正アクセス
• ゲストOS外での対策が必要 32
17
リスクへの対策
• VIFのトラフィックをフィルタリング – iptablesなどを使用して制御可能 – Domain-0のFORWARDチェインを通過
• IPアドレスの変更対策 – 正規のIPアドレス以外は通さない – MACアドレスを変更した場合も通さない
• 不正アクセス対策 – 各ユーザのネットワークを隔離 – 単に隔離するのではなく必要に応じて開放
• 完全に隔離するならタグVLANも使える • ただしVLAN IDは上限4095
33
具体的対策(ブリッジの場合)
• VIFとソースIPアドレスの対応が正しくないパケットはDROP – NIC指定は-i/-oの代わりに--physdev-in/--physdev-outを使用
• VIFと宛先IPアドレスの対応が正しくないパケットはDROP – ブロードキャストアドレスも
• さらに、Ethernetレベルでの対策が必要 – iptablesはIPを使用しない通信には効果がない
• ebtablesを使用 – 本来のMACアドレス以外はDROP – 不正なIPアドレスを使用したARP送信をDROP
• VM固有の設定を含めることも可能 34
18
具体的対策(IP転送の場合) • ブリッジよりも簡単 • 送信時ソースアドレスの制限だけでOK • Domain-0でルーティングされるためDomain-Uは正規のIPアドレス以外では受信できない – 受信についての対策不要
• EthernetレベルではDomain-UはDomain-0とのみリンクしている – 他のVM/機器はMACアドレス変更の影響を受けない→対策不要
35
フィルタ設定の自動化
• 方法A:あらかじめ全ルールを設定しておく – VIF名はVM設定ファイル内で指定可能
• vif=[ "mac=00:16:3e:ab:cd:ef,vifname=vifABC.0" ] – 小規模向き
• 方法B:VIFスクリプトを改造 – ルール設定する部分を追加
• /etc/xen/scripts/vif-common.shのhandle_iptables関数などを参考に
– VM固有のルールをVIFスクリプトに渡す方法に工夫が必要
• 例:適当なディレクトリを決め、ルールを書いたファイルにVMと同じ名前をつけて保存
36