OpenStackの仮想ネットワーク管理機能「Quantum」の基本的な設定 2ページ

QuantumのインストールとLinuxBridgeを使った環境構築

 それでは、Quantumのインストール手順と各種設定方法について紹介していこう。以下ではOS環境としてRed Hat Enterprise Linux互換のCentOS 6.3を利用し、またFedoraプロジェクトが公開しているパッケージリポジトリ「EPEL(Extra Packages for Enterprise Linux)」を利用してOpenStackのパッケージを入手している。EPELについてはさくらの専用サーバとOpenStackで作るプライベートクラウド記事でその導入方法や使い方を解説しているので、詳しくはそちらを参照してほしい。

利用するプラグインを選択する

 Quantumを利用する際、まずはどのプラグインを利用するかを決めなければならない。EPELではQuantum本体とプラグインはそれぞれ別のパッケージとして配布されており、使用するプラグインを含むパッケージをインストールする必要がある。EPELで提供されているプラグインパッケージは表2の7つだ。

表2 EPELで提供されているプラグインパッケージ
パッケージ名仮想ネットワーク構築に利用するバックエンド
openstack-quantum-ciscoシスコ製ルーター
openstack-quantum-linuxbridgeLinux標準のブリッジ機能やVLAN
openstack-quantum-metapluginなし(複数のプラグインを利用する際に使用)
openstack-quantum-necOpenFlowコントローラ
openstack-quantum-niciranicira
openstack-quantum-openvswitchOpen vSwitch
openstack-quantum-ryuRyu

 このうち、openstack-quantum-ciscoは専用のハードウェアが必要であり、またopenstack-quantum-necやopenstack-quantum-nicira、openstack-quantum-openvswitch、openstack-quantum-ryuは別途対応するソフトウェアやシステムが必要となる。そのため、今回はLinuxのブリッジ機能やVLANを使って仮想ネットワークを構築できるopenstack-quantum-linuxbridgeを使用する例を紹介する。

Quantum関連パッケージのインストール

 EPELにおいて、Quantumの本体は「openstack-quantum」というパッケージで提供されている。制御ノードおよびネットワークノードにこれらのパッケージをインストールしておく。

# yum --enablerepo=epel install openstack-quantum

 また、ネットワークノードおよび計算ノードにはopenstack-quantum-linuxbridgeパッケージをインストールしておく。

# yum --enablerepo=epel install openstack-quantum-linuxbridge

 なお、今回使用したopenstack-quantumパッケージのバージョンは下記のとおりである。

# rpm -q openstack-quantum
openstack-quantum-2012.2.1-1.el6.noarch

サービスの作成

 ほかのOpenStackサービスと同様、Quantum関連サービスを稼働させているホストの情報などをKeystoneのデータベースに登録しておく必要がある。今回はKeystoneを稼働させているホストで下記のように実行することで登録を実行した。

QUANTUM_HOST=<Quantum Serverをインストールしたホスト名>
REGION=<登録を行うリージョン名>
export SERVICE_TOKEN=<keystoneで設定したアクセストークン>
export SERVICE_ENDPOINT=http://localhost:35357/v2.0/

keystone service-create --name=quantum --type=network --description="Quantum Network Service"
SERVICE_ID=`keystone service-list | grep quantum | awk '{print $2}'`
keystone endpoint-create --region $REGION --service_id=$SERVICE_ID --publicurl "http://$QUANTUM_HOST:9696/" --adminurl "http://$QUANTUM_HOST:9696/" --internalurl "http://$QUANTUM_HOST:9696/"

ユーザーの作成

 次に、QuantumがKeystoneへのアクセスに使用するquantumユーザーを作成する。Keystoneを稼働させているホスト上で下記のコマンドを実行することで作成を行う。

export SERVICE_TOKEN=<keystoneで設定したアクセストークン>
export SERVICE_ENDPOINT=http://localhost:35357/v2.0/
PASSWORD=作成するユーザーのパスワード

TENANT_ID=`keystone tenant-list | grep service | awk '{print $2}'`
ADMIN_ROLE=`keystone role-list | grep admin | awk '{print $2}'`
keystone user-create --tenant-id $TENANT_ID --name quantum --pass $PASSWORD
USER_ID=`keystone user-list | grep quantum | awk '{print $2}'`
keystone user-role-add --user-id $USER_ID --tenant-id $TENANT_ID --role-id $ADMIN_ROLE

制御ノードの設定:データベースの作成と設定ファイルの編集

 Quantumの設定は、各ホスト上の/etc/quantumディレクトリ以下に配置された設定ファイルに記述されている。まず制御ノードでは、quantum.confおよびapi-paste.iniファイルの編集が必要だ。また、データベースの設定も必要となる。データベースとしてMySQLを利用している場合、データベースの設定にはquantum-server-setupコマンドが利用できる。

 quantum-server-setupコマンドはデータベースおよびQuantumがデータベースへのアクセスに使用するユーザーの作成を行う。デフォルトでは「quantum」というユーザーが作成される。このときパスワードは「-q」オプションで指定できる。

