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

依存するソフトウェアが以下のように少ないのでインストールがとてもシンプル。

<table class="docutils">
<colgroup>
<col width="31%" />
<col width="16%" />
<col width="16%" />
<col width="37%" />
</colgroup>
<thead valign="bottom">
  <tr class="row-odd"><th class="head">Component</th>
  <th class="head">Min Version</th>
  <th class="head">Max Version</th>
  <th class="head">Comment</th>
</tr>
</thead>
<tbody valign="top">
  <tr class="row-even"><td>Ansible</td>
    <td>1.9.4</td>
    <td>none</td>
    <td>On deployment host</td>
  </tr>
  <tr class="row-odd"><td>Docker</td>
    <td>1.8.2</td>
    <td>1.8.2</td>
    <td>On target nodes</td>
  </tr>
  <tr class="row-even"><td>Docker Python</td>
    <td>1.2.0</td>
    <td>none</td>
    <td>On target nodes</td>
  </tr>
  <tr class="row-odd"><td>Python Jinja2</td>
    <td>2.6.0</td>
    <td>none</td>
    <td>On deployment host</td>
  </tr>
</tbody>
</table>

ただし 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台でマルチノード構成を組んだのだが、

<p class='image'>
<img  src='/log/2015/12/IMG_2993.JPG'
      width='640'
      height='480'
      alt=''  />
</p>

<dl>
  <dt>Kolla Host</dt>
  <dd>VM を起動するホスト。各 VM はブリッジ接続で直接外につながっている。</dd>

  <dt>Operator Node</dt>
  <dd>Kolla をインストールし、ansible を起動したりイメージをビルドしたり、docker-registry をホストしたりする。</dd>

  <dt>Controller Node</dt>
  <dd>OpenStack の制御ノード。各コンポーネントの API サーバや MariaDB, RabbitMQ が動いている。</dd>

  <dt>Network Node</dt>
  <dd>OpenStack のネットワークノード。HAProxy が動いており keepalived で 二重化されている。</dd>

  <dt>Compute Node</dt>
  <dd>OpenStack の実行系。</dd>

</dl>

とりあえず今回は 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 のセットアップは終わる。
その、最低限必要なスペックは以下。

<table>
<tr>
  <th>Component</th>
  <th>Min Version</th>
  <th>Max Version</th>
</tr>

<tr>
  <td>Kernel</td>
  <td>3.19</td>
  <td></td>
</tr>
<tr>
  <td>Docker</td>
  <td>1.8.2</td>
  <td>1.8.2</td>
</tr>
<tr>
  <td>Docker Python</td>
  <td>1.2.0</td>
  <td></td>
</tr>
</table>

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

<del datetime="2015-12-25T08:10+09:00">すでに blueprint が挙がっていて実装者が決まっていたので放置。
(ってかこれ bug じゃなくて blueprint だったのかって指摘されて思った。)</del>
マージされました。

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