みなさん、こんにちは。コンテンツ・メディア第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として採用しました。
理由
- Ubuntuは標準パッケージでOpenStack環境が用意されている。
- Ubuntu/debianの基本方針として、ディストリビューションのバージョンが変更されない限り、パッケージのバージョンは更新しない方針なので、不意にOpenStack環境がバージョンアップされない。 ※Firefoxなど例外あり
- 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/
ログイン画面が表示されます。
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とは直接関係しませんが、私が働く職場の雰囲気を少し皆さんにお見せしようと思い、チームリーダが写真を取ってくれました。普段こんな雰囲気の中で、仕事をしています。