このエントリーをはてなブックマークに追加

4.3.3. Cloud compute (Nova)のインストール

Novaはサブコンポーネントがいくつもありそれら全てをあわせてNovaと呼びます。
Computeノードに必要なものだけインストールします。

4.3.3.1. Glanceのダウンロード

Glanceのソースをダウンロードします。
ダウンロードしたバージョンはMasterになっているためバージョンはどちらもEssexにします。

4.3.3.1.1. Glanceのソースをダウンロード

$ sudo git clone git://github.com/openstack/glance /opt/glance

GlanceのバージョンをEssexに固定

$ cd /opt/glance ; sudo git checkout -b essex origin/stable/essex

4.3.3.2. Glanceのインストール

依存関係があるみたいなのでインストールします。データベースなどは必要ないのでインストールだけ行います。
ダウンロードしたGlanceをインストールします。
依存関係でSwiftなどをインストールしようとしますがインストールは別途行えば問題ないのでコメントアウトします。
pipでパッケージの依存関係を解決します。
$ sudo sed -i 's/^-e/#-e/' /opt/glance/tools/pip-requires
$ sudo pip install -r /opt/glance/tools/pip-requires
$ cd /opt/glance && sudo python setup.py install

4.3.3.3. Novaのダウンロード

Novaのソースをダウンロードします。
またNovaAPIを利用するためのクライアントもダウンロードしておきます。
ダウンロードしたバージョンはMasterになっているためバージョンはどちらもEssexにします。

4.3.3.3.1. Novaのソースをダウンロード

$ sudo git clone https://github.com/openstack/nova.git /opt/nova
$ sudo git clone https://github.com/openstack/python-novaclient.git /opt/python-novaclient

4.3.3.3.2. NovaaのバージョンをEssexに固定

$ cd /opt/nova && sudo git checkout -b essex origin/stable/essex
$ cd /opt/python-novaclient ; sudo git checkout -b essex refs/tags/2012.1

4.3.3.4. Novaのインストール

ダウンロードしたNovaとクライアントをインストールします。
pipでパッケージの依存関係を解決します。
$ sudo pip install -r /opt/nova/tools/pip-requires
$ cd /opt/nova && sudo python setup.py install
$ cd /opt/python-novaclient && sudo python setup.py install

4.3.3.5. Novaが利用するユーザ、ディレクトリなどの作成

ソースからインストールする場合はユーザやディレクトリを作成する必要がありますので作成します。
またnovaユーザがlibvirtdを利用するのでグループに追加しておきます。
しかし何故かグループから消える時があるのでそのためにいつもnovaの起動前に再度追加するようにしてます。
$ sudo useradd nova -m -d /var/lib/nova -s /bin/false
$ sudo usermod -G libvirtd nova
$ sudo mkdir /etc/nova
$ sudo mkdir /var/log/nova
$ sudo mkdir /var/lib/nova/instances /var/lib/nova/images /var/lib/nova/keys /var/lib/nova/networks
$ sudo chown nova:nova /var/log/nova /var/lib/nova -R

4.3.3.6. Novaの設定

Controllerノードとほとんど同じ設定ですが以下の二項目だけComputeノードのIPを設定する必要があります。
vncserver_proxyclient_address
vncserver_listen
設定するファイルは nova.conf nova-compute.conf api-paste.ini の3つです。
要件にあったものを設定する必要はありますがまずは動作するものをまずは設定しましょう。
設定項目に関しては後で記述していますので環境にあった設定を模索してみて下さい。
以下の記述は変数にしていますので実際には環境にあったものを設定して下さい。

4.3.3.6.1. nova.confの設定

変数にしてありますので適宜環境にあったものに変更してみて下さい。

変数 実際の設定 備考
$NOVA_CONTOLLER_IP 192.168.10.50 ContollerNodeのIPアドレスを設定します。
$NOVA_COMPUTE_IP 192.168.10.50
ComputeNodeのIPアドレスを設定します。
オールインワンの場合はControllerNodeと同一アドレスを設定します。
$NOVA_CONTOLLER_HOSTNAME stack01 環境構築しているControllerNodeのホスト名を設定します。
$RABBIT_PASS password RabbitMQに設定したパスワードを設定します。
$MYSQL_PASS_NOVA password Novaのデータベースに設定するパスワードを設定します。

変数ベースのもの

$ sudo vi /etc/nova/nova.conf

[DEFAULT]
#verbose=true
allow_admin_api=true
api_paste_config=/etc/nova/api-paste.ini
instances_path=/var/lib/nova/instances
connection_type=libvirt
root_helper=sudo nova-rootwrap
multi_host=true
send_arp_for_ha=true

#behavior of an instance of when the host has been started
start_guests_on_host_boot=true
resume_guests_state_on_host_boot=true

#logging and other administrative
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/var/lock/nova

#network
#don't use quantum
network_manager=nova.network.manager.FlatDHCPManager

#use quantum
#network_manager=nova.network.quantum.manager.QuantumManager
#linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
#quantum_use_dhcp=True

