--- 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)