Openstack Magnumの環境を構築する

2015年11月30日(月)
西島 直
Fedora 21とDevstackを用いて、Openstack Magnum環境を構築する手順をご紹介します。

第2回では、Fedora21とDevstackを用いてMagnum環境を構築する手順をご紹介します。この手順は著者が検証環境を構築した時のものであり、構築環境や時期により、手順の過不足がありえることをご承知おきください。

前提となる環境及び注意点

今回紹介する手順は、2015/10/22時点のMagnumのmasterブランチで動作を確認しています。stable/libertyブランチでも同様の手順でMagnumを構築できますが、stable/libertyブランチで構築したMagnumは、使用できるProxyがDocker Swarmに限られています。そのためProxy環境でKubernetesを動かす場合は、Magnumのソースコードを変更する必要があります。2015/10/22以降のmasterブランチで構築したMagnumのKubernetesはProxyに対応しているため、今回はmasterブランチのコードを利用しています。

今回の環境構築は、1台のサーバで行います。External Network用のNIC(デバイス名:eno1、IP:192.168.0.10)とManagement Network用(デバイス名:enp1s0f0、IP:10.0.0.10)のNICを用意して、Fedora21の最小限インストールとgitをインストールします。その後は、下記のページに従ってインストールを行います。

openstack/magnum Developer Quick-Start

https://github.com/openstack/magnum/blob/master/doc/source/dev/dev-quickstart.rst

最初に作業用のディレクトリを用意して、Devstackのソースコードを取得します。

1$ sudo mkdir -p /opt/stack
2$ sudo chown $USER /opt/stack
3$ git clone https://git.openstack.org/openstack-dev/devstack /opt/stack/devstack

次にMagnum環境を構築するためのlocal.confを用意します。

01$ cat > /opt/stack/devstack/local.conf << END
02[[local|localrc]]
03DATABASE_PASSWORD=password
04RABBIT_PASSWORD=password
05SERVICE_TOKEN=password
06SERVICE_PASSWORD=password
07ADMIN_PASSWORD=password
08# magnum requires the following to be set correctly
09PUBLIC_INTERFACE=enp1s0f0
11# Enable barbican service and use it to store TLS certificates
14VOLUME_BACKING_FILE_SIZE=20G
15HOST_IP=192.168.0.10
16FLOATING_RANGE=10.0.0.0/24
17PUBLIC_NETWORK_GATEWAY=10.0.0.1
18END

PUBLIC_INTERFACEやHOST_IP、FLOATING_RANGE等は、ご自身の環境に合わせて適切に設定してください。次にDevstackを実行します。

1$ cd /opt/stack/Devstack
2$ ./stack.sh

ソースコードや必要なパッケージをネットワーク経由で取得しているので、しばらく時間がかかります。もしProxy環境下にある場合は、stack.shを実行する前に以下のようにシェル変数等の設定を行います。最後のgit configは、gitプロトコルが通らない環境で必要です。

1$ export http_proxy=http://<proxy ip>:<proxy port>
2$ export https_proxy=http://<proxy ip>:<proxy port>
3$ export no_proxy=192.168.0.10
4$ git config --global url."https://".insteadOf git://

インストール後の設定

以下の画面が表示されたら完成です。

01$ ./stack.sh
02...
03========================
04DevStack Components Timed
05========================
06 
07pip_install - 475 secs
08 
09 
10 
11This is your host IP address: 192.168.0.10
12This is your host IPv6 address: ::1
13Horizon is now available at http:// 192.168.0.10/dashboard
142015-10-22 13:01:51.606 | stack.sh completed in 5162 seconds.
15Keystone is serving at http:// 192.168.0.10:5000/
16The default users are: admin and demo
17The password: password

まずはOpenStackのAPIを実行できるように環境変数を設定します。

1$ source openrc admin

Magnumのサービスが動作しているか確認します。

1$ magnum service-list
2+----+--------------------------------+------------------+-------+
3| id | host                           | binary           | state |
4+----+--------------------------------+------------------+-------+
5| 1  | magnum.sample.com              | magnum-conductor | up    |
6+----+--------------------------------+------------------+-------+

MagnumでKubernetesを構築する際に、VMからMagnumのAPIを呼び出します。今回はテスト環境のためiptablesの設定を削除します(本番環境ではiptablesの設定を行いMagnumのポート番号9511、Barbicanのポート番号9311を開けてください)。

1$ sudo iptables -F

次にBaymodelで使うkeypairを作成します。

1$ test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
2$ nova keypair-add --pub-key ~/.ssh/id_rsa.pub testkey

ここまで準備ができたら、Baymodelを作成します。Baymodelは、Novaでいうflavorのようなもので、Kubernetes、Docker swarm、Mesosのテンプレートを作ります。

