FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

7つのOpenStackコンポーネントと構築手順

みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ担当の藤本佳世です。今回は、OpenStackの続きで、7つのコンポーネントとノードの役割、構築手順についてお話しします。

7つのコンポーネントとノードの役割

前々回の記事でも少し触れましたが、OpenStackは7つの機能から構成されます。

注意:OpenStackのバージョンアップに伴い、コンポーネントの数も更新されます。実際には、16のコンポーネントが存在しますが、今回は、構築で重要となる7つについてお話ししたいと思います。

コンポーネント 役割
Nova 仮想マシンの提供と管理を行う
Keystone ユーザー認証・管理を行う
Horizon Webブラウザ経由で管理・操作できるGUIコンソールを提供する
Glance 仮想イメージの管理を行う
Cinder 仮想マシンが使用するストレージ管理を行う
Neutron 仮想ネットワークの管理を行う
Swift クラウドストレージを提供する

役割ノードの紹介

ノードタイプ 役割
controllernode OpenStack 環境が機能するために必要な管理ソフトウェアサービスを実行
computenode OpenStack 内の仮想マシンインスタンスを実行
storagenode OpenStack環境に必要な全データを保管
networknode Openstack環境に必要なすべての仮想ネットワーキングを実行

コンポーネントとノードの紐づけ

コンポーネントごとのノードの役割を下記の図で表しています。

Nova controllernode computenode
Keystone controllernode
Horizon controllernode
Glance controllernode
Cinder controllernode storagenode
Neutron controllernode computenode networknode

構築にあたって

7つのコンポーネントをどのサーバノードで稼働、同居させるかは、負荷分散や冗長化の観点から、とても大切な設計です。みなさんもご自身の環境、サーバスペックにあった構成を組んでいただければと思いますが、フリューでは、サーバ8台構成でOpenStackを構築しました。また、今まではCentOSを使うことが多かったのですが、OpenStackでは、Ubuntu14.04LTSをホストOSとして採用しました。

理由

  1. Ubuntuは標準パッケージでOpenStack環境が用意されている。
  2. Ubuntu/debianの基本方針として、ディストリビューションのバージョンが変更されない限り、パッケージのバージョンは更新しない方針なので、不意にOpenStack環境がバージョンアップされない。 ※Firefoxなど例外あり
  3. LTSを使用すれば、2年または4年毎くらいでディストリビューションのバージョンアップが可能。 ※サポート期間は5年

構築内容

ホストOS: Ubuntu14.04LTS (8台構成), OpenStackバージョン: Liberty ※Swiftは未検証

コンポーネント ノード
サーバ1 Keystone/Horizon/Nova/Cinder/Glance/Neutron ※1 MySQL/Memcached/RabbitMQ ※2 Heartbeat controllernode
サーバ2 Keystone/Horizon/Nova/Cinder/Glance/Neutron ※1 MySQL/Memcached/RabbitMQ ※2 Heartbeat controllernode
サーバ3 Nova/Cinder/Neutron computenode/storagenode
サーバ4 Nova/Cinder/Neutron computenode/storagenode
サーバ5 Nova/Cinder/Neutron computenode/storagenode
サーバ6 Nova/Cinder/Neutron computenode/storagenode
サーバ7 Neutron networknode
サーバ8 Neutron networknode

※1 関連サービスのインストールについて

OpenStackの各コンポーネントが必要とするサービスをインストールする必要があります。

MySQL Keystone/Horizon/Nava/Glanceの管理情報を保存するデータベースに使用
Memcached Horizonでのアクセス時にcookieやセッション情報の一時保存に使用
RabbitMQ 各サービス間のメッセージのやり取りに使用

※2 構成上必要という認識から追加

Heartbeat MySQL(HA構成)の死活監視に使用

関連サービスとHeartbeatのインストール

フリューでは、管理情報を保存するMySQLを稼働させるサーバを2台のレプリケーション構成にし、Heartbeatで仮想IPを振り、Keystone 等のプロセスからは仮想IPを参照するようにしました。これにより、プロセスが同じデータを参照できるので、単一点障害になりにくくなります。

MySQL/Memcached/RabbitMQ/Heartbeatインストール
apt-get install mysql-server-5.6 heartbeat memcached rabbitmq-server heartbeat
MySQL設定ファイル(例)
vim /etc/mysql/my.cnf

# binary logging is required for replication
log-bin=mysql-bin
server-id       = 1

レプリケーション設定や最適化パラメータが設定などに必要です。

Memcached設定ファイル(例)
/etc/memcached.conf 