#use openvswitch plugin
#libvirt_ovs_bridge=br-int
#libvirt_vif_type=ethernet
#libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchDriver

#network common
libvirt_use_virtio_for_bridges = true
network_manager=nova.network.manager.FlatDHCPManager
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
public_interface=eth0
flat_interface=eth0
flat_network_bridge=br100
fixed_range=10.0.0.0/8
flat_network_dhcp_start=10.0.0.2
network_size=255
force_dhcp_release = true
flat_injected=false
use_ipv6=false

#vnc
novncproxy_base_url=http://$NOVA_CONTOLLER_IP:6080/vnc_auto.html
xvpvncproxy_base_url=http://$NOVA_CONTOLLER_IP:6081/console
#vnc compute node ip override
vncserver_proxyclient_address=$NOVA_COMPUTE_IP
vncserver_listen=$NOVA_COMPUTE_IP
vnc_keymap=ja

#scheduler
scheduler_driver=nova.scheduler.simple.SimpleScheduler

#object
s3_host=$NOVA_CONTOLLER_HOSTNAME
use_cow_images=yes

#glance
image_service=nova.image.glance.GlanceImageService
glance_api_servers=$NOVA_CONTOLLER_HOSTNAME:9292

#rabbit
rabbit_host=$NOVA_CONTOLLER_HOSTNAME
rabbit_virtual_host=/nova
rabbit_userid=nova
rabbit_password=$RABBIT_PASS

#qpid
#rpc_backend=nova.rpc.impl_qpid
#qpid_hostname=$NOVA_CONTOLLER_HOSTNAME
#qpid_port=5672
#qpid_username=$QPID_USER
#qpid_password=$QPID_PASS

#nova database
sql_connection=mysql://nova:$MYSQL_PASS_NOVA@$NOVA_CONTOLLER_HOSTNAME/nova

#volumes
volume_group=nova-volumes
aoe_eth_dev=eth0
iscsi_ip_prefix=10.
iscsi_helper=tgtadm

#keystone
auth_strategy=keystone
keystone_ec2_url=http://$NOVA_CONTOLLER_HOSTNAME:5000/v2.0/ec2tokens

#memcache
memcached_servers=$NOVA_CONTOLLER_HOSTNAME:11211

上記の変数を置き換えたもの

# cat /etc/nova/nova.conf
[DEFAULT]
#verbose=true
allow_admin_api=true
api_paste_config=/etc/nova/api-paste.ini
instances_path=/var/lib/nova/instances
connection_type=libvirt
root_helper=sudo nova-rootwrap
multi_host=true
send_arp_for_ha=true

#behavior of an instance of when the host has been started
start_guests_on_host_boot=true
resume_guests_state_on_host_boot=true

#logging and other administrative
logdir=/var/log/nova
state_path=/var/lib/nova
lock_path=/var/lock/nova

#network
#don't use quantum
network_manager=nova.network.manager.FlatDHCPManager

#use quantum
#network_manager=nova.network.quantum.manager.QuantumManager
#linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver
#quantum_use_dhcp=True

#use openvswitch plugin
#libvirt_ovs_bridge=br-int
#libvirt_vif_type=ethernet
#libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchDriver

#network common
libvirt_use_virtio_for_bridges = true
network_manager=nova.network.manager.FlatDHCPManager
dhcpbridge_flagfile=/etc/nova/nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge
public_interface=eth0
flat_interface=eth0
flat_network_bridge=br100
fixed_range=10.0.0.0/8
flat_network_dhcp_start=10.0.0.2
network_size=255
force_dhcp_release = true
flat_injected=false
use_ipv6=false

#vnc
novncproxy_base_url=http://192.168.10.60:6080/vnc_auto.html
xvpvncproxy_base_url=http://192.168.10.60:6081/console
#vnc compute node ip override
vncserver_proxyclient_address=192.168.10.60
vncserver_listen=192.168.10.60
vnc_keymap=ja

#scheduler
scheduler_driver=nova.scheduler.simple.SimpleScheduler

#object
s3_host=stack01
use_cow_images=yes

#glance
image_service=nova.image.glance.GlanceImageService
glance_api_servers=stack01:9292

#rabbit
rabbit_host=stack01
rabbit_virtual_host=/nova
rabbit_userid=nova
rabbit_password=password

#qpid
#rpc_backend=nova.rpc.impl_qpid
#qpid_hostname=stack01
#qpid_port=5672
#qpid_username=
#qpid_password=

#nova database
sql_connection=mysql://nova:password@stack01/nova

#volumes
volume_group=nova-volumes
aoe_eth_dev=eth0
iscsi_ip_prefix=10.
iscsi_helper=tgtadm

#keystone
auth_strategy=keystone
keystone_ec2_url=http://stack01:5000/v2.0/ec2tokens

#memcache
memcached_servers=stack01:11211

コンフィグをパッケージでインストールしたものと同じするためにシンボリックリンクを貼っておきます。

$ sudo ln -s /usr/local/bin/nova-dhcpbridge /usr/bin/nova-dhcpbridge

