OpenStack Magnumを使ってOpenStackでコンテナを動かしてみよう | サイバーエージェント 公式エンジニアブログ
みなさん こんにちは。アドテク本部所属の長谷川(@makocchi)です。


サイバーエージェントと言えばこの blog や pigg のようにゲームやコミュニティのサービスを思い浮かべる方が多いと思いますが、 広告系のアドテクサービスも幅広く展開しています。
アドテクって何?という方はこちらの adtech blog日本一やさしいアドテク教室を見て頂けるとイメージしやすいかと思います。

アドテク本部ではデータセンターにプライベートクラウドを持っていて、たくさんのアドテクのサービスがプライベートクラウドで動いています。
プライベートクラウドについていくつか外部のイベント等でお話をさせて頂いたりしているのでご存知の方もいらっしゃると思いますが、 アドテク本部のプライベートクラウドは OpenStack が採用されています。

OpenStack についてはこの場では詳しく説明しませんが、日本仮想化技術株式会社の宮原さんが書かれた Think IT の記事「OpenStack のアーキテクチャを理解しよう」がとてもよくまとまっていますので是非御覧ください。


最近は OpenStack を採用する会社も増えてきているようです。
(サイバーエージェントも実は結構前から OpenStack を使っているんですよ)


OpenStack は開発のスピードが非常に早く、半年に 1 回大規模な version up が行われます。
(最近の動向ですとコンポーネント毎に個別で version up をしていく方向に変わりつつあります)
OpenStack の version はちょっと特徴的でアルファベット順に OpenStack Summit が開催される国の地名が付きます。
2015年12月現在の最新 version は Liberty ですが、その次は Mitaka と続きます。
M ではついに日本の地名が付くことになりました。


OpenStack Summit と言えば、今年は5月にカナダで開催されましたが10月に日本の東京で開催されました。ご存知の方がいるかもしれませんが、東京の Summit では Keynote に登壇させていただきました!


さて OpenStack のお話はここまでにして本題に入りましょう。

本日は OpenStack のコンポーネントである Magnum というものを動かしてみようと思います。
Magnum ですよ Magnum。なんか名前がかっこいいですよね!

OpenStack Magnum とは

最近はコンテナ技術が盛んになってきていて使えることが当たり前になりつつあります。
その一方で煩雑になりがちなコンテナ達をどうやって管理(オーケストレーション)しようか、という話題も出てきました。

そこでコンテナのオーケストレーションツールとして Kubernetes や docker swarm 等が出てきたのはみなさんご存知の通りです。

OpenStack Magnum はこれらのオーケストレーションツールを OpenStack で管理できるようにするためのコンポーネントになります。
つまり、コンテナのオーケストレーションツールをオーケストレーションするものということになりますね。

OpenStack にはオーケストレーション機能を提供する Heat というコンポーネントがあります。
OpenStack Magnum はこの Heat と連動し、OpenStack 内にオーケストレーションツールをオーケストレーションします。

出展:http://www.openstack.org/assets/pdf-downloads/Containers-and-OpenStack.pdf

この Magnum ですが、まだ正式な OpenStack のコンポーネントには入っていません。 Liberty には間に合わないと思いますが、Mitaka もしくはその次あたりで入ってくるかもしれませんので今のうちから慣れておきましょう!

OpenStack Magnum をインストールする・・・前に

OpenStack Magnum は当然ながら OpenStack のコンポーネントですので既に稼働している OpenStack 環境が無いと動きません。

OpenStack を動かすためにはいくつか方法がありますが、比較的簡単に構築できるのは devstackpackstack といったツールになります。

devstack や packstack を使った OpenStack の install の仕方はここでは省略しますが、いろいろ記事が公開されてますのでそれを見ながら構築してください。

OpenStack Magnum をインストールする(devstack)

devstack を使って構築していればこちらの手順書の通り、devstack/local.conf[[local|localrc]] のセクションに下記の設定を入れます。
ここでは最新の stable である kilo の branch を指定しています。

enable_plugin magnum https://github.com/openstack/magnum stable/kilo
その後 stack.sh を実行してコーヒーでも飲んで待っていると magnum が devstack で動きます。 成功すれば magnum-api 及び magnum-conductor のプロセスが上がっているはずです。

OpenStack Magnum をインストールする(RDO)

packstack で OpenStack を作成した場合や RDO の repository を使って OpenStack を構築した場合は rpm で OpenStack Magnum を入れることができれば理想的なのですが、RDO には現在のところ OpenStack Magnum の rpm は提供されていません。
ですが rpm 自体は実は copr に存在していてこちらにありますので、こちらを入れるのが楽だと思います。

OpenStack Magnum をインストールする(その他)