1$ magnum baymodel-create --name k8sbaymodel --image-id fedora-21-atomic-5
2--keypair-id testkey --external-network-id public
3--dns-nameserver 8.8.8.8 --flavor-id m1.small
4--docker-volume-size 5 --network-driver flannel --coe kubernetes
5--http-proxy http://<proxy ip>:<proxy port>
6--https-proxy https://<proxy ip>:<proxy port> --no-proxy 192.168.0.10
7【実際には1行で入力】

引数には、それぞれ以下の項目を指定しています。

  • image-id:glanceに登録されているイメージを指定します。現時点ではKubernetesやDocker swarmではfedora-atomicもしくはcoreosを、MesosではUbuntu 14.04を指定します
  • flavor-id:Dockerが動作するノードのflavorを指定します。現在は仮想マシン上で構築していますが、Ironicを利用してベアマシン上でも構築ができるようになる予定です
  • docker-volume-size:Dockerのストレージバックエンドのボリュームサイズを指定します。ここで指定されたサイズのCinder volumeを切り出し、VMにアタッチします。アタッチされたボリュームは、docker-storage-setupによってDockerのストレージとされます
  • network-driver:現時点ではflannelのみ指定可能です
  • coe:Container Orchestration Engineの略で、Kubernetes、Docker Swarm、Mesosから選びます
  • http-proxy、https-proxy:proxyを指定します。

次にk8sbayという名前のKubernetes環境のBayを作成します。ノード数は1にします。

1$ magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1

Bayの作成完了は、bay-listコマンドで確認します。bay-create実行後、しばらくしてから以下のように入力し、「CREATE_COMPLETE」が出力されたら完了です。

1$ magnum bay-list
2+--------------------------------------+--------+------------+--------------+-----------------+
3| uuid                                 | name   | node_count | master_count | status          |
4+--------------------------------------+--------+------------+--------------+-----------------+
5| 0c9e0d9d-0f2b-4a99-9160-1467c7f3e8ca | k8sbay | 1          | 1            | CREATE_COMPLETE |
6+--------------------------------------+--------+------------+--------------+-----------------+

ノードの数は、以下のように指定することで、動的に増やすことができます。

1$ magnum bay-update k8sbay replace node_count=2

反対に、ノードの数を動的に減らすこともできます。その場合、まずPodが動いていないノードから削除され、それ以上にノードを削除する場合は、Podが動いているノードも削除されます。

ノード追加の確認も、bay-listコマンドを用います。以下のように入力して、「UPDATE_COMPLETE」が出力されたら完成です。

1$ magnum bay-list
2+--------------------------------------+--------+------------+--------------+-----------------+
3| uuid                                 | name   | node_count | master_count | status          |
4+--------------------------------------+--------+------------+--------------+-----------------+
5| 0c9e0d9d-0f2b-4a99-9160-1467c7f3e8ca | k8sbay | 2          | 1            | UPDATE_COMPLETE |
6+--------------------------------------+--------+------------+--------------+-----------------+

エラーになる場合の対処

環境によっては、Bayを作成する際に以下のエラーが出力される場合があります。

