---
title: マルチノードで OpenStack Kolla
created_at: 2015-11-24 11:50:32.873460 +09:00
posted_at: 2015-12-02 11:50:32.873521 +09:00
type: entry
filter:
- markdown
categories:
- 'Program/Python'
- 'Program/技術'
---
[OpenStack Advent Calendar 2015](http://www.adventar.org/calendars/968) の 2日目のエントリとして、
[OpenStack Magnum](https://wiki.openstack.org/wiki/Magnum)
でコアレビューアやってるのになぜか [Kolla](https://wiki.openstack.org/wiki/Kolla) の
紹介をしますよ。
(間違って早めに公開しちゃったけどまあいいか。)
## TL;DR
依存するソフトウェアが以下のように少ないのでインストールがとてもシンプル。
Component |
Min Version |
Max Version |
Comment |
Ansible |
1.9.4 |
none |
On deployment host |
Docker |
1.8.2 |
1.8.2 |
On target nodes |
Docker Python |
1.2.0 |
none |
On target nodes |
Python Jinja2 |
2.6.0 |
none |
On deployment host |
ただし Kolla 自体はまだいくつか突っ込みどころ、
良く言えばパッチのしがいがあるプロジェクトなので自分たちで使って行って成熟させていくしかない感じ。
## OpenStack Kolla とは
コンテナを利用して、プロダクションレディな OpenStack 環境を構築するツール。
現時点では実装に [Docker](https://www.docker.com) と [Ansible](http://www.ansible.com) を利用している。
## 環境
ドキュメントの
[Bare Metal Deployment of Kolla](http://docs.openstack.org/developer/kolla/quickstart.html)
にはオールインワン構成時の構築方法しか載っていないため、
各種ツールを利用したりソースを読んでマルチノード構成のデプロイを頑張ってみる。
と、言ってもベアメタル四台も簡単に転がっていないので、
今回自分は以下のような VM 4台でマルチノード構成を組んだのだが、
- Kolla Host
- VM を起動するホスト。各 VM はブリッジ接続で直接外につながっている。
- Operator Node
- Kolla をインストールし、ansible を起動したりイメージをビルドしたり、docker-registry をホストしたりする。
- Controller Node
- OpenStack の制御ノード。各コンポーネントの API サーバや MariaDB, RabbitMQ が動いている。
- Network Node
- OpenStack のネットワークノード。HAProxy が動いており keepalived で 二重化されている。
- Compute Node
- OpenStack の実行系。
とりあえず今回は operator/controller/network/compute
という同じネットワークに繋がった以下のスペックのベアメタルが4台あると思って読んでもらいたい!
- Memory: 8GB
- NIC: eth0, eth1
- OS: Ubuntu 14.04
ちなみに以上の4台の VM は `uvtool` を使って用意したのだが、
その手順は [github.com/yuanying/dev-kolla](https://github.com/yuanying/dev-kolla)
に一応書いておいた。
## controller/network/compute のセットアップ
OpenStack の各プロセスはコンテナ化されているので当たり前のことだが、
最低限のセットアップで controller/network/compute のセットアップは終わる。
その、最低限必要なスペックは以下。
Component |
Min Version |
Max Version |
Kernel |
3.19 |
|
Docker |
1.8.2 |
1.8.2 |
Docker Python |
1.2.0 |
|
`Docker Python` がターゲットノードに必要なのは、
デプロイに Ansible を使っている関係上、
Python から Dokcer のインタフェースを触れなければ困るため。
### カーネルのアップデート
以下のスクリプトでカーネルをアップデートした後にノードの再起動。
echo "Kernel version $(uname -r)"
if [[ $(uname -r) != *"3.19"* ]]; then
echo "Going to update kernel image"
apt-get update
apt-get install -y linux-image-generic-lts-vivid
# VM needs to be rebooted for docker to pickup the changes
echo "Rebooting for kernel changes"
echo "After reboot re-run vagrant provision to finish provising the box"
reboot
# Sleep for a bit to let vagrant exit properly
sleep 3
fi
### Docker のインストール
apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-engine=1.8.2*
sed -i -r "s,^[# ]*DOCKER_OPTS=.+$,DOCKER_OPTS=\"--insecure-registry operator.local:4000\"," /etc/default/docker
restart docker
ちなみにここで `--insecure-registry` として `operator.local:4000`
を Docker デーモンの起動オプションに渡している。
今回は、認証無しでの docker registry を利用しているためこれが必要。
また、operator.local というホスト名で operator ノードに繋がる必要があるため、
`/etc/hosts` に `192.168.201.1 operator.local` を追記する。
sudo bash -c 'echo "192.168.201.1 operator.local" >> /etc/hosts'
### Docker Python のインストール
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
sudo pip install docker-py
### ntp のインストール
sudo apt-get install -y ntp
### SSH で root ログイン許可
Kolla は Ansible の実行を root ユーザで行うため(イケテナイ)、
root の `.ssh/authorized_keys` に Ansible で利用する公開鍵を追記しておく必要がある。
また、念のため、`/etc/ssh/sshd_config` が `PermitRootLogin without-password`
されているか確認しておく。
### NIC の設定
`eth0` を OpenStack 各コンポーネントの API 通信に利用するので IP アドレスを振っておく。
# /etc/network/interface.d/eth0
auto eth0
iface eth0 inet static
address 192.168.201.X
netmask 255.255.0.0
gateway 192.168.11.1
dns-nameservers 8.8.8.8
また、`eth1` はテナント間ネットワークのトンネリング通信に利用するので以下のように設定しておく。
# /etc/network/interface.d/eth1
auto eth1
iface eth1 inet manual
up is link set dev $IFACE up
down is link set dev $IFACE down
以上を設定したらめんどくさいので reboot 。
## operator のセットアップ
operator ノードには Kolla をインストールする。
デプロイその他の運用は operator ノードでやることになる。
また、Kolla のデプロイに必要なコンテナイメージはこのノードでホストされる。
### Kolla のソースのクローン
ちなみに、現時点の Kolla ではこのマルチノード構成でちゃんとデプロイすることができず、
[微妙な修正パッチ](https://review.openstack.org/#/c/242777/)
がマージされてしまい依然議論中な状態なので、
とりあえずその微妙なパッチがマージされる前のソースをチェックアウトし、
別のパッチを当てる。
sudo git clone https://github.com/openstack/kolla.git /usr/local/share/kolla
cd /usr/local/share/kolla
sudo chown -R $USER .
git fetch https://review.openstack.org/openstack/kolla refs/changes/68/247368/5 && git checkout FETCH_HEAD
git checkout -b fix-multinode
git checkout 8dd36c11bb5dab3358bcda6bd92dd87f329422d5
git checkout -b multinode-test
git merge fix-multinode
場所は `/usr/local/share/kolla` にハードコードされているので確実にここに置くこと。
### Kolla の設定
/etc/kolla 配下に設定ファイルを配置する。
テンプレートは kolla のソースに含まれているのでそれをコピー。
sudo cp -r /usr/local/share/kolla/etc/kolla /etc/
適当に `/etc/kolla/globals.yml` を修正。
kolla_base_distro: "ubuntu"
kolla_install_type: "source"
kolla_internal_address: "192.168.201.100"
docker_registry: "operator.local:4000"
docker_insecure_registry: "True"
network_interface: "eth0"
neutron_external_interface: "eth1"
`kolla_base_distro` に `ubuntu` を選んだ場合、
`kolla_install_type` は `source` しか指定できなくてハマった。
`kolla_internal_address` は `keepalived` によって管理される VIP。
各 API はこのアドレスにアクセスして利用することになる。
ネットワークで使われていないアドレスを指定する。
また、ここで NIC の指定を `network_interface` と `neutron_external_interface`
でしているが、ヘテロな環境の場合、
各ノードでネットワークカードのデバイス名が違うっていうことがあり得る。
っていうか自分が作った環境であったためパッチを書いたのだが、
- [Change Id15d70bf: Fix retrieving api_interface | review.openstack Code Review](https://review.openstack.org/#/c/247999/)
すでに blueprint が挙がっていて実装者が決まっていたので放置。
(ってかこれ bug じゃなくて blueprint だったのかって指摘されて思った。)
マージされました。
### bootstrap スクリプトの実行
`Vagrant` 用に operator ノードに必要パッケージをインストールするスクリプトが添付されているので、
使ってやる。
sudo sed -i -r "s/^(127\.0\.0\.1\s+)(.*)/\1 \2 operator.local/" /etc/hosts
sudo mkdir -p /data/host/registry-storage
sudo bash /usr/local/share/kolla/dev/vagrant/ubuntu-bootstrap.sh \
operator multinode /usr/local/share/kolla
### Kolla のインストール
clone してきたソースから kolla 関連のコマンドをインストールする。
cd /usr/local/share/kolla
sudo python setup.py develop
以上で kolla のインストールは完了。
## OpenStack のデプロイ
### イメージのビルド
sudo kolla-build --base ubuntu --type source --registry operator.local:4000 --push
コマンドを実行したのちにしばし待つ。
### OpenStack のデプロイ
kolla は Ansible を利用してデプロイを行うため、
Ansible の inventory ファイルを用意する必要がある。
マルチノード用の inventory ファイルのサンプルをコピーして修正するのが良い。
cp /usr/local/share/kolla/ansible/inventory/multinode ~/inventory
control/network/compute のアドレスはそれぞれ、192.168.201.2, 3, 4 なので、
こんな感じに修正する。
ubuntu@dev-yuanying:~$ diff -u inventory.old inventory
--- inventory.old 2015-11-24 09:44:20.030821655 +0000
+++ inventory 2015-11-24 09:45:44.602821655 +0000
@@ -2,9 +2,7 @@
# additional groups are for more control of the environment.
[control]
# These hostname must be resolvable from your deployment host
-control01
-control02
-control03
+192.168.201.2
# The above can also be specified as follows:
#control[01:03] ansible_ssh_user=kolla
@@ -12,13 +10,12 @@
# The network nodes are where your l3-agent and loadbalancers will run
# This can be the same as a a host in the control group
[network]
-network01
+192.168.201.3
[compute]
-compute01
+192.168.201.4
[storage]
-storage01
# You can explicitly specify which hosts run each project by updating the
inventory を修正したらそれをして deploy を実行。
sudo kolla-ansible deploy -i ~/inventory
`sudo` は必須。うまくいかない時は `root` ユーザ間でちゃんと ssh できるかどうかを確認しておく。
以上。
パスワード類は、`/etc/kolla/passwords.yml`
に書かれているので各サービスにはこれを利用してアクセスする。
## 参考
- [Setup OpenStack with Kolla on Vagrant](https://github.com/yosshy/wiki/wiki/Setup-OpenStack-with-Kolla-on-Vagrant)