めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Nested KVM環境でOpenStack(RDO/Grizzly)をセットアップ

変更履歴
2013/12/30 仮想マシンでIntel-VTを有効化する手順を追加

Nested KVMを利用して、1台のサーバで、マルチノード構成のRDO(Grizzly)を構築する機会があったので手順を残しておきます。「最短手順でRDO(Grizzly)のデモ環境を構築」で使用したquickrdoを拡張して、大部分を自動化してあります。

quickrdo自体は、Nested KVMを前提とはしていませんので、同じ方法で複数の物理サーバを利用したマルチノード構成も構築できるはずです。

環境

[Internet]
    |
    |
[物理NIC]
    |(NAT)
    |            public01 192.168.199.0/24
------------------------------------------
  |     |            |            |
  |eth0 |eth1        |eth0        |eth0
--------------  -----------  -----------  
| opst01     |  | opst02  |  | opst03  |
| Controller |  | Compute |  | Compute |
--------------  -----------  -----------
      |eth2          |eth1        |eth1
      |              |            |
------------------------------------------
                                 private01

母艦はFedora17 or Fedora18を利用します。この上に仮想ネットワーク「public01」「private01」を用意して、上記の仮想マシン「opst01」〜「opst03」をFedora18で作成します。それぞれ、仮想NIC「eth0」に外部接続用のIPアドレスを振ります。その他の仮想NICは、Compute Node上で起動した仮想マシンインスタンスの通信経路として利用します。

「eth0」に割り当てるIPアドレスとその他のネットワーク構成情報は、次のとおりです。

項目
サブネット 192.168.199.0/24
ゲートウェイ 192.168.199.1
DNSサーバ 192.168.199.1
IPアドレスプール 192.168.199.100〜192.168.199.199
仮想マシン IPアドレス
opst01 192.168.199.11
opst02 192.168.199.12
opst03 192.168.199.13

OpenStackとして構成する仮想ネットワークは、決め打ちで次のようになります。(こちらの仮想ネットワークも「private01」と名づけていますが、母艦上に用意する仮想ネットワーク「private01」とは別物なので注意してください。)

---------------- パブリックネットワーク
        |
   [demo_router] : 仮想ルータ
        |
     ----------------- プライベートネットワーク
                       private01 192.168.101.0/24

母艦の用意

Fedora17 or Fedora18をデスクトップ構成でインストールして、VNCなどでデスクトップ画面にアクセスできるようにしておきます。このデスクトップ上で、Firefoxを起動して、Horizonのダッシュボードを使用するためです。また、次のコマンドで、Nested KVMを有効化しておきます。

# echo “options kvm-intel nested=1″> /etc/modprobe.d/kvm-intel.conf
# reboot
# cat /sys/module/kvm_intel/parameters/nested
Y

次の定義ファイルで、仮想ネットワークを構成します。

public01.xml

<network>
  <name>public01</name>
  <forward mode='nat'/>
  <bridge name='virbr1' stp='off' delay='0' />
  <ip address='192.168.199.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.199.200' end='192.168.199.254' />
    </dhcp>
  </ip>
</network>

private01.xml

<network>
  <name>private01</name>
  <bridge name='virbr2' stp='off' delay='0' />
</network>
# virsh net-destroy default
# virsh net-autostart default --disable

# virsh net-define public01.xml
# virsh net-start public01
# virsh net-autostart public01

# virsh net-define private01.xml
# virsh net-start private01
# virsh net-autostart private01

Controller用仮想マシンの構成

次のKickStartファイルで、Fedora18の仮想マシンを作成します。

下記では、Fedora18公開リポジトリの代表URL「http://download.fedoraproject.org/pub/fedora/linux/releases/18/Fedora/x86_64/os/」からインストールしていますが、インストールに時間がかかる際は、ご近所のリポジトリを指定するか、もしくは、(Fedora18のインストールメディアの内容をWebで公開するなどして)ローカルリポジトリを用意してください。

opst01.ks