パッケージやツールを使わないでインストールする場合は git から clone してインストールすれば OK です。
方法は公式の Document の通りにすればいけると思います。

$ git clone https://git.openstack.org/openstack/magnum
$ cd magnum
$ sudo pip install -e .

インストール以外にも幾つか作業が必要ですのでやっておきましょう。

# create the magnum conf directory
$ sudo mkdir -p /etc/magnum

# copy sample config and modify it as necessary
$ sudo cp etc/magnum/magnum.conf.sample /etc/magnum/magnum.conf

# copy policy.json
$ sudo cp etc/magnum/policy.json /etc/magnum/policy.json

OpenStack の認証に Magnum を登録する

この作業は devstack を使っていれば devstack がやってくれるので必要ありません。
自前でインストールした場合には既存の OpenStack 環境に Magnum の情報を登録する必要があります。

まず OpenStack の backend の Database に magnum が使用する database を作成します。 ここでは magnum という Database と magnum という user を作成しています。

$ mysql -h <your_openstack_db_ip> -u<user> -p<pass> mysql <<EOF
CREATE DATABASE IF NOT EXISTS magnum DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON magnum.* TO
    ‘magnum'@'%' IDENTIFIED BY 'password'
EOF

次に OpenStack の backend の rabbitmq に magnum ユーザーを追加します。 ここでは vhost を / にしています。環境によって変えて下さい。

$ rabbitmqctl add_user magnum password
$ rabbitmqctl set_permissions -p / magnum “.*" ".*" ".*"

そして認証(Keystone) に service を追加して endpoint を作成します。
endpoint の ip アドレスは magnum-api や magnum-conductor が動いているサーバーの ip にしてください。

$ keystone service-create --name=magnum \
                         --type=container \
                         --description=“OpenStack Container Service"

$ keystone endpoint-create --service=magnum \
                          --publicurl=http://<api_server_ip>:9511/v1 \
                          --internalurl=http://<api_server_ip>:9511/v1 \
                          --adminurl=http://<api_server_ip>:9511/v1 \
                          --region <your region>

OpenStack Magnum を設定する

設定ファイルは /etc/magnum/magnum.conf になります。 いろいろ設定する項目がありますが、最低限これらを設定しておけば動いてくれると思います。 rpm_backend には rabbitmq を使用することを前提にしてます。rabbitmq 以外にも ZeroMQ とか使えます。 debug や verbose については必要に応じて有効にしてください。 database の connection や rabbitmq の接続情報は先ほど作成した user や password を指定してください。

[DEFAULT]
debug = true
verbose = true
rpc_backend = rabbit

[api]
host = 0.0.0.0

[database]
connection = mysql://magnum:password@<user_openstack_db_ip>/magnum

[keystone_authtoken]
auth_uri = http://<your_keystone_ip>:5000
identity_uri = http://<your_keystone_ip>:35357
admin_user = magnum
admin_password = password
admin_tenant_name = service

[oslo_messaging_rabbit]
rabbit_hosts = <your_rabbitmq_ip>:5672
rabbit_userid = magnum
rabbit_password = password
rabbit_virtual_host = /

conf ファイルを設定する際には直接編集することももちろん可能ですが、OpenStack の conf ファイルは何かと肥大化しており(設定項目がやたら多かったり、ほとんどコメントだったりしますが)
いちいち開いて編集するのもめんどくさくなっています。 そこで conf を編集するツール openstack-config が用意されています。
RedHat 系を前提に作られていますが、openstack-config であれば ubuntu 系でも使うことができます。 その場合は crudini を別途 install してください。

openstack-config を使用する場合はこんな感じになります。

$ sudo openstack-config --set /etc/magnum/magnum.conf DEFAULT debug true
$ sudo openstack-config --set /etc/magnum/magnum.conf DEFAULT verbose true
$ sudo openstack-config --set /etc/magnum/magnum.conf DEFAULT rpc_backend rabbit
$ sudo openstack-config --set /etc/magnum/magnum.conf api host 0.0.0.0
$ sudo openstack-config --set /etc/magnum/magnum.conf database connection mysql://magnum:password@<user_openstack_db_ip>/magnum
$ sudo openstack-config --set /etc/magnum/magnum.conf keystone_authtoken auth_uri http://<your_keystone_ip>:5000
$ sudo openstack-config --set /etc/magnum/magnum.conf keystone_authtoken identity_uri http://<your_keystone_ip>:35357
$ sudo openstack-config --set /etc/magnum/magnum.conf keystone_authtoken admin_user magnum
$ sudo openstack-config --set /etc/magnum/magnum.conf keystone_authtoken admin_password password
$ sudo openstack-config --set /etc/magnum/magnum.conf keystone_authtoken admin_tenant_name service
$ sudo openstack-config --set /etc/magnum/magnum.conf oslo_messaging_rabbit rabbit_hosts <your_rabbitmq_ip>:5672
$ sudo openstack-config --set /etc/magnum/magnum.conf oslo_messaging_rabbit rabbit_userid magnum
$ sudo openstack-config --set /etc/magnum/magnum.conf oslo_messaging_rabbit rabbit_password password
$ sudo openstack-config --set /etc/magnum/magnum.conf oslo_messaging_rabbit rabbit_virtual_host /

