こんにちは。@jedipunkz です。
前回 OpenStack Kilo のオールインワン構成を Chef-Zero を使ってデプロイする方法 を書きましたが、複数台構成についても調べたので結果をまとめていきます。
使うのは openstack/openstack-chef-repo です。下記の URL にあります。
https://github.com/openstack/openstack-chef-repo
この中に Vagrant を使ったファイルが存在しますが、実機でのデプロイには全く役に 立ちません。自分で Environment ファイルを作成する必要があります。今回は前提の 構成を作って、それに合わせた Environment ファイルを記します。ほぼスタンダード な構成にしましたので、自分の環境に合わせて修正するのも比較的簡単だと想います。 参考にしてください。
今回は knife-zero を使ってデプロイします。Chef サーバが必要なく、knife-zero を 使うホスト上のオンメモリで Chef サーバが稼働するので準備がほとんど必要ありません。
早速ですが、構成と準備・そしてデプロイ作業を記していきます。
前提の構成
+------------+
| GW Router |
+--+------------+
| |
| +--------------+--------------+---------------------------- public network
| | eth0 | eth0
| +------------+ +------------+ +------------+ +------------+
| | Controller | | Network | | Compute | | Knife-Zero |
| +------------+ +-------+----+ +------+-----+ +------------+
| | eth1 | eth1 | | eth1 | | eth1
+--+--------------+-------)------+------)-------+------------- api/management network
| eth2 | eth2
+-------------+--------------------- guest network
特徴としては…
- public, api/management, guest の3つのネットワークに接続された OpenStack ホスト
- Controller, Network, Compute の最小複数台構成
- knife-zero を実行する ‘Knife-Zero’ ホスト
- Knife-zero ホストは api/management network のみに接続で可
- デプロイは api/management network を介して行う
- public, api/management network はインターネットへの疎通が必須
- OS は Ubuntu 14.04 amd64
とくに api/management network がインターネットへの疎通が必要なところに注意して ください。デプロイは knife-zero ホストで実行しますが、各ノードへログインしデプ ロイする際にインターネット上からパッケージの取得を試みます。
また api/management network を2つに分離するのも一般的ですが、ここでは一本にま とめています。
IP アドレス
IP アドレスは下記を前提にします。
interface | IP addr |
---|---|
Controller eth0 | 10.0.1.10 |
Controller eth1 | 10.0.2.10 |
Network eth0 | 10.0.1.11 |
Network eth1 | 10.0.2.11 |
Network eth2 | 10.0.3.11 |
Compute eth1 | 10.0.2.12 |
Compute eth2 | 10.0.3.12 |
Knife-Zero eth1 | 10.0.2.13 |
ネットワークインターフェース設定
それぞれのホストで下記のようにネットワークインターフェースを設定します。
- Controller ホスト
eth0, 1 を使用します。
auto eth0
iface eth0 inet static
address 10.0.1.10
netmask 255.255.255.0
gateway 10.0.1.254
dns-nameservers 8.8.8.8
dns-search jedihub.com
auto eth1
iface eth1 inet static
address 10.0.2.10
netmask 255.255.255.0
auto eth2
iface eth2 inet manual
- Network ホスト
eth0, 1, 2 全てを使用します。
auto eth0
iface eth0 inet static
up ifconfig $IFACE 0.0.0.0 up
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
down ifconfig $IFACE down
address 10.0.1.11
netmask 255.255.255.0
auto eth1
iface eth1 inet static
address 10.0.2.11
netmask 255.255.255.0
gateway 10.0.2.248
dns-nameservers 8.8.8.8
dns-search jedihub.com
auto eth2
iface eth2 inet static
address 10.0.3.11
netmask 255.255.255.0
- Compute ホスト
eth1, 2 を使用します。
auto eth0
iface eth0 inet manual
auto eth1
iface eth1 inet static
address 10.0.2.12
netmask 255.255.255.0
gateway 10.0.2.248
dns-nameservers 8.8.8.8
dns-search jedihub.com
auto eth2
iface eth2 inet static
address 10.0.3.12
netmask 255.255.255.0
これらの作業は knife-zero からログインし eth1 を介して行ってください。でないと 接続が切断される可能性があります。
準備
knife-zero ホストに chef, knife-zero, berkshelf が入っている必要があるので、こ こでインストールしていきます。
knife-zero ホストに chef をインストールします。Omnibus パッケージを使って手っ 取り早く環境を整えます。
sudo -i
curl -L https://www.opscode.com/chef/install.sh | bash
Berkshelf をインストールするのに必要なソフトウェアをインストールします。
apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev ruby-dev libxml2-dev libxslt-dev g++
Berkshelf をインストールします。
/opt/chef/embedded/bin/gem install berkshelf --no-ri --no-rdoc
最後に knife-zero をインストールします。
/opt/chef/embedded/bin/gem install knife-zero --no-ri --no-rdoc
デプロイ作業
それでは openstack-chef-repo を取得してデプロイの準備を行います。 ブランチの指定は行わず master ブランチを取得します。Kilo は master ブランチで 管理されています。次のバージョンの開発が始まるタイミングで ‘stable/kilo’ ブラ ンチに管理が移されます。
sudo -i
cd ~/
git clone https://github.com/openstack/openstack-chef-repo.git
次に Berkshelf を使って必要な Cookbooks をダウンロードします。
cd ~/openstack-chef-repo
/opt/chef/embedded/bin/berks vendor ./cookbooks
Environment を作成します。これは各環境に合わせた設定ファイルのようなもので、各 Cookbooks の Attributes を上書きする仕組みになっています。下記の内容を
openstack-chef-repo/environments/multi-neutron-kilo.json
というファイル名で保存してください。
{
"name": "multi-neutron-kilo",
"description": "test",
"cookbook_versions": {
},
"json_class": "Chef::Environment",
"chef_type": "environment",
"default_attributes": {
},
"override_attributes": {
"mysql": {
"bind_address": "0.0.0.0",
"server_root_password": "mysqlroot",
"server_debian_password": "mysqlroot",
"server_repl_password": "mysqlroot",
"allow_remote_root": true,
"root_network_acl": ["10.0.0.0/8"]
},
"rabbitmq": {
"address": "0.0.0.0",
"port": "5672",
"loopback_users": []
},
"openstack": {
"auth": {
"validate_certs": false
},
"dashboard": {
"session_backend": "file"
},
"block-storage": {
"syslog": {
"use": false
},
"api": {
"ratelimit": "False"
},
"debug": true,
"image_api_chef_role": "os-image",
"identity_service_chef_role": "os-identity",
"rabbit_server_chef_role": "os-ops-messaging"
},
"compute": {
"rabbit": {
"host": "10.0.2.10"
},
"novnc_proxy": {
"bind_interface": "eth1"
},
"libvirt": {
"virt_type": "qemu",
"bind_interface": "eth1"
},
"novnc_proxy": {
"bind_interface": "eth1"
},
"xvpvnc_proxy": {
"bind_interface": "eth1"
},
"image_api_chef_role": "os-image",
"identity_service_chef_role": "os-identity",
"nova_setup_chef_role": "os-compute-api",
"rabbit_server_chef_role": "os-ops-messaging",
"network": {
"public_interface": "eth1",
"service_type": "neutron"
}
},
"network": {
"debug": "True",
"dhcp": {
"enable_isolated_metadata": "True"
},
"metadata": {
"nova_metadata_ip": "10.0.2.10"
},
"openvswitch": {
"tunnel_id_ranges": "1:1000",
"enable_tunneling": "True",
"tenant_network_type": "gre",
"tunnel_types": "gre",
"tunnel_type": "gre",
"bridge_mappings": "physnet1:br-eth2",
"bridge_mapping_interface": "br-eth2:eth2"
},
"ml2": {
"tenant_network_types": "gre",
"mechanism_drivers": "openvswitch",
"tunnel_id_ranges": "1:1000",
"enable_security_group": "True"
},
"api": {
"bind_interface": "eth1"
},
"l3": {
"external_network_bridge_interface": "eth0"
},
"service_plugins": ["neutron.services.l3_router.l3_router_plugin.L3RouterPlugin"]
},
"db": {
"bind_interface": "eth1",
"compute": {
"host": "10.0.2.10"
},
"identity": {
"host": "10.0.2.10"
},
"image": {
"host": "10.0.2.10"
},
"network": {
"host": "10.0.2.10"
},
"volume": {
"host": "10.0.2.10"
},
"dashboard": {
"host": "10.0.2.10"
},
"telemetry": {
"host": "10.0.2.10"
},
"orchestration": {
"host": "10.0.2.10"
}
},
"developer_mode": true,
"endpoints": {
"network-openvswitch": {
"bind_interface": "eth1"
},
"compute-api-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8774"
},
"compute-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8774"
},
"compute-ec2-admin-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8773"
},
"compute-ec2-admin": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8773"
},
"compute-ec2-api-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8773"
},
"compute-ec2-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8773"
},
"compute-xvpvnc": {
"host": "10.0.2.10",
"scheme": "http",
"port": "6081"
},
"compute-novnc-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "6080"
},
"compute-novnc": {
"host": "10.0.2.10",
"scheme": "http",
"port": "6080"
},
"compute-vnc": {
"host": "0.0.0.0",
"scheme": "http",
"port": "6080"
},
"image-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "9292"
},
"image-api-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "9292"
},
"image-registry": {
"host": "10.0.2.10",
"scheme": "http",
"port": "9191"
},
"image-registry-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "9191"
},
"identity-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "5000"
},
"identity-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "5000"
},
"identity-admin": {
"host": "10.0.2.10",
"scheme": "http",
"port": "35357"
},
"identity-internal": {
"host": "10.0.2.10",
"scheme": "http",
"port": "35357"
},
"volume-api-bind": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8776"
},
"volume-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8776"
},
"telemetry-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8777"
},
"network-api-bind": {
"host": "10.0.2.11",
"scheme": "http",
"port": "9696"
},
"network-api": {
"host": "10.0.2.11,
"scheme": "http",
"port": "9696"
},
"block-storage-api-bind": {
"host": "10.0.2.10",
"port": "8776",
"bind_interface": "eth1"
},
"block-storage-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8776"
},
"orchestration-api": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8004"
},
"orchestration-api-cfn": {
"host": "10.0.2.10",
"scheme": "http",
"port": "8000"
},
"db": {
"host": "0.0.0.0",
"port": "3306"
},
"bind-host": "0.0.0.0"
},
"identity": {
"admin_user": "admin",
"bind_interface": "eth1",
"debug": true
},
"image": {
"api": {
"bind_interface": "eth1"
},
"debug": true,
"identity_service_chef_role": "os-identity",
"rabbit_server_chef_role": "os-ops-messaging",
"registry": {
"bind_interface": "eth1"
},
"syslog": {
"use": false
}
},
"mq": {
"bind_interface": "eth1",
"host": "10.0.2.10",
"user": "guest",
"vhost": "/nova",
"network": {
"rabbit": {
"host": "10.0.2.10",
"port": "5672"
}
},
"compute": {
"service_type": "rabbitmq",
"rabbit": {
"host": "10.0.2.10",
"port": "5672"
}
},
"block-storage": {
"service_type": "rabbitmq",
"rabbit": {
"host": "10.0.2.10",
"port": "5672"
}
}
}
},
"queue": {
"host": "10.0.2.10",
"user": "guest",
"vhost": "/nova"
}
}
}
上記ファイルでは virt_type : qemu に設定していますが、KVM リソースを利用出来る 環境であればここを削除してください。デフォルトの ‘kvm’ が適用されます。また気 をつけることは IP アドレスとネットワークインターフェース名です。環境に合わせて 設定していきましょう。今回は前提構成に合わせて environemnt ファイルを作ってい ます。
次に openstack-chef-repo/.chef/encrypted_data_bag_secret というファイルが knife-zero ホストにあるはずです。これをデプロイ対象の3ノードに事前に転送してお く必要があります。
scp openstack-chef-repo/.chef/encrypted_data_bag_secret 10.0.2.10:/tmp/
scp openstack-chef-repo/.chef/encrypted_data_bag_secret 10.0.2.11:/tmp/
scp openstack-chef-repo/.chef/encrypted_data_bag_secret 10.0.2.12:/tmp/
対象ホストにて
mkdir /etc/chef
mv /tmp/encrypted_data_bag_secret /etc/chef/openstack_data_bag_secret
ではいよいよデプロイです。
Controller ホストへのデプロイ
knife zero bootstrap 10.0.2.10 -N kilo01 -r 'role[os-compute-single-controller-no-network]' -E multi-neutron-kilo -x <USERNAME> --sudo
Network ホストへのデプロイ
knife zero bootstrap 10.0.2.11 -N kilo02 -r 'role[os-client]','role[os-network]' -E multi-neutron-kilo -x <USERNAME> --sudo
Compute ノードへのデプロイ
knife zero bootstrap 10.0.2.12 -N kilo03 -r 'role[os-compute-worker]' -E multi-neutron-kilo -x <USERNAME> --sudo
これで完了です。admin/mypass というユーザ・パスワードでログインが可能です。
まとめ
openstack-chef-repo を使って OpenStack Kilo の複数台構成をデプロイ出来ました。重要なのは Environment をどうやって作るか?ですが、 私は 作成 -> デプロイ -> 修正 -> デプロイ ->…. を繰り返して作成しています。何度実行しても不具合は発生しない設計なクックブックに なっていますので、このような作業が可能になります。また、「ここの設定を追加したい」という時は…
- 該当の template を探す
- 該当のパラメータを確認する
- recipe 内で template にどうパラメータを渡しているか確認する
- attribute なり、変数なりを修正するための方法を探す
と行います。比較的難しい作業になるのですが、自らの環境に合わせた Environment を作成するにはこれらの作業が必須となってきます。
以上、複数台構成のデプロイ方法についてでした。