install
firewall --enabled --ssh
url --url="http://download.fedoraproject.org/pub/fedora/linux/releases/18/Fedora/x86_64/os/"
network --bootproto=static --hostname=opst01 --device=eth0 --gateway=192.168.199.1 --ip=192.168.199.11 --nameserver=192.168.199.1 --netmask=255.255.255.0 --activate
network --device=eth1 --onboot=no
network --device=eth2 --onboot=no
rootpw --iscrypted $1$x98kWl0S$.2NeEa.7fj/mJKFHxn9HI1
auth  --useshadow  --passalgo=sha512
graphical
firstboot --disable
keyboard jp106
lang en_US
selinux --enforcing
logging --level=info
reboot
timezone --isUtc Asia/Tokyo
bootloader --location=mbr
zerombr
clearpart --all --initlabel 
part /boot --asprimary --fstype="ext4" --size=512
part swap --fstype="swap" --size=4096
part / --fstype="ext4" --grow --size=1
part pv.1 --size=20480
volgroup cinder-volumes pv.1

%packages
@core
@standard
%end
# virt-install --name opst01 \
  --vcpus 2 --ram 4096 \
  --disk path=/var/lib/libvirt/images/opst01.img,size=64,sparse=false \
  --network network:public01 \
  --network network:public01 \
  --network network:private01 \
  --cpu host \
  --graphics vnc \
  --os-variant fedora18 \
  --location http://download.fedoraproject.org/pub/fedora/linux/releases/18/Fedora/x86_64/os/ \
  --initrd-inject=opst01.ks \
  --extra-args="ks=file:/opst01.ks"

インストールが完了したら、「root@192.168.199.11 / passw0rd」でログインして、RDOをインストールします。

# yum -y update
# yum -y install git
# cd ~
# git clone https://github.com/enakai00/quickrdo
# cd quickrdo
# git checkout f18-grizzly-mn
# ./setup.sh

途中で次のようなメッセージがでたら、rootパスワードを入力します。

Setting up ssh keys...root@192.168.199.11's password: 

インストールが完了すると、「Done. Now, you need to reboot the server.」というメッセージがでます。インストールが途中で失敗した場合は、「~/quickrdo/cleanup.sh」を実行するとインストール前の状態に戻りますので、再度、「~/quickrdo/setup.sh」を実行してください。

ここで、一度サーバを再起動します。

# reboot

サーバが起動したら、初期設定(仮想ネットワークの構成やユーザの追加など)を行います。ネットワーク構成が先の表と異なる場合は、スクリプト「~/quickrdo/config.sh」の冒頭にある下記の設定を書き換えます。

public="192.168.199.0/24" 
gateway="192.168.199.1" 
nameserver="192.168.199.1" 
pool=("192.168.199.100" "192.168.199.199") 
private=("192.168.101.0/24")

最後の1つは、仮想ネットワークの指定です。次のように、複数の仮想ネットワークを作成することもできます。

private=("192.168.101.0/24" "192.168.102.0/24")

次のコマンドで、初期設定を行います。

# cd ~/quickrdo
# ./config.sh
External NIC: eth1
Private NIC: eth2

上記のように「External NIC:」「Private NIC:」という表示がでるので、仮想マシンインスタンスがアクセスするNIC(public01側とprivate01側)を指定します。最後に「Configuration finished.」と表示されれば完了です。設定を変更する際は、「./config.sh」を再度実行してください。以前の設定を削除して、新しい設定が行われます

Compute Nodeの追加

次のKickStartファイルで、Fedora18の仮想マシンを作成します。

opst02.ks

install
firewall --enabled --ssh
url --url="http://download.fedoraproject.org/pub/fedora/linux/releases/18/Fedora/x86_64/os/"
network --bootproto=static --hostname=opst02 --device=eth0 --gateway=192.168.199.1 --ip=192.168.199.12 --nameserver=192.168.199.1 --netmask=255.255.255.0 --activate
network --device=eth1 --onboot=no
rootpw --iscrypted $1$x98kWl0S$.2NeEa.7fj/mJKFHxn9HI1
auth  --useshadow  --passalgo=sha512
graphical
firstboot --disable
keyboard jp106
lang en_US
selinux --enforcing
logging --level=info
reboot
timezone --isUtc Asia/Tokyo
bootloader --location=mbr
zerombr
clearpart --all --initlabel 
part /boot --asprimary --fstype="ext4" --size=512
part swap --fstype="swap" --size=4096
part / --fstype="ext4" --grow --size=1

