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する必要があるのでちょっとだけ面倒くさい。