# quantum-server-setup -q <設定するパスワード>
Please select a plugin from: linuxbridge openvswitch
Choice:
linuxbridge  ←使用するプラグインを指定する
Quantum plugin: linuxbridge
Plugin: linuxbridge => Database: quantum_linux_bridge
Please enter the password for the 'root' MySQL user:  ←MySQLのrootパスワードを入力する
Verified connectivity to MySQL.
Please enter network device for VLAN trunking:
eth0  ←内部ネットワークに接続されているネットワークインターフェイスを指定する
Would you like to update the nova configuration files? (y/n):
n  ←自動的にnovaの設定ファイルを更新するかを指定する
Complete!

 quantum-server-setupコマンドはデータベースの設定に加えて設定ファイルの変更も行うため、実行後は必ず設定ファイルを確認しておこう。また、quantum-server-setupコマンドはコマンドを実行したホスト上でMySQLサーバーが稼働していることを前提としている。別のホストでMySQLサーバーを実行している場合、そのホスト上でこのコマンドを実行する必要がある。

 続いて、Quantumの全体に関連する設定が記述されたquantum.confを編集する。まず必要なのは、使用するプラグインを指定する「core_plugin」項目だ。今回はlinuxbridgeプラグインを使用するので、次のように指定する。

core_plugin = quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2

 認証方法を指定する「auth_strategy」項目には「keystone」を指定しておく。

auth_strategy = keystone

 また、Quantumでは「Network Namespace」という機能を利用することで仮想ネットワークにおけるIPアドレスの重複を許すことができるが、CentOS 6.3系では現状この機能がサポートされていないため、「allow_overlapping_ips」項目にFalseを指定してこれを無効化しておく。

allow_overlapping_ips = False

 使用するメッセージングサービスおよびメッセージングサーバーの稼働ホスト、認証情報なども忘れずに設定しておく。たとえばRabbitMQを利用する場合、次の設定項目を追加しておく。

rpc_backend = quantum.openstack.common.rpc.impl_kombu
rabbit_host = <RabbitMQサーバーを稼働させているホスト名>
rabbit_port = <RabbitMQの稼働ポート>
rabbit_userid = <認証に使用するユーザー名>
rabbit_password = <認証に使用するパスワード>
rabbit_virtual_host = <使用するバーチャルホスト名>

 これらを反映させた設定ファイルは以下のようになる。太字の部分が編集および確認が必要な項目だ。

[DEFAULT]
# Show more verbose log output (sets INFO log level output)
verbose = True

# Show debugging output in logs (sets DEBUG log level output)
debug = False

# Address to bind the API server
bind_host = 0.0.0.0

# Port the bind the API server to
bind_port = 9696

# Path to the extensions.  Note that this can be a colon-separated list of
# paths.  For example:
# api_extensions_path = extensions:/path/to/more/extensions:/even/more/extensions
# The __path__ of quantum.extensions is appended to this, so if your
# extensions are in there you don't need to specify them here
# api_extensions_path =

# Quantum plugin provider module
core_plugin = quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2

# Paste configuration file
api_paste_config = api-paste.ini

# The strategy to be used for auth.
# Supported values are 'keystone'(default), 'noauth'.
auth_strategy = keystone

# Base MAC address. The first 3 octets will remain unchanged. If the
# 4h octet is not 00, it will also used. The others will be
# randomly generated.
# 3 octet
# base_mac = fa:16:3e:00:00:00
# 4 octet
# base_mac = fa:16:3e:4f:00:00

# Maximum amount of retries to generate a unique MAC address
# mac_generation_retries = 16

# DHCP Lease duration (in seconds)
# dhcp_lease_duration = 120

# Enable or disable bulk create/update/delete operations
# allow_bulk = True
# Enable or disable overlapping IPs for subnets
# Attention: the following parameter MUST be set to False if Quantum is
# being used in conjunction with nova security groups and/or metadata service.
allow_overlapping_ips = False

# RPC configuration options. Defined in rpc __init__
# The messaging module to use, defaults to kombu.
rpc_backend = quantum.openstack.common.rpc.impl_kombu
# Size of RPC thread pool
# rpc_thread_pool_size = 64,
# Size of RPC connection pool
# rpc_conn_pool_size = 30
# Seconds to wait for a response from call or multicall
# rpc_response_timeout = 60
# Seconds to wait before a cast expires (TTL). Only supported by impl_zmq.
# rpc_cast_timeout = 30
# Modules of exceptions that are permitted to be recreated
# upon receiving exception data from an rpc call.
# allowed_rpc_exception_modules = quantum.openstack.common.exception, nova.exception
# AMQP exchange to connect to if using RabbitMQ or QPID
control_exchange = quantum

