BONNOH FRACTION 14

世の中に寝るより楽はなかりけり
浮世の馬鹿は起きて働く

マルチノードで OpenStack Kolla

OpenStack Advent Calendar 2015 の 2日目のエントリとして、 OpenStack Magnum でコアレビューアやってるのになぜか 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 環境を構築するツール。 現時点では実装に DockerAnsible を利用している。

環境

ドキュメントの Bare Metal Deployment of Kolla にはオールインワン構成時の構築方法しか載っていないため、 各種ツールを利用したりソースを読んでマルチノード構成のデプロイを頑張ってみる。

と、言ってもベアメタル四台も簡単に転がっていないので、 今回自分は以下のような 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 に一応書いておいた。

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/hosts192.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_configPermitRootLogin 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 ではこのマルチノード構成でちゃんとデプロイすることができず、 微妙な修正パッチ がマージされてしまい依然議論中な状態なので、 とりあえずその微妙なパッチがマージされる前のソースをチェックアウトし、 別のパッチを当てる。

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_distroubuntu を選んだ場合、 kolla_install_typesource しか指定できなくてハマった。

kolla_internal_addresskeepalived によって管理される VIP。 各 API はこのアドレスにアクセスして利用することになる。 ネットワークで使われていないアドレスを指定する。

また、ここで NIC の指定を network_interfaceneutron_external_interface でしているが、ヘテロな環境の場合、 各ノードでネットワークカードのデバイス名が違うっていうことがあり得る。 っていうか自分が作った環境であったためパッチを書いたのだが、

すでに 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 に書かれているので各サービスにはこれを利用してアクセスする。

参考

© 2004-2016 fraction.jp & Yuanying

This website was created with Webby