4.3.3.6.2. nova-compute.confの設定

仮想マシンを起動するハイパーバイザー、コンテナを指定します。
ここではKVMを指定します。他にはlxcやxenなども選択できます。
$ sudo vi /etc/nova/nova-compute.conf
[default]
libvirt_type=kvm

4.3.3.6.3. nova-api.confの設定

Keystone連携を行うための設定を行います。
[filter:authtoken]の項目を変更します。

変更前

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = 127.0.0.1
service_port = 5000
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
auth_uri = http://127.0.0.1:5000/
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%

変更後

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
service_protocol = http
service_host = stack01
service_port = 5000
auth_host = stack01
auth_port = 35357
auth_protocol = http
auth_uri = http://stack01:5000/
admin_tenant_name = admin
admin_user = admin
admin_password = password

差分

$ sudo diff /etc/nova_bak/api-paste.ini /etc/nova/api-paste.ini
147c147
< service_host = 127.0.0.1
---
> service_host = stack01
149c149
< auth_host = 127.0.0.1
---
> auth_host = stack01
152,155c152,155
< auth_uri = http://127.0.0.1:5000/
< admin_tenant_name = %SERVICE_TENANT_NAME%
< admin_user = %SERVICE_USER%
< admin_password = %SERVICE_PASSWORD%
---
> auth_uri = http://stack01:5000/
> admin_tenant_name = admin
> admin_user = admin
> admin_password = password

4.3.3.7. プロセスの起動

Computeノードで起動するプロセスはapi,network,computeの3つです。
apiは必要なさそうなのですが。

4.3.3.7.1. 起動スクリプトの用意

api,cert,objectstore,network,scheduler,compute,volume,consoleauth,console,vncproxy
と少し多いですが用意します。

nova-api

$ cat << 'NOVA_API_INIT' | sudo tee /etc/init/nova-api.conf > /dev/null
description "Nova API server"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/
end script

exec su -s /bin/sh -c "exec nova-api --flagfile=/etc/nova/nova.conf" nova
NOVA_API_INIT

nova-network

$ cat << 'NOVA_NETWORK_INIT' | sudo tee /etc/init/nova-network.conf > /dev/null
description "Nova network worker"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]

chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/
end script

exec su -s /bin/sh -c "exec nova-network --flagfile=/etc/nova/nova.conf" nova
NOVA_NETWORK_INIT

nova-compute

$ cat << 'NOVA_COMPUTE_INIT' | sudo tee /etc/init/nova-compute.conf > /dev/null
description "Nova compute worker"
author "Soren Hansen <soren@linux2go.dk>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [016]


chdir /var/run

pre-start script
        mkdir -p /var/run/nova
        chown nova:root /var/run/nova/

        mkdir -p /var/lock/nova
        chown nova:root /var/lock/nova/

        modprobe nbd
end script

exec su -s /bin/sh -c "exec nova-compute --flagfile=/etc/nova/nova.conf --flagfile=/etc/nova/nova-compute.conf" nova
NOVA_COMPUTE_INIT

4.3.3.7.2. SUDOの設定

プロセスを起動するためにnovaのsudo設定が必要ですのでおこなっておきます。

$ cat << 'NOVA_SUDO' | sudo tee /etc/sudoers.d/nova > /dev/null
Defaults:nova !requiretty

nova ALL = (root) NOPASSWD: /usr/local/bin/nova-rootwrap
nova ALL = (root) NOPASSWD: SETENV: NOVACMDS
NOVA_SUDO
$ sudo chmod 440 /etc/sudoers.d/nova

4.3.3.7.3. プロセスの起動

サブコンポーネントが多いためfor文で回して起動します。
あと、libvirtdグループにしつこくnovaを追加しておきます。
$ sudo usermod -G libvirtd nova
$ for i in api network compute
do
  sudo start nova-$i ; sudo restart nova-$i
done

4.3.3.7.4. プロセスの確認

以下のようにプロセスが起動していれば問題ありません。

$ sudo nova-manage service list
Binary           Host                                 Zone             Status     State Updated_At
nova-cert        stack01                              nova             enabled    :-)   2012-04-15 03:16:36
nova-console     stack01                              nova             enabled    :-)   2012-04-15 03:16:36
nova-scheduler   stack01                              nova             enabled    :-)   2012-04-15 03:16:36
nova-consoleauth stack01                              nova             enabled    :-)   2012-04-15 03:16:41
nova-compute     stack01                              nova             enabled    :-)   2012-04-15 02:32:47
nova-compute     stack02                              nova             enabled    :-)   2012-05-15 02:32:47
nova-volume      stack01                              nova             enabled    :-)   2012-04-15 03:16:36
nova-network     stack01                              nova             enabled    :-)   2012-04-15 03:16:41
nova-network     stack02                              nova             enabled    :-)   2012-05-15 03:16:41
ComoputeノードへのNovaのインストールは以上です。
あとはスケジューラの設定で仮想マシンが適切なComputeノードで起動します。