# If passed, use a fake RabbitMQ provider
# fake_rabbit = False

# Configuration options if sending notifications via kombu rpc (these are
# the defaults)
# SSL version to use (valid only if SSL enabled)
# kombu_ssl_version =
# SSL key file (valid only if SSL enabled)
# kombu_ssl_keyfile =
# SSL cert file (valid only if SSL enabled)
# kombu_ssl_certfile =
# SSL certification authority file (valid only if SSL enabled)'
# kombu_ssl_ca_certs =
# IP address of the RabbitMQ installation
rabbit_host = 192.168.100.20
# Password of the RabbitMQ server
rabbit_password = password
# Port where RabbitMQ server is running/listening
rabbit_port = 5672
# User ID used for RabbitMQ connections
rabbit_userid = nova
# Location of a virtual RabbitMQ installation.
rabbit_virtual_host = /nova
# Maximum retries with trying to connect to RabbitMQ
# (the default of 0 implies an infinite retry count)
# rabbit_max_retries = 0
# RabbitMQ connection retry interval
# rabbit_retry_interval = 1

# QPID
# rpc_backend=quantum.openstack.common.rpc.impl_qpid
# Qpid broker hostname
# qpid_hostname = localhost
# Qpid broker port
# qpid_port = 5672
# Username for qpid connection
# qpid_username = ''
# Password for qpid connection
# qpid_password = ''
# Space separated list of SASL mechanisms to use for auth
# qpid_sasl_mechanisms = ''
# Seconds between connection keepalive heartbeats
# qpid_heartbeat = 60
# Transport to use, either 'tcp' or 'ssl'
# qpid_protocol = tcp
# Disable Nagle algorithm
# qpid_tcp_nodelay = True

# ZMQ
# rpc_backend=quantum.openstack.common.rpc.impl_zmq
# ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP.
# The "host" option should point or resolve to this address.
# rpc_zmq_bind_address = *

# ============ Notification System Options =====================

# Notifications can be sent when network/subnet/port are create, updated or deleted.
# There are four methods of sending notifications, logging (via the
# log_file directive), rpc (via a message queue),
# noop (no notifications sent, the default) or list of them

# Defined in notifier api
notification_driver = quantum.openstack.common.notifier.list_notifier
# default_notification_level = INFO
# myhost = myhost.com
# default_publisher_id = $myhost
# Defined in rabbit_notifier for rpc way
# notification_topics = notifications

# Defined in list_notifier
list_notifier_drivers = quantum.openstack.common.notifier.rabbit_notifier

[QUOTAS]
# resource name(s) that are supported in quota features
# quota_items = network,subnet,port

# default number of resource allowed per tenant, minus for unlimited
# default_quota = -1

# number of networks allowed per tenant, and minus means unlimited
# quota_network = 10

# number of subnets allowed per tenant, and minus means unlimited
# quota_subnet = 10

# number of ports allowed per tenant, and minus means unlimited
# quota_port = 50

# default driver to use for quota checks
# quota_driver = quantum.quota.ConfDriver

 api-paste.iniファイルにはkeystoneへのアクセスに使用する情報を記述しておく。具体的には、以下の項目について設定が必要だ。

auth_host = <keystoneが稼働しているホスト名>
auth_port = <keystoneが稼働しているポート番号。デフォルトは35357>
auth_protocol = <keystoneへのアクセスに利用するプロトコル。デフォルトはhttp>
admin_tenant_name = <管理用テナント名>
admin_user = <使用するユーザー名>
admin_password = <使用するパスワード>

 これらを反映させた設定ファイルの例は以下のようになる。

[composite:quantum]
use = egg:Paste#urlmap
/: quantumversions
/v2.0: quantumapi_v2_0

[composite:quantumapi_v2_0]
use = call:quantum.auth:pipeline_factory
noauth = extensions quantumapiapp_v2_0
keystone = authtoken keystonecontext extensions quantumapiapp_v2_0

[filter:keystonecontext]
paste.filter_factory = quantum.auth:QuantumKeystoneContext.factory

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_host = 192.168.100.20
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = quantum
admin_password = quantum

[filter:extensions]
paste.filter_factory = quantum.extensions.extensions:plugin_aware_extension_middleware_factory

[app:quantumversions]
paste.app_factory = quantum.api.versions:Versions.factory

[app:quantumapiapp_v2_0]
paste.app_factory = quantum.api.v2.router:APIRouter.factory

 以上の設定が完了したら、最後にserviceコマンドでquantum-serverを起動させておく。

# service quantum-server start

 なお、quantum-serverはTCPの9696番ポートで待ち受けを行う。ほかのノードからこのポートにアクセスできるようファイアウォールを設定しておこう。