#35行目
-l 0.0.0.0
service memcached start
RabbitMQの設定

各サービスからMQを使用する為のユーザ/パスワードを登録する

rabbitmqctl add_user <ユーザ> <パスワード>
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
service rabbitmq-server start
Heartbeat設定ファイル
/etc/ha.d/ha.cf
/etc/ha.d/authkeys
/etc/ha.d/logd.cf
service heartbeat start

OpenStackコンポーネントインストール

すべての手順を書くと、とっても長くなってしまうので、ポイントをまとめて説明していきます。

Keystone(ユーザー認証・管理を行う)

インストール
apt-get install keystone python-openstackclient apache2 libapache2-mod-wsgi python-pymysql python-mysqldb
Keystone用のユーザーとデータベースをMySQLに登録
mysql> create database keystone;

Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on keystone.* to keystone@'localhost' identified by 'パスワード';

Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on keystone.* to keystone@'%' identified by 'パスワード';

Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)
mysql> exit
Keystoneの設定(例)
vim /etc/keystone/keystone.conf

# 12行目:変更
admin_token = admintoken

# 497行目:変更追記 ( MySQL に登録したもの )
connection = mysql://keystone:keystonepass@192.168.XX.XX/keystone

# 1905行目:コメント解除
provider = keystone.token.providers.pki.Provider
keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
service keystone start
テナント作成

テナントと呼ばれる、OpenStack ユーザーのグループを作成します。※adminとserviceを作成

adminテナント

keystone tenant-create --name admin --description "Admin Tenant" --enabled true

serviceテナント

keystone tenant-create --name service --description "Service Tenant" --enabled true
Keystoneに各コンポーネント用のユーザを登録

adminとserviceテナントを作成したので、各コンポーネントのユーザを所属を指定して登録します。

adminユーザの作成(adminテナント所属)

keystone user-create --tenant admin --name admin --pass adminpassword --enabled true
# admin ユーザーを adminロール に加える
keystone user-role-add --user admin --tenant admin --role admin

Glanceユーザの作成(service テナント所属)

keystone user-create --tenant service --name glance --pass servicepassword --enabled true
# glance ユーザーを adminロール に加える
keystone user-role-add --user glance --tenant service --role admin

Novaユーザの作成(serviceテナント所属)

keystone user-create --tenant service --name nova --pass servicepassword --enabled true
# nova ユーザーを adminロール に加える
keystone user-role-add --user nova --tenant service --role admin

Cinderユーザの作成(serviceテナント所属)

keystone user-create --tenant service --name cinder --pass servicepassword --enabled true
# cinder ユーザーを adminロール に加える
keystone user-role-add --user cinder --tenant service --role admin

Neutronユーザの作成(serviceテナント所属)

keystone user-create --tenant service --name neutron --pass servicepassword --enabled true
# cinder ユーザーを adminロール に加える
keystone user-role-add --user neutron --tenant service --role admin
サービスエントリの作成

次に、ユーザーを認証するために、各 コンポーネントのサービスユーザーを作成する必要があります。

Keystone用のサービスエントリ作成
keystone service-create --name=keystone --type=identity --description="Keystone Identity Service"

Glance用のサービスエントリ作成
keystone service-create --name=glance --type=image --description="Glance Image Service"

Nova用のサービスエントリ作成
keystone service-create --name=nova --type=compute --description="Nova Compute Service"

Cinder用のサービスエントリ作成
keystone service-create --name=cinder --type=compute --description="Cinder Compute Service"

Neutron用のサービスエントリ作成
keystone service-create --name=neutron --type=compute --description="neutron Compute Service"

 Glance(仮想イメージの管理を行う)

インストール
apt-get install glance
Glance用のユーザとデータベースをMySQLに登録
mysql> create database glance;

Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on glance.* to glance@'localhost' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> grant all privileges on glance.* to glance@'%' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> flush privileges; 

Query OK, 0 rows affected (0.00 sec) 
mysql> exit
基本設定ファイル(例)
vim /etc/glance/glance-api.conf  (同じ vim /etc/glance/glance-registry.conf)

[DEFAULT]
bind_host = 0.0.0.0
notification_driver = noop

[glance_store]
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

[database]
# MySQL 接続情報
connection = mysql+pymysql://glance:パスワード@10.xx.xx.xx/glance

# keystone 認証情報
[keystone_authtoken]
auth_uri = http://10.xx.xx.xx:5000
auth_url = http://10.xx.xx.xx:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = servicepassword

[paste_deploy]
flavor = keystone
起動
service glance-api start
service glance-registry start

Nova(仮想マシンの提供と管理を行う)

インストール

controllernodeの場合

apt-get install nova-api nova-cert nova-conductor  nova-consoleauth  nova-objectstore nova-scheduler nova-novncproxy  python-novaclient

computenodeの場合

apt-get install qemu-kvm  libvirt-bin virtinst  bridge-utils  nova-compute-kvm nova-api-metadata python-novaclient nova-novncproxy
Nova用のユーザとデータベースをMySQLに登録
mysql> create database nova;

Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on nova.* to nova@'localhost' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> grant all privileges on nova.* to nova@'%' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> flush privileges; 

Query OK, 0 rows affected (0.00 sec) 
mysql> exit
基本設定ファイル(例)
vim /etc/nova/nova.conf
 
[DEFAULT]
# ホストのIP
my_ip = 10.xx.xx.xx

# IPv6が不要な時のみ記述
use_ipv6 = false
state_path = /var/lib/nova
enabled_apis = ec2,osapi_compute,metadata
osapi_compute_listen = 0.0.0.0
osapi_compute_listen_port = 8774
rootwrap_config = /etc/nova/rootwrap.conf
api_paste_config = /etc/nova/api-paste.ini
auth_strategy = keystone
log_dir = /var/log/nova

# Memcached サーバーのホスト名とIP
memcached_servers = 10.xx.xx.xx:11211
scheduler_driver = nova.scheduler.filter_scheduler.FilterScheduler
notification_driver = nova.openstack.common.notifier.rpc_notifier
rpc_backend = rabbit

# VNC を有効にする
[vnc]
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://10.xx.xx.xx:6080/vnc_auto.html

# Glance サーバーを指定
[glance]
host = 10.xx.xx.xx
port = 9292
protocol = http
[oslo_concurrency]
lock_path = /var/lib/nova/tmp

# RabbitMQ サーバー接続情報
[oslo_messaging_rabbit]
rabbit_host = 10.xx.xx.xx
rabbit_port = 5672
# RabbitMQ サーバー認証ID
rabbit_userid = openstack
# RabbitMQ サーバー認証IDのパスワード
rabbit_password = パスワード

# MySQL サーバー接続情報
[database]
connection = mysql+pymysql://nova:パスワード@10.xx.xx.xx/nova

# Keystone サーバー接続情報
[keystone_authtoken]
# Keystone サーバーのホスト名またはIP
auth_uri = http://10.xx.xx.xx:5000
auth_url = http://10.xx.xx.xx:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = パスワード
起動

controllernodeはこちら

service nova-api start
service nova-conductor start
service nova-scheduler start
service nova-objectstore start
service nova-cert start
service nova-consoleauth start
service nova-novncproxy start

computenodeはこちら

service nova-api-metadata start
service nova-compute start

Horizon(Webブラウザ経由で管理・操作できるGUIコンソールを提供する)

インストール
apt-get install openstack-dashboard
ダッシュボードの設定(例)
vim /etc/openstack-dashboard/local_settings.py

# 16行目:自コメント解除して追記
WEBROOT='/horizon/'

# 30行目:コメント解除して自ホストを追記 
ALLOWED_HOSTS = ['*'] 

# 139行目:自ホストに変更 
OPENSTACK_HOST = "10.xx.xx.xx
起動
service apache2 start

ブラウザで以下のurlにアクセスしてみます。 http://(サーバのホスト名)/horizon/

ログイン画面が表示されます。

openstack1

Cinder(仮想マシンが使用するストレージ管理を行う)

インストール

controllernodeの場合

apt-get install cinder-api cinder-scheduler python-cinderclient

storagenodeの場合

apt-get install cinder-volume python-mysqldb
 Cinder用のユーザとデータベースをmysqlに登録
mysql> create database cinder;

Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on cinder.* to cinder@'localhost' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> grant all privileges on cinder.* to cinder@'%' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> flush privileges; 

Query OK, 0 rows affected (0.00 sec) 
mysql> exit
基本設定ファイル(例)
vim /etc/cinder/cinder.conf  

[DEFAULT]
#ホストのIPアドレス

my_ip = 10.xx.xx.xx
state_path = /var/lib/cinder
rootwrap_config = /etc/cinder/rootwrap.conf
api_paste_confg = /etc/cinder/api-paste.ini
enable_v1_api = True
enable_v2_api = True
auth_strategy = keystone
rpc_backend = rabbit
notification_driver = cinder.openstack.common.notifier.rpc_notifier
scheduler_driver = cinder.scheduler.filter_scheduler.FilterScheduler