01$ magnum bay-create --name k8sbay --baymodel k8sbaymodel --node-count 1
02ERROR: Remote error: HTTPServerError <html>
03 <head>
04  <title>503 Service Unavailable</title>
05 </head>
06 <body>
07  <h1>503 Service Unavailable</h1>
08  The server is currently unavailable. Please try again at a later time.<br /><br />
09 
10 
11 
12 </body>
13</html>
14[u' (HTTP 500)

この場合は、barbican-svcプロセスを再起動する必要があります。まず次のファイルを、以下のように書き換えてください。

1$ sed -i -e 's/localhost/192.168.0.10/g' /etc/barbican/barbican-api-paste.ini

次に以下のスクリプトを実行すると、Screenが立ち上がります。

1$ /opt/stack/Devstack/rejoin-stack.sh

Screen起動後に、Ctrl+a、nでbarbican-svcの画面に移動して、Ctrl+cでBarbicanのプロセスを終了させます。その後↑キーを押してEnterを押せば、Barbicanのプロセスが再起動されます。Ctrl+a、dでデタッチしたあとは、再度bay-createコマンドを実行します。

作成したStackの確認方法

bay-createコマンドを実行すると、Heatに新しいStackが作られます。このStackを見れば、実際になにをしているのかが分かります。もし起動に問題があったとき、どこで問題があるか調べることができます。

1$ heat stack-list
2+--------------------------------------+---------------------+--------------------+---------------------+--------------+
3| id                                   | stack_name          | stack_status       | creation_time       | updated_time |
4+--------------------------------------+---------------------+--------------------+---------------------+--------------+
5| 3429e9e5-2237-4be0-b869-6c1d180289dd | k8sbay-7izgbh2k2quw | CREATE_IN_PROGRESS | 2015-10-22T15:18:09 | None         |
6+--------------------------------------+---------------------+--------------------+---------------------+--------------+

Heatのイベントを確認するには、stack-listで出力されたstack_nameを用いて、以下のように入力します。

01$ heat event-list k8sbay-7izgbh2k2quw
02+----------------------+--------------------------------------+------------------------+--------------------+---------------------+
03| resource_name        | id                                   | resource_status_reason | resource_status    | event_time          |
04+----------------------+--------------------------------------+------------------------+--------------------+---------------------+
05| k8sbay-7izgbh2k2quw  | 561d8b13-1c18-4739-ab27-4ace58b688ee | Stack CREATE started   | CREATE_IN_PROGRESS | 2015-10-22T15:18:10 |
06| secgroup_kube_master | f6585d5c-5aae-4853-94a8-f12f9e059989 | state changed          | CREATE_IN_PROGRESS | 2015-10-22T15:18:10 |
07| api_monitor          | c5fdf94d-3dab-4967-9827-0510211d0637 | state changed          | CREATE_IN_PROGRESS | 2015-10-22T15:18:11 |
08
09| kube_masters         | 307245b0-d715-4351-8aaa-b6295db26e2f | state changed          | CREATE_IN_PROGRESS | 2015-10-22T15:18:26 |
10| kube_masters         | 90b72e45-58eb-41e0-b362-01ea2bca95f7 | state changed          | CREATE_COMPLETE    | 2015-10-22T15:19:27 |
11| kube_minions         | 16a08660-696c-48eb-9848-0043c20c9b54 | state changed          | CREATE_IN_PROGRESS | 2015-10-22T15:19:27 |
12+----------------------+--------------------------------------+------------------------+--------------------+---------------------+

Heatのリソースを確認するには、以下のように入力します。イベントの場合と同様に、stack_nameを指定します。

01$ heat resource-list k8sbay-7izgbh2k2quw
02+----------------------+-------------------------------------------------------------------------------------+------------------------------+-----------------+---------------------+
03| resource_name        | physical_resource_id                                                                | resource_type                | resource_status | updated_time        |
04+----------------------+-------------------------------------------------------------------------------------+------------------------------+-----------------+---------------------+
05| api_pool             | 7843ec8e-6d76-47a2-9528-14c5fc67debe                                                | OS::Neutron::Pool            | CREATE_COMPLETE | 2015-10-22T15:18:09 |
06| api_pool_floating    | 97f62cab-a193-4e6d-93fd-9ca5296e3243                                                | OS::Neutron::FloatingIP      | CREATE_COMPLETE | 2015-10-22T15:18:09 |
07| secgroup_base        | 9e84d185-48e9-4da7-8d8e-5581722a1161                                                …
08| kube_masters         | db9ef688-e36e-466a-a0d8-23768ee280f2                                                | OS::Heat::ResourceGroup      | UPDATE_COMPLETE | 2015-10-22T15:44:07 |
09| kube_minions         | 13b8c394-0fb9-4e07-b6ef-8d7148f2f12e                                                | OS::Heat::ResourceGroup      | UPDATE_COMPLETE | 2015-10-22T15:44:31 |
10+----------------------+-------------------------------------------------------------------------------------+------------------------------+-----------------+---------------------+

次回は、Kubernetes環境でDockerを動かす手順を紹介します。

  • OpenStack&reg;の文字表記とOpenStackのロゴは、米国とその他の国におけるOpenStack Foundationの登録商標/サービスマークまたは商標/サービスマークのいずれかであり、OpenStack Foundationの許諾を得て使用しています。日立製作所は、OpenStack FoundationやOpenStackコミュニティの関連企業ではなく、また支援や出資を受けていません。
  • その他、記載の商標やロゴは、各社の商標または登録商標です。

【参考文献】

openstack/magnum Developer Quick-Start

https://github.com/openstack/magnum/blob/master/doc/source/dev/dev-quickstart.rst

株式会社日立製作所

研究開発グループ デジタルテクノロジーイノベーションセンタ OSSテクノロジーラボラトリ員
OSSの評価・検証・機能開発、upstream活動、社内外へのOSS普及に従事。
Linux KernelやKVM、OpenStackでOSSコミュニティの参加した経験を持つ。
現在はHyperledgerコミュニティに参加しブロックチェーンの普及に勤めている。

連載バックナンバー

業務アプリ技術解説

KubernetesのマニフェストをMagnumで実行する

2016/2/12
今回はKubernetesの「マニフェスト」を作成し、Magnumから実行してみます。
OSS技術解説

Openstack Magnumの環境を構築する

2015/11/30
Fedora 21とDevstackを用いて、Openstack Magnum環境を構築する手順をご紹介します。
OSS技術解説

OpenStack Magnumとコンテナ

2015/10/27
OpenStackがコンテナを取り扱うための課題と、Magnumの概要についてご紹介します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています