nested vm + multi node + neutron network な環境をdevstackで作る

ubuntu 16.04でのkvm環境の作り方 - ただの記録 の続き。

前回まではただkvmの環境を作っただけ。目的は今回のタイトルの環境を作ることで、ようやく動く環境が作れたので記録に残しておく。

まずはcomputeノードとなる仮想マシンに対してkvmのアシストが効くように設定を変更する。これをやっておかないと仮想マシン上でcat /prot/cpuinfoしたときにvmxがでてこず、kvmによるアシストが効かない。

rwar@tx1310m1:~$ virsh edit compute1

<cpu mode='host-passthrough'>     # cpuタグにhost-passthroughを設定する

そんでいよいよdevstackを実行してみる。その前にstackユーザを作ったりとセットアップする。ここではcontrollerノードになる予定のサーバに対して設定するが、すべてのノードに対して同じ設定を入れる。

test@controller:~$ sudo groupadd stack
test@controller:~$ which bash
/bin/bash
test@controller:~$ sudo useradd -g stack -s /bin/bash -d /opt/stack -m stack
test@controller:~$ sudo visudo
test@controller:~$

stack ALL=(ALL) NOPASSWD: ALL     # この行を追加する

test@controller:~$ sudo passwd stack
[sudo] password for test: 
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
test@controller:~$ exit

stackユーザで入りなおしてdevstackをダウンロードする。

stack@controller:~$ git clone https://git.openstack.org/openstack-dev/devstack
Cloning into 'devstack'...
remote: Counting objects: 34131, done.
remote: Compressing objects: 100% (16173/16173), done.
remote: Total 34131 (delta 24228), reused 27025 (delta 17501)
Receiving objects: 100% (34131/34131), 6.64 MiB | 2.62 MiB/s, done.
Resolving deltas: 100% (24228/24228), done.
Checking connectivity... done.
stack@controller:~$ cd devstack/
stack@controller:~/devstack$

ここでlocal.confという設定ファイルを作る。controllerノードとcomputeノード用に2種類を作る。

まずはcontroller向け

stack@controller:~/devstack$ cat local.conf 
[[local|localrc]]
MULTI_HOST=True
HOST_IP=192.168.1.10

SERVICE_HOST=192.168.1.10
MYSQL_HOST=${SERVICE_HOST}
RABBIT_HOST=${SERVICE_HOST}
GLANCE_HOSTPORT=${SERVICE_HOST}:9292

ADMIN_PASSWORD=test
MYSQL_PASSWORD=test
RABBIT_PASSWORD=test
SERVICE_PASSWORD=test

# Do not use Nova-Network
disable_service n-net
disable_service n-cpu

# Neutron
ENABLED_SERVICES+=,n-novnc,q-svc,q-dhcp,q-meta,q-agt,q-l3

## Neutron options
#Q_USE_SECGROUP=True
Q_USE_SECGROUP=False
FLOATING_RANGE="192.168.1.0/24"
FIXED_RANGE="10.0.0.0/24"
Q_FLOATING_ALLOCATION_POOL=start=192.168.1.200,end=192.168.1.254
PUBLIC_NETWORK_GATEWAY="192.168.1.1"
PUBLIC_INTERFACE=ens6

# Open vSwitch provider networking configuration
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex

stack@controller:~/devstack$ 

次にcompute向け

stack@compute1:~/devstack$ cat local.conf 
[[local|localrc]]
MULTI_HOST=True
HOST_IP=192.168.1.21

SERVICE_HOST=192.168.1.10
MYSQL_HOST=${SERVICE_HOST}
RABBIT_HOST=${SERVICE_HOST}
GLANCE_HOSTPORT=${SERVICE_HOST}:9292

ADMIN_PASSWORD=test
MYSQL_PASSWORD=test
RABBIT_PASSWORD=test
SERVICE_PASSWORD=test

## Neutron options
PUBLIC_INTERFACE=ens6
ENABLED_SERVICES=n-cpu,rabbit,q-agt

NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

stack@compute1:~/devstack$ 

computeノードを複数作りたい場合はHOST_IPのみを変更すれば良い。

local.confができたらstack.shを走らせるわけだが、どうもcontrollerノードに関してはbr-exというovsブリッジを 先に作っておかないとstack.shが途中で停止してしまう。

stack@controller:~/devstack$ sudo apt install openvswitch-switch
stack@controller:~/devstack$ sudo ovs-vsctl add-br br-ex

これで準備ができた。各ノード上でstack.shを走らせる。

stack@controller:~/devstack$ ./stack.sh

アップデートなどでOSを再起動する前にはunstack.shを実行する。 computeノードでは再起動後にunstack.shしても大丈夫だが、controllerノードではあらかじめunstack.shしておかないと sshできなくなるので注意が必要となる。*1

stack@controller:~/devstack$ ./unstack.sh

もしstack.shが失敗したときに環境を綺麗にする方法は

stack@controller:~/devstack$ ./unstack.sh
stack@controller:~/devstack$ ./clean.sh

local.confを書き換えてstack.shを実行する。

*1:ens6に振られていたIPアドレスが、stack.shによってbr-exに移動される。再起動するとbr-exに割り当てられたアドレスがセットされないので通信できなくなる。unstack.shするとens6にIPアドレスが戻って通信できるようになる。もしsshできなくなったらvncとかで入ってunstack.shする必要があるのでちょっとだけ面倒くさい。

ubuntu 16.04でのkvm環境の作り方

ubuntu 16.04がリリースされたので、kvmの環境を作り直したついでに手順を記録しておいた。

test@tx1310m1:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
UBUNTU_CODENAME=xenial
test@tx1310m1:~$ 

いろいろ必要なものを入れる。依存関係がわからないのでコマンドを実行して入ってなかったら入れる。できるだけ最低限のものしか入れたくないので試しながら入れる。

test@tx1310m1:~$ virsh
The program 'virsh' is currently not installed. You can install it by typing:
sudo apt install libvirt-bin
test@tx1310m1:~$ sudo apt install libvirt-bin
test@tx1310m1:~$
test@tx1310m1:~$ qemu-img
The program 'qemu-img' is currently not installed. You can install it by typing:
sudo apt install qemu-utils
test@tx1310m1:~$ sudo apt install qemu-utils
test@tx1310m1:~$ ovs-vsctl
The program 'ovs-vsctl' is currently not installed. You can install it by typing:
sudo apt install openvswitch-switch
test@tx1310m1:~$ sudo apt install openvswitch-switch
test@tx1310m1:~$ kvm
The program 'kvm' is currently not installed. You can install it by typing:
sudo apt install qemu-kvm
test@tx1310m1:~$ sudo apt install qemu-kvm

Open vSwitchが使いたいので、デフォルトで作られるLinuxブリッジを削除する。

test@tx1310m1:~$ sudo virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

test@tx1310m1:~$ sudo virsh net-info
error: command 'net-info' requires <network> option
test@tx1310m1:~$ sudo virsh net-info default
Name:           default
UUID:           73000481-2759-4b73-89bf-71822032a568
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

test@tx1310m1:~$ 
test@tx1310m1:~$ sudo virsh net-destroy default
Network default destroyed

test@tx1310m1:~$ sudo virsh net-autostart default --disable
Network default unmarked as autostarted

仮想マシンのネットワークを適当に何個かつくる。 Using DevStack with neutron Networking — DevStack 0.0.1.dev7579 documentation これに則るならば2つ作る。ここでは3つ作っている。

test@tx1310m1:~$ sudo ovs-vsctl add-br br-external
test@tx1310m1:~$ sudo ovs-vsctl add-br br-internal-1
test@tx1310m1:~$ sudo ovs-vsctl add-br br-internal-2
test@tx1310m1:~$ sudo ovs-vsctl add-port br-external enp2s0
test@tx1310m1:~$ sudo ovs-vsctl show
c23e6cb4-b027-4255-ab0f-9cca018b573a
    Bridge "br-internal-2"
        Port "br-internal-2"
            Interface "br-internal-2"
                type: internal
    Bridge br-external
        Port br-external
            Interface br-external
                type: internal
        Port "enp2s0"
            Interface "enp2s0"
    Bridge "br-internal-1"
        Port "br-internal-1"
            Interface "br-internal-1"
                type: internal
    ovs_version: "2.5.0"
test@tx1310m1:~$ 

空っぽのqcow2イメージを作って、仮想マシンの実体を作る。

test@tx1310m1:~$ cd vm/
test@tx1310m1:~/vm$ qemu-img create -f qcow2 ctrl.qcow2 20G
Formatting 'ctrl.qcow2', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
test@tx1310m1:~/vm$ file ctrl.qcow2 
ctrl.qcow2: QEMU QCOW Image (v3), 21474836480 bytes
test@tx1310m1:~/vm$ 
test@tx1310m1:~$ virt-install
The program 'virt-install' is currently not installed. You can install it by typing:
sudo apt install virtinst
test@tx1310m1:~$ sudo apt install virtinst
test@tx1310m1:~$ sudo virt-install -n controller -r 4096 --disk path=/home/test/vm/ctrl.qcow2,bus=virtio --nonetworks --graphics vnc,password=vnc,listen=0.0.0.0,keymap=ja --noautoconsole -v --boot hd

Starting install...
Creating domain...                                          |    0 B  00:00     
Domain creation completed.
test@tx1310m1:~$ 
test@tx1310m1:~/vm$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 1     controller                     running

test@tx1310m1:~$ 

仮想マシンの設定ファイルを編集する。起動順序をcdrom -> hddに変更する、CDデバイスとネットワークデバイスを追記する。

test@tx1310m1:~/vm$ virsh edit controller
----------これ追加
    <boot dev='cdrom'/>
----------これ追加
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file=‘/home/test/iso/ubuntu-16.04-server-amd64.iso’/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <interface type='bridge'>
      <source bridge='br-external'/>
      <virtualport type='openvswitch'>
      </virtualport>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br-internal-1'/>
      <virtualport type='openvswitch'>
      </virtualport>
      <model type='virtio'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br-internal-2'/>
      <virtualport type='openvswitch'>
      </virtualport>
      <model type='virtio'/>
    </interface>

編集が終了したら、適用した仮想マシンを再スタートする。ついでにvncのディスプレイ番号をチェックしておく。

test@tx1310m1:~$ sudo virsh destroy controller
Domain controller destroyed

test@tx1310m1:~$ sudo virsh start controller
Domain controller started

test@tx1310m1:~$ virsh vncdisplay controller
:0

test@tx1310m1:~$ 

vncで接続してインストールする。vncクライアントはMacのFinderを使ったが、たぶんなんでもいい。パスワードの入力を促されるので「vnc」と入れる。インストールが完了したら設定ファイルを編集し、isoファイルを指定している行を削除する。削除したら設定ファイルを再適用して終わり。

test@tx1310m1:~$ virsh edit controller
Domain controller XML configuration edited.

----------これ削除
      <source file=‘/home/test/iso/ubuntu-16.04-server-amd64.iso’/>
----------

test@tx1310m1:~$ virsh destroy controller
Domain controller destroyed

test@tx1310m1:~$ virsh start controller
Domain controller started