5. OpenStackのデプロイ
5.1 OpenStack Charmのデプロイ
juju add-machine
コマンドによるJujuマシンのデプロイが終わったら、juju deploy
コマンドでアプリケーションをデプロイメントします。
juju deploy
コマンドはオプションを指定しない場合はデフォルトの構成で未使用のノードの物理サーバー上にデプロイします。
今回は物理サーバー3台で複数のOpenStackのコンポーネントをインストールするため、コンテナーと物理サーバー上にデプロイします。
Jujuで特定のノードにアプリケーションをデプロイしたりユニットを追加してスケールする場合、--toオプションを使ってデプロイ先を指定することができます。
--toオプションの後にJujuマシンの番号を指定したり、lxd:Xのように指定してコンテナーにデプロイしたり、MAASと連携している場合はjuju deploy percona-cluster --to host.maas
のように指定することもできます。
本例ではNova ComputeとNeutron Gatewayを物理サーバーに構築し、そのほかのコンポーネントは各サーバーに分散するようにコンテナーにデプロイします。
一つのコマンドを実行するごとに、juju status
コマンドやJuju GUIでデプロイの進捗を確認してください。
さらにもう一つ端末を実行してjuju debug-log
コマンドを実行するともう少し詳細なデプロイの状況を確認できます。
% juju deploy --config openstack.yaml cs:xenial/neutron-gateway-238 --to 1
% juju deploy cs:xenial/rabbitmq-server-65 --to lxd:1 &&
% juju add-unit rabbitmq-server --to lxd:2
% juju deploy --config openstack.yaml cs:xenial/nova-cloud-controller-300 --to lxd:1
% juju deploy --config openstack.yaml percona-cluster --to lxd:1 &&
% juju add-unit -n1 percona-cluster --to lxd:2 && juju config percona-cluster min-cluster-size=2
% juju deploy --config openstack.yaml cs:xenial/glance-259 --to lxd:1
% juju deploy --config openstack.yaml cs:xenial/keystone-268 --to lxd:2
% juju deploy --config openstack.yaml cs:xenial/openstack-dashboard-250 --to lxd:1
% juju deploy --config openstack.yaml cs:xenial/neutron-openvswitch
% juju deploy --config openstack.yaml cs:xenial/neutron-api-252 --to lxd:2
デプロイに利用しているopenstack.yamlは次のような内容のものを用意します。 設定できるパラメーターはjujucharms.comでCharmを検索し、config.yamlを開くと確認できます。
percona-cluster:
max-connections: 10000
ha-bindiface: eth0
vip_iface: eth0
root-password: password
keystone:
openstack-origin: "cloud:xenial-pike"
admin-password: password
admin-token: ubuntuopenstack
preferred-api-version: 2
nova-cloud-controller:
openstack-origin: "cloud:xenial-pike"
network-manager: Neutron
console-access-protocol: "spice"
nova-compute:
openstack-origin: "cloud:xenial-pike"
enable-live-migration: yes
enable-resize: yes
nova-compute-lxd:
openstack-origin: "cloud:xenial-pike"
enable-live-migration: yes
enable-resize: yes
virt-type: lxd
nova-compute-kvm:
openstack-origin: "cloud:xenial-pike"
enable-live-migration: yes
enable-resize: yes
virt-type: kvm
neutron-api:
openstack-origin: "cloud:xenial-pike"
enable-dvr: no
flat-network-providers: physnet1
l2-population: no
network-device-mtu: 1400
neutron-plugin: ovs
neutron-security-groups: yes
overlay-network-type: vxlan
neutron-gateway:
openstack-origin: "cloud:xenial-pike"
bridge-mappings: physnet1:br-ex
data-port: br-ex:eth1
instance-mtu: 1400
plugin: ovs
neutron-openvswitch:
bridge-mappings: physnet1:br-ex
data-port: br-ex:eth1
flat-network-providers: physnet1
glance:
openstack-origin: "cloud:xenial-pike"
openstack-dashboard:
openstack-origin: "cloud:xenial-pike"
webroot: /
ubuntu-theme: "yes"
openstack.yaml記述のポイントは、data-portで指定している物理NICのデバイス名です。 本例ではeth1を指定していますが、MAASのバージョンやサーバーハードウェアによって違うデバイス名で認識されることがあります。 eth1となっている部分を例えばem2とかeno2のように、環境に合わせて設定してください。
openstack-originで指定するのはOpenStackのバージョンです。 本例ではPikeバージョンのインストールを想定するので"cloud:xenial-pike"を指定しています。
network-device-mtuはNeutronネットワーク側に設定するMTUの値であり、instance-mtuはインスタンスのNICに設定するMTUの値です。
5.2 Nova-KVM Charmのデプロイ
次のコマンドでKVMモードのComputeをデプロイします。Nova-KVMかNova-LXDのいずれかが必要です。共存も可能です。
% juju deploy --config openstack.yaml nova-compute nova-compute-kvm --to 3
5.3 Nova-LXD Charmのデプロイ
次のコマンドでLXDモードのComputeをデプロイします。Nova-LXDかNova-KVMのいずれかが必要です。共存も可能です。
% juju deploy --config openstack.yaml nova-compute nova-compute-lxd --to 4
% juju deploy lxd && juju config lxd block-devices=/dev/sdb storage-type=lvm
5.4 OpenStack Charmのリレーションの実行
juju deploy
コマンドを実行した後はアプリケーションの設定やアプリケーション間の接続を行うために、
juju add-relation
コマンドを実行する必要があります。
一つのコマンドを実行するごとに、juju status
コマンドやJuju GUIでデプロイの進捗を確認してください。
さらにもう一つ端末を実行してjuju debug-log
コマンドを実行するともう少し詳細なデプロイの状況を確認できます。
% juju add-relation keystone percona-cluster
% juju add-relation glance percona-cluster
% juju add-relation nova-cloud-controller percona-cluster
% juju add-relation neutron-api percona-cluster
% juju add-relation neutron-api rabbitmq-server
% juju add-relation neutron-gateway:amqp rabbitmq-server:amqp
% juju add-relation neutron-gateway:amqp-nova rabbitmq-server:amqp
% juju add-relation neutron-openvswitch rabbitmq-server
% juju add-relation nova-cloud-controller rabbitmq-server
% juju add-relation glance keystone
% juju add-relation neutron-api keystone
% juju add-relation nova-cloud-controller keystone
% juju add-relation openstack-dashboard keystone
% juju add-relation nova-cloud-controller glance
% juju add-relation neutron-api nova-cloud-controller
% juju add-relation neutron-api neutron-gateway
% juju add-relation neutron-api neutron-openvswitch
% juju add-relation neutron-gateway nova-cloud-controller
5.5 Nova-KVM Charmのリレーションの実行
前述の手順でNova-KVMをデプロイした場合は、リレーションの実行を行います。 サービス同士の関連付けとインストール、設定などが行われます。
juju add-relation nova-compute-kvm:amqp rabbitmq-server:amqp
juju add-relation nova-compute-kvm glance
juju add-relation nova-cloud-controller nova-compute-kvm
juju add-relation neutron-openvswitch nova-compute-kvm
5.6 Nova-LXD Charmのリレーションの実行
前述の手順でNova-LXDをデプロイした場合は、リレーションの実行を行います。 サービス同士の関連付けとインストール、設定などが行われます。
% juju add-relation lxd nova-compute-lxd
% juju add-relation nova-compute-lxd:amqp rabbitmq-server:amqp
% juju add-relation nova-compute-lxd glance
% juju add-relation nova-cloud-controller nova-compute-lxd
% juju add-relation neutron-openvswitch nova-compute-lxd
5.7 OpenStack Dashboardへのアクセス
ここまでの作業が一通り完了すると、OpenStack環境にDashboardを使ってアクセスできます。 adminユーザーがデフォルトで作られていますので、そのユーザーでログインします。 パスワードはコンポーネントのデプロイ時に利用した、openstack.yamlのkeystoneのadmin-passwordに設定した値を入力します。
OpenStack dashboardにアクセスできます。
必要に応じて公式マニュアルを参考に、管理ユーザー以外のアカウントを作成してください。
5.8 Neutronネットワークの登録
JujuによってデプロイしたOpenStack環境はネットワークは作成されていません。 インスタンスを起動して外部ネットワークと通信できるようにするにはまず、Neutronネットワークを作成する必要があります。 次の流れに従って、Neutronネットワークを登録してください。 設定の具体的な流れはOpenStack Pike 構築手順書を参考にどうぞ。
- 「プロジェクト > ネットワーク > ネットワーク」でユーザーネットワークを作成(共有オフ)
- ユーザーサブネットを作成(DHCP有効)
- 「プロジェクト > ネットワーク > ルーター」でルーターを作成
- 「管理 > ネットワーク > ネットワーク」でExternalネットワークを作成(ネットワーク種別:flat/物理ネットワーク:physnet1/管理状態有効、外部ネットワークにチェック)
- Externalサブネットを作成(DHCP無効)
- 「プロジェクト > ネットワーク > ルーター」でゲートウェイの設定
- 「プロジェクト > ネットワーク > ルーター」でインターフェイスの追加
- 「プロジェクト > ネットワーク > ネットワークトポロジ」でネットワークの確認
5.9 イメージの登録
Glanceにクラウドイメージを登録します。 コマンドによるイメージの登録についてはImage サービスの動作検証を参照してください。OpenStack DashboardからWebインターフェイスの操作により簡単にイメージを登録することもできます。 イメージのダウンロードについては仮想マシンイメージガイドのイメージの入手を参照してください。 OpenStack用のLXDイメージについてはNova LXD のインストールと設定を参照してください。
UbuntuのLXDイメージはUbuntu Cloud Imagesで配布されています。
Dashboardによるイメージ登録は次の流れに従って行ってください。
Dashboardでイメージを登録する場合は、イメージをユーザープロジェクトのイメージとして登録する場合とシステムに登録する場合の二つがあります。 汎用できるイメージはシステムに、プロジェクト別にカスタマイズし汎用性のないイメージはユーザープロジェクトのイメージとして登録すると良いでしょう。
5.9.1 システムにイメージを登録する
- 「管理 > システム > イメージ」を開く
- 「イメージの作成」ボタンを押下
- 名前、イメージのソースと場所、形式を入力。全てのユーザーに公開するにはパブリックを設定
- 「イメージの作成」ボタンを押下
以上でイメージを登録できます。
5.9.2 ユーザープロジェクトのイメージとして登録する
- 「プロジェクト > コンピュート > イメージ」を開く
- 「イメージの作成」ボタンを押下
- 名前、イメージのソースと場所、形式を入力。全てのユーザーに公開するにはパブリックを設定
- 「イメージの作成」ボタンを押下
以上でイメージを登録できます。
5.9.3 コンピュートノードの振り分け
Nova-LXDとNova-KVMを共存させた場合、インスタンスを起動するときにコンテナーで起動したいのか、KVM仮想マシンとして起動したいのかを指定する必要があります。 これを実現するための手段として、Nova-schedulerの「AggregateInstanceExtraSpecsFilter」を利用します。
これにより、インスタンスを起動する際にmetadataを渡すことで、目的のノードでインスタンスを生成することができるようになります。
Nova-scheduler用のフィルターを追加
デフォルトの設定ではNova-schedulerには「AggregateInstanceExtraSpecsFilter」が適用されておらず、追加が必要です。 ここからイメージやフレーバーでNova-KVM,Nova-LXDをNova-schedulerで自動選択するための設定を行います。 次のようにNova-scheduler用のフィルターを追加します。
- Juju GUIを開く
- Nova-cloud-controllersの設定を開く
- 「cheduler-default-filters (string)」にフィルタールール「AggregateInstanceExtraSpecsFilter」を追加
- 「Commit changes」ボタンを押す
- 「Deploy」ボタンを押す
Computeノードを確認
現在OpenStackが認識するComputeサービスが実行されているノードを確認します。
% openstack host list
+---------------------+-------------+----------+
| Host Name | Service | Zone |
+---------------------+-------------+----------+
| juju-ffbb7b-0-lxd-1 | conductor | internal |
| juju-ffbb7b-0-lxd-1 | consoleauth | internal |
| juju-ffbb7b-0-lxd-1 | scheduler | internal |
| physical3 | compute | nova | KVM
| physical4 | compute | nova | LXD
+---------------------+-------------+----------+
aggregateを作成
% openstack aggregate create --zone nova lxd
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:23.762947 |
| deleted | False |
| deleted_at | None |
| id | 2 |
| name | lxd |
| updated_at | None |
+-------------------+----------------------------+
% openstack aggregate create --zone nova kvm
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:31.520429 |
| deleted | False |
| deleted_at | None |
| id | 4 |
| name | kvm |
| updated_at | None |
+-------------------+----------------------------+
% openstack aggregate list
+----+----------+-------------------+
| ID | Name | Availability Zone |
+----+----------+-------------------+
| 2 | lxd | nova |
| 4 | kvm | nova |
+----+----------+-------------------+
aggregateにノードを追加
このあとaggregateに設定を行うので、この設定を適用したいノードを登録します。
% openstack aggregate add host 2 physical4
+-------------------+---------------------------------+
| Field | Value |
+-------------------+---------------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:24.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical4'] |
| id | 2 |
| metadata | {u'availability_zone': u'nova'} |
| name | lxd |
| updated_at | None |
+-------------------+---------------------------------+
% openstack aggregate add host 4 physical3
+-------------------+---------------------------------+
| Field | Value |
+-------------------+---------------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:32.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical3'] |
| id | 4 |
| metadata | {u'availability_zone': u'nova'} |
| name | kvm |
| updated_at | None |
+-------------------+---------------------------------+
aggregateの中身を確認
name,hostsを確認して、aggregateに想定した名前、ノードが登録されていることを確認します。
% openstack aggregate show 2
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:24.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical4'] |
| id | 2 |
| name | lxd |
| properties | |
| updated_at | None |
+-------------------+----------------------------+
% openstack aggregate show 4
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:32.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical3'] |
| id | 4 |
| name | kvm |
| properties | |
| updated_at | None |
+-------------------+----------------------------+
aggregateにmetadataを設定
aggregateはデフォルトでオフなので、有効化します。 aggregateのpropertiesに設定が追加されていることを確認します。
% openstack aggregate set --property lxd=true 2
% openstack aggregate set --property kvm=true 4
% openstack aggregate show 2
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:24.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical4'] |
| id | 2 |
| name | lxd |
| properties | lxd='true' |
| updated_at | None |
+-------------------+----------------------------+
% openstack aggregate show 4
+-------------------+----------------------------+
| Field | Value |
+-------------------+----------------------------+
| availability_zone | nova |
| created_at | 2017-10-17T02:04:32.000000 |
| deleted | False |
| deleted_at | None |
| hosts | [u'physical3'] |
| id | 4 |
| name | kvm |
| properties | kvm='true' |
| updated_at | None |
+-------------------+----------------------------+
metadataを設定
フレーバーやイメージに、metadataを設定します。
次のようなカスタムメタデータを作成します。
- aggregate_instance_extra_specs:lxd
- aggregate_instance_extra_specs:kvm
作成したメタデータにtrueを設定します。
5.10 セキュリティーグループの設定
次にセキュリティーグループの設定を行います。セキュリティーグループで通信を許可するサービスやポートを設定します。 通常、defaultというセキュリティーグループが用意されています。 これに許可するルールを追加するか、新しいセキュリティーグループを追加してルールを設定します。
インスタンスへのPingを許可するにはICMP、SSHプロトコルによるリモート接続を許可するにはSSHを許可してください。
5.11 キーペアの設定
キーペアではインスタンスとの接続に必要な秘密鍵と公開鍵を作成するか、既存の公開鍵をOpenStackに登録できます。
キーペアの作成をすると、OpenStackのインスタンスにアクセスする際に利用できるpemファイルを作成できます。 「キーペアのインポート」は既存の秘密鍵と公開鍵の組み合わせがある場合にそれをリモートアクセスに利用できるように登録できます。
公開鍵の欄に既存の公開鍵をペーストして「キーペアのインポート」ボタンを押下すると登録できます。
いずれの方法で登録したキーペアはインスタンス起動時に指定してください。
SSHアクセスする場合は-iオプションで公開鍵を指定して、インスタンスにアクセスできます。アクセスできない場合は-vvv
を追加してみましょう。
$ ssh -i cloud.key <username>@<instance_ip>
5.12 インスタンスの起動
インスタンスを起動するには次の2通りの方法があります。
「プロジェクト > コンピュート > イメージ」を開き、イメージを選択して「起動」を押下するか、 「プロジェクト > コンピュート > インスタンス」を開き、「インスタンスの起動」を押下するとインスタンスを起動できます。 インスタンスの起動ウィザードが表示されますので、画面の指示に従ってインスタンスの情報を入力してください。※印のある項目は必須入力項目です。
起動したインスタンスは一覧で表示されます。
インスタンス名をクリックして「ログ」タブを押下すると、インスタンス起動時のコンソールのログが表示できます。 「すべてのログの表示」ボタンを押下すると、起動から起動完了までのログをすべて表示できます。
5.13 サービスのクラスター化
デフォルトでクラスターを想定していないアプリケーションのクラスター化にはCorosync/Pacemakerを用いたHaclusterチャームを利用します。
以下はシングルノードで動かしていた「openstack-dashboard」を冗長化する例です。
% juju add-unit openstack-dashboard --to lxd:1
% juju deploy hacluster dashboard-hacluster ←dashboard-haclusterという名前でデプロイ
% juju config dashboard-hacluster cluster_count="2" ←3冗長以下の場合は設定を変更
% juju config openstack-dashboard vip="172.17.29.195" ←VIPの指定
% juju add-relation openstack-dashboard dashboard-hacluster
VIPに指定したノードにjuju ssh
コマンドでログインし、Apacheのアクセスログを見ると、openstack-dashboardの各アドレスでアクセスするとアクセスログが追記されていくのが確認できます。VIPとして設定しなかったノードはアクセスログが追記されません。
# tailf /var/log/apache2/access.log
172.17.29.197 - - [22/Sep/2017:06:36:15 +0000] "GET /auth/login/ HTTP/1.1" 200 3853 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38"
172.17.29.195 - - [22/Sep/2017:06:36:34 +0000] "GET /auth/login/ HTTP/1.1" 200 3855 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38"