OpenStack Magnum API を起動する

一番簡単なのはそのまま叩いてしまうことです。
forground で起動されます。

$ /path/to/magnum-api
$ /path/to/magnum-conductor

systemd が配下で動かす場合は下記の service ファイルを使って下さい。
先ほどの rpm を使えばこちらは配置されているはずです。

openstack-magnum-api.service

[Unit]
Description=OpenStack Magnum API Service
After=syslog.target network.target

[Service]
Type=simple
User=magnum
ExecStart=/usr/bin/magnum-api

[Install]
WantedBy=multi-user.target

openstack-magnum-conductor.service

[Unit]
Description=Openstack Magnum Conductor Service
After=syslog.target network.target qpidd.service mysqld.service openstack-keystone.service tgtd.service openstack-glance-api.service openstack-glance-registry.service openstack-nova-api.service openstack-nova-objectstore.service openstack-nova.compute.service openstack-nova-network.service openstack-nova-volume.service openstack-nova-scheduler.service openstack-nova-cert.service openstack-cinder-volume.service

[Service]
Type=simple
User=magnum
ExecStart=/usr/bin/magnum-conductor

[Install]
WantedBy=multi-user.target

python-magnumclient をインストールする

現時点では OpenStack Magnum は OpenStack の管理画面(Horizon) から操作することはできません。
ですが Horizon の pluggin として ui の開発が始まっているようです。
将来的には管理画面からポチポチできるようになると思いますが、現時点ではおとなしく python-magnumclient を使いましょう。
virtualenv で入れておくことをおすすめします。

$ git clone https://git.openstack.org/openstack/python-magnumclient
cd python-magnumclient
pip install -e .

これで OpenStack Magnum を使う準備が整いました!

baymodel を作成する

まずは baymodel を作成します。baymodel っていうのは次に作る bay の定義と考えて下さい。
baymodel では使用する image や keypair、オーケストレーション(COE)等を定義します。
この際に使用する image や keypair が無いと作ることができませんので、まずは準備をします。

現時点では OpenStack Magnum が support しているのは Fedora AtomicCoreOS だけのようです。(CentOS Atomic も多分動くと思いますが)
ここでは Fedora の Atomic を登録してみます。
まずは https://getfedora.org/ja/cloud/download/atomic.html から qcow2 のイメージを取得します。
記事を書いている時点での最新は Fedora-Cloud-Atomic-22-20150521.x86_64.qcow2 のようです。

$ wget https://download.fedoraproject.org/pub/fedora/linux/releases/22/Cloud/x86_64/Images/Fedora-Cloud-Atomic-22-20150521.x86_64.qcow2

その後 OpenStack の image 管理(Glance) に登録します。

$ glance image-create --file ./Fedora-Cloud-Atomic-22-20150521.x86_64.qcow2  --is-public True --disk-format qcow2 --container-format bare --property os_distro=fedora-atomic --name Fedora-Cloud-Atomic-22-20150521 --progress

注意点としてはイメージの meta 情報の os_distro に fedora-atomic を入れておくことです。
これが無いと bay の作成に失敗します。

続いて keypair を登録します。
keypair の名前はなんでもいいです。ここでは適当に default という名前で登録します。

$ nova keypair-add --pub-key openstack_key.pub default

それから使用する external network の uuid を調べておきます。

$ neutron net-show public --format value --fields id
931ef60c-d132-4bfa-9136-182c7b723d79

これで準備が整いました。

さっそく baymodel を作ってみます。
今回は dockerswarm を使う baymodel swarmbaymodel を作ってみます。
(最新の magnum だと network の指定は uuid ではなくて名前でいけるようになったようです)

$ magnum baymodel-create --name swarmbaymodel --image-id Fedora-Cloud-Atomic-22-20150521 --keypair-id default --external-network-id 931ef60c-d132-4bfa-9136-182c7b723d79 --flavor-id m1.small --coe swarm

作成した baymodel は magnum baymodel-list で見ることができます。

$ magnum baymodel-list
+--------------------------------------+---------------+
| uuid                                 | name          |
+--------------------------------------+---------------+
| f433f2d9-3592-452f-9642-d7ffadc52b2f | swarmbaymodel |
+--------------------------------------+---------------+

また、magnum baymode-show swarmbaymodel とすることで詳細を表示することができます。

bay を作成する

baymodel が作成できたので bay を作成してみましょう。

$ magnum bay-create --name swarm bay --baymodel swarmbaymodel --node-count 1

magnum-bay list を見ると CREATE_IN_PROGRESS になっていると思います

$ magnum bay-list
+--------------------------------------+----------+------------+--------------+--------------------+ | uuid | name | node_count | master_count | status | +--------------------------------------+----------+------------+--------------+--------------------+ | 0643a67f-fce8-41aa-b8c8-ee2854174b15 | swarmbay | 1 | | CREATE_IN_PROGRESS | +--------------------------------------+----------+------------+--------------+--------------------+

この時内部的には Heat が動いています。

$ heat stack-list
+--------------------------------------+-----------------------+--------------------+----------------------+
| id                                   | stack_name            | stack_status       | creation_time        |
+--------------------------------------+-----------------------+--------------------+----------------------+
| 9d850fc8-7940-4523-aa1a-a5aee8931a28 | swarmbay-ur35j3pus33u | CREATE_IN_PROGRESS | 2015-09-11T00:57:35  |
+--------------------------------------+-----------------------+--------------------+----------------------+

heat resource-list swarmbay-ur35j3pus33u とするとどんな処理をしているのか確認することができます。
Heat は管理画面(Horizon) から確認することができますので、bay-create をすると管理画面から確認することができます。
しばらくすると CREATE_COMPLETE になると思います。

それではさっそくコンテナを動かしてみます。
docker/whalesay を使って鯨に Magnum と言わせてみましょう。

$ magnum container-create --bay swarmbay --name whale_magnum --image docker/whalesay --command "cowsay magnum”
$ magnum container-list
+--------------------------------------+--------------+---------+
| uuid                                 | name         | status  |
+--------------------------------------+--------------+---------+
| 481ac897-d922-45ac-a4e6-59198f780f6f | whale_magnum | Stopped |
+--------------------------------------+--------------+---------+

コンテナを実行してみます。

$ magnum container-start whale_magnum
$ magnum container-logs whale_magnum
 ________
< magnum >
 -------- 
   \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

無事に動きました!

もちろんコンテナを実行させている swarmbay の中にも login することが可能です。
magnum bay-create した際に Heat によってインスタンスが作られていると思います。
今回は fedora の Atomic で作成してますので fedora@ で login します。
中に入ると docker が動いているのが確認できます。

$ ssh fedora@192.168.0.209
[fedora@sw-inltgwe3sxe-0-qgs7s3w5s5cg-swarm-node-raxqpfeo45ud ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                       COMMAND                CREATED             STATUS                      PORTS               NAMES
00eb818dfe19        docker/whalesay:latest      "cowsay magnum"        5 minutes ago       Exited (0) 4 minutes ago                        whale_magnum
be9d3809265b        swarm:0.2.0                 "/swarm join --addr    2 weeks ago         Up 2 weeks                  2375/tcp            swarm-agent

もっといろいろなコンテナイメージを使って動かしてみようと思ったのですが、ちょっと時間が無いので今日はこれまで!
要望があれば時間作って検証してみたいと思っています。

docker swarm だけじゃない

今回は baymodel に docker swarm を使いましたが、他にも Kubernetes と mesos にも対応しています。
Kubernetes については最近は が GA となり、version も 1.0 がリリースされました。
その際に内部の API が v1beta3 から v1 に変わりましたが、まだ Magnum では v1 には対応してないので Kubernetes の GA 版が動かせないのが残念なところですね。

おわりに

OpenStack Magnum いかがでしたでしょうか。
まだ絶賛開発中のコンポーネントではあるのでサービスで使う場合は十分に注意する必要がありますが、OpenStack が動いている開発環境とかでコンテナを動かしてみたい場合とかには向いてると思います。
現在のところはコマンドラインでしかいろいろ操作できませんが、OpenStack の管理画面 (Horizon) の pluggin も開発が始まっているようです。

Magnum の他にも開発中のコンポーネントはたくさんあり、例えば DNS 管理の Designate、メッセージングサービスの Zaqar、鍵管理の Barbican、ファイル共有の Manila などたくさん進行中です。

OpenStack はすべて OSS で出来ています。
新しいサービスの開発や既存の bugfix 等、誰にでも可能です。
興味がありましたら是非 OpenStack へコントリビュートしてみましょう!
実は自分もちょっとだけ貢献しました。これからもちょこちょこ貢献していきたいと思います!