#MySQLの接続情報
[database]
connection = mysql+pymysql://cinder:パスワード@10.xx.xx.xx/cinder

#Keystone 認証情報
[keystone_authtoken]
auth_uri = http://10.xx.xx.xx:5000
auth_url = http://10.xx.xx.xx:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = パスワード

#RabbitMQ 認証情報
[oslo_messaging_rabbit]
rabbit_host = 10.xx.xx.xx
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = パスワード
起動
service cinder-api start
service cinder-scheduler start

Neutron(仮想ネットワークの管理を行う)

インストール

controllernodeの場合

apt-get install neutron-server neutron-plugin-ml2 python-neutronclient

computenodeの場合

apt-get install neutron-common neutron-plugin-ml2 neutron-plugin-openvswitch neutron-plugin-openvswitch-agent

networknodeの場合

apt-get install neutron-plugin-ml2 neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent python-neutronclient neutron-plugin-openvswitch neutron-plugin-openvswitch-agent
Neutron用のユーザとデータベースをMySQLに登録
mysql> create database neutron;

Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on neutron.* to neutron@'localhost' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> grant all privileges on neutron.* to neutron@'%' identified by 'パスワード'; 

Query OK, 0 rows affected (0.00 sec) 
mysql> flush privileges; 

Query OK, 0 rows affected (0.00 sec) 
mysql> exit
基本設定ファイル(例)

controllernode:

/etc/neutron/neutron.conf

今までのcinder.confと同じように、各サービスの認証情報を記述してきます。内容はほぼ同じのなので割愛します。

vim /etc/neutron/plugins/ml2/ml2_conf.ini

# 7行目:追記 
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vlan,gre,vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security

# 119行目:コメント解除 & 追記
enable_security_group = True
firewall_driver =  neutron.agent.linux.iptables_firewall.IptablessFirewallDriver

# 最終行:コメント解除
enable_ipset = True

computenode:

/etc/neutron/neutron.conf
/etc/neutron/plugins/ml2/ml2_conf.ini

networknode:

/etc/neutron/neutron.conf
/etc/neutron/plugins/ml2/ml2_conf.ini
/etc/neutron/l2_agent.ini 
/etc/neutron/dnsmasq-neutron.conf
vim /etc/neutron/metadata_agent.ini

# 6,7行目:コメントにする
#auth_url = http://localhost:5000/v2.0
#auth_region = RegionOne

# 12-14行目:コメントにして、その下に追記
#admin_tenant_name = %SERVICE_TENANT_NAME%
#admin_user = %SERVICE_USER%
#admin_password = %SERVICE_PASSWORD%
auth_uri = http://10.xx.xx.xx:5000
auth_url = http://10.xx.xx.xx:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = パスワード

# 28行目:コメント解除し Nova API サーバー指定
nova_metadata_ip = 10.xx.xx.xx

# 31行目:コメント解除
nova_metadata_port = 8775

# 51行目:コメント解除し 任意のシークレットキーを指定
metadata_proxy_shared_secret = metadata_secret

vim /etc/neutron/dhcp_agent.ini

# 17行目:追記
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

# 31行目:コメント解除
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

ファイルが多いので、すべての内容を記述するのはやめておきます。

起動

controllernode:

service neutron-server start

computenode:

service openvswitch-switch start
service neutron-plugin-openvswitch-agent start

networknode:

service openvswitch-switch start
service neutron-plugin-openvswitch-agent start
service neutron-l3-agent start
service neutron-dhcp-agent start
service neutron-metadata-agent start

構築完了

構築については以上となります。

感想

実際にOpenStackを使いこなすために、構築設計や各コンポーネントの設定などで約1~2か月かかりました。みなさんもご自身の環境にあった構成を組む際に、参考にしていただければと思います。

次回のブログでは、Neutronネットワーク設定についてお話しする予定です。ここが一番苦労しました。単一点障害を回避するために、「Open vSwitchでVRRP(L3HA)を使った高可用性構成」を構築しました。また、OSイメージ登録やインスタンス作成、ボリューム機能、セキュリティグループ設定などなど、これから続けてOpenStack関連のブログを掲載する予定ですので、楽しみにしていて下さい。

最後に

今回のブログはとても長くなってしまい、最後まで読んでくださってありがとうございます。OpenStackとは直接関係しませんが、私が働く職場の雰囲気を少し皆さんにお見せしようと思い、チームリーダが写真を取ってくれました。普段こんな雰囲気の中で、仕事をしています。

参考

Openstack公式ドキュメント