%packages
@core
@standard
%end
# virt-install --name opst02 \
  --vcpus 2 --ram 4096 \
  --disk path=/var/lib/libvirt/images/opst02.img,size=64,sparse=false \
  --network network:public01 \
  --network network:private01 \
  --graphics vnc \
  --cpu host \
  --os-variant fedora18 \
  --location http://download.fedoraproject.org/pub/fedora/linux/releases/18/Fedora/x86_64/os/ \
  --initrd-inject=opst02.ks \
  --extra-args="ks=file:/opst02.ks" \
  --noautoconsole

「--cpu host」オプションで仮想マシンに対してIntel-VTを有効化している点に注意してください。(virt-managerから有効化する場合は、仮想マシンの設定画面の「Processor」メニューで「構成」タブを開いて「ホストCPUのコピーの設定」をクリックします。CPUの「モデル」に「Westmere」など、母艦のCPUモデルが入るので、「適用」をクリックします。)

インストールが完了したら、「root@192.168.199.12 / passw0rd」でログインして、パッケージのアップデートだけ行っておきます。

# yum -y update

この後は、opst01上から、opst02にRDOのインストールと構成を行います。opst01で次を実行します。

# cd ~/quickrdo
# ./add_compute.sh 192.168.199.12  <--- opst02のIPアドレスを指定
Private NIC: eth1

Doing preparations...

The authenticity of host '192.168.199.12 (192.168.199.12)' can't be established.
RSA key fingerprint is 26:ea:40:c7:1d:f3:83:9b:78:f5:f2:d4:64:55:c6:37.
Are you sure you want to continue connecting (yes/no)?  <--- yesを入力
Warning: Permanently added '192.168.199.12' (RSA) to the list of known hosts.
root@192.168.199.12's password: <--- passw0rdを入力
・・・
Done.

「Private NIC:」に対しては、opst02の「private01」側の仮想NICを指定します。その後は、ホスト鍵の受け入れ「yes」とopst02のrootパスワードを入力します。その後、RDOのインストールが自動で進みます。途中で一度、opst02が再起動しますが、そのまま待ちます。最後に「Done.」と表示されて、スクリプトが終了すればインストール完了です。

PackstackでNova Computeをインストールすると、Compute Nodeが仮想マシンゲストの場合、nova.confに「libvirt_type=qemu」が設定されます。Nested KVMを利用するには、「libvirt_type=kvm」に変更する必要があります。quickrdoでは、add_compute.shの中で、Compute Nodeに対して下記を実行しています。

# openstack-config --set /etc/nova/nova.conf DEFAULT libvirt_type kvm

「opst03」をさらにCompute Nodeとして追加する際は、同じ手順を繰り返します。変更するのは次の点になります。

・KickStartファイルの「--hostname」「--ip」の指定

network --bootproto=static --hostname=opst02 --device=eth0 --gateway=192.168.199.1 --ip=192.168.199.12 --nameserver=192.168.199.1 --netmask=255.255.255.0 --activate

・virt-installコマンドの「--name」「--disk path」「--initrd-inject」「--extra-args」の指定

# virt-install --name opst02 \
・・・
  --disk path=/var/lib/libvirt/images/opst02.img,size=64,sparse=false \
・・・
  --initrd-inject=opst03.ks \
  --extra-args="ks=file:/opst03.ks" \

・opst01で「add_compute.sh」を実行する際のIPアドレス指定

# ./add_compute.sh 192.168.199.13  <--- opst03のIPアドレスを指定

・SSHでnova.confを修正する際のIPアドレス指定

# ssh root@192.168.199.13 openstack-config --set /etc/nova/nova.conf DEFAULT libvirt_type kvm

VMインスタンスの起動

ここから先は、「最短手順でRDO(Grizzly)のデモ環境を構築」の「VMインスタンスの起動」と同じ手順になります。