2013年4月12日金曜日

Use full functions of OpenStack Grizzly with devstack


このエントリーをはてなブックマークに追加


Devstackを使ってOpenStack Grizzlyのフル機能を使ってみます。

Grizzlyリリースの情報は以下から入手できます。

サマリ:http://www.slideshare.net/yosshy/openstack-grizzly-release-18354936
原文:https://wiki.openstack.org/wiki/ReleaseNotes/Grizzly
日本語訳:http://openstack.jp/news/20130405.html


環境サマリ

この手順で構築される環境は以下になります。

* nova
* quantum
 - OVS + GRE
 - LBaaS
* cinder
* glance
* keystone
* horizon
* swift
* tempest


事前準備

仮想マシンで構いませんので

1vCPU, 2GBメモリ以上
Ubuntu12.04 64bit

を準備しておきます。メモリは2GB以下だと、各プロセスの起動に時間がかかりすぎてエラーになる場合があります。


devstackの取得

$ git clone https://github.com/openstack-dev/devstack.git
$ cd devstack
$ git checkout -b grizzly remotes/origin/stable/grizzly

localrc

localrc を以下のように定義します。
$ cd devstack
$ vim localrc
HOST_IP=192.168.100.10

LOGFILE=stack.sh.log

ADMIN_PASSWORD=openstack
MYSQL_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=admintoken

# use spice console
#disable_service n-net
#disable_service n-novnc
#disable_service n-xvnc
#enable_service n-spice

# use swift
disable_service n-obj
enable_service swift

# use quantum
disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service q-lbaas
enable_service quantum

# use tempest
enable_service tempest

# use ovs + gre tunnel for virtual network
ENABLE_TENANT_TUNNELS=True

# initial network info
FIXED_RANGE=172.24.17.0/24
NETWORK_GATEWAY=172.24.17.254
FLOATING_RANGE=10.0.0.0/24

# for cinder
VOLUME_BACKING_FILE_SIZE=4096M

# for swift
SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5

# optional: set keymap
EXTRA_OPTS=(
vnc_keymap=ja
)
* spice はまだうまく使えなかったのでコメント化しています。

$ ./stack.sh

以上で終了です。

いくつか特徴的な機能を見てみます。


Quantum LBaaS

GrizzlyからQuantumにLBaaSがマージされました。まだ完全ではありませんが、HAProxyを使った基本的なロードバランサを構築可能です。Network Namespaceを利用しているので、RHEL系では動きません。
$ source openrc
■まずセキュリティグループを編集して、SSH, HTTP, PING通信が可能な状態にしておきます。
$ nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
$ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
$ nova secgroup-add-rule default tcp 80 80 0.0.0.0/0
$ nova secgroup-list-rules default
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
|             | -1        | -1      |           | default      |
|             | -1        | -1      |           | default      |
| icmp        | -1        | -1      | 0.0.0.0/0 |              |
| tcp         | 22        | 22      | 0.0.0.0/0 |              |
| tcp         | 80        | 80      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+


■インスタンスを作成します。
$ nova boot --flavor m1.tiny --image 98847803-6231-40a3-9953-559233497849 --nic net-id=574d032b-a44c-4b0a-b7aa-9a7fcc515e12 vm1
$ nova boot --flavor m1.tiny --image 98847803-6231-40a3-9953-559233497849 --nic net-id=574d032b-a44c-4b0a-b7aa-9a7fcc515e12 vm2
$ nova list
+--------------------------------------+------+--------+---------------------+
| ID                                   | Name | Status | Networks            |
+--------------------------------------+------+--------+---------------------+
| 7cd0986b-762f-40b9-9a33-ac55ef69d0f8 | vm1  | ACTIVE | private=172.24.17.2 |
| 925043ee-4ea8-45bf-94a3-8c91d161af91 | vm2  | ACTIVE | private=172.24.17.3 |
+--------------------------------------+------+--------+---------------------+


■疎通テストを行います。これはNetwork Namespace内から実施します。
$ sudo ip netns
qrouter-ec182694-80a1-4c58-a54e-71b4277e19de
qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 ping -q -c 1 172.24.17.2
PING 172.24.17.2 (172.24.17.2) 56(84) bytes of data.

--- 172.24.17.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 127.558/127.558/127.558/0.000 ms

$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 ping -q -c 1 172.24.17.3
PING 172.24.17.3 (172.24.17.3) 56(84) bytes of data.

--- 172.24.17.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 53.476/53.476/53.476/0.000 ms


■各仮想マシンへログインし、ポート80番で待ち受けるプロセスを起動します。
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 ssh cirros@172.24.17.2
vm1$ while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nvm1' | sudo nc -l -p 80 ; done
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 ssh cirros@172.24.17.3
vm2$ while true; do echo -e 'HTTP/1.0 200 OK\r\n\r\nvm2' | sudo nc -l -p 80 ; done
■各サーバへアクセスします。
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.2
vm1
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.3
vm2
■仮想LBを作成していきます。
$ quantum subnet-list
+--------------------------------------+------+----------------+--------------------------------------------------+
| id                                   | name | cidr           | allocation_pools                                 |
+--------------------------------------+------+----------------+--------------------------------------------------+
| 8cf82ccd-b158-460f-a284-cee2be32fc7a |      | 172.24.17.0/24 | {"start": "172.24.17.1", "end": "172.24.17.253"} |
+--------------------------------------+------+----------------+--------------------------------------------------+

■プールを作成し、サブネットを割り当てます。
$ quantum lb-pool-create --lb-method ROUND_ROBIN --name mypool --protocol HTTP --subnet-id 8cf82ccd-b158-460f-a284-cee2be32fc7a
Created a new pool:
+-----------------+--------------------------------------+
| Field           | Value                                |
+-----------------+--------------------------------------+
| admin_state_up  | True                                 |
| description     |                                      |
| health_monitors |                                      |
| id              | 3341c179-43a9-4337-8427-2d490d06ffec |
| lb_method       | ROUND_ROBIN                          |
| members         |                                      |
| name            | mypool                               |
| protocol        | HTTP                                 |
| status          | PENDING_CREATE                       |
| subnet_id       | 8cf82ccd-b158-460f-a284-cee2be32fc7a |
| tenant_id       | 77d868945fa249e59bd072e027bda1a0     |
| vip_id          |                                      |
+-----------------+--------------------------------------+

$ quantum lb-pool-list
+--------------------------------------+--------+-------------+----------+----------------+----------------+
| id                                   | name   | lb_method   | protocol | admin_state_up | status         |
+--------------------------------------+--------+-------------+----------+----------------+----------------+
| 3341c179-43a9-4337-8427-2d490d06ffec | mypool | ROUND_ROBIN | HTTP     | True           | PENDING_CREATE |
+--------------------------------------+--------+-------------+----------+----------------+----------------+

■プールにメンバーを加えます。
$ quantum lb-member-create --address 172.24.17.2 --protocol-port 80 mypool
Created a new member:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 172.24.17.2                          |
| admin_state_up | True                                 |
| id             | 0a6e7caf-8dc0-41d2-b2df-c5f919277022 |
| pool_id        | 3341c179-43a9-4337-8427-2d490d06ffec |
| protocol_port  | 80                                   |
| status         | PENDING_CREATE                       |
| tenant_id      | 77d868945fa249e59bd072e027bda1a0     |
| weight         | 1                                    |
+----------------+--------------------------------------+

$ quantum lb-member-create --address 172.24.17.3 --protocol-port 80 mypool
Created a new member:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 172.24.17.3                          |
| admin_state_up | True                                 |
| id             | d03c237c-b549-4bfb-a281-189ddd1ccb25 |
| pool_id        | 3341c179-43a9-4337-8427-2d490d06ffec |
| protocol_port  | 80                                   |
| status         | PENDING_CREATE                       |
| tenant_id      | 77d868945fa249e59bd072e027bda1a0     |
| weight         | 1                                    |
+----------------+--------------------------------------+

■モニタリングルールを作成します。
$ quantum lb-healthmonitor-create --delay 3 --type HTTP --max-retries 3 --timeout 3
Created a new health_monitor:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| admin_state_up | True                                 |
| delay          | 3                                    |
| expected_codes | 200                                  |
| http_method    | GET                                  |
| id             | 35ed6c95-13b5-4013-a21c-d15eaa01d8ec |
| max_retries    | 3                                    |
| status         | PENDING_CREATE                       |
| tenant_id      | 77d868945fa249e59bd072e027bda1a0     |
| timeout        | 3                                    |
| type           | HTTP                                 |
| url_path       | /                                    |
+----------------+--------------------------------------+

$ quantum lb-healthmonitor-list
+--------------------------------------+------+----------------+----------------+
| id                                   | type | admin_state_up | status         |
+--------------------------------------+------+----------------+----------------+
| 35ed6c95-13b5-4013-a21c-d15eaa01d8ec | HTTP | True           | PENDING_CREATE |
+--------------------------------------+------+----------------+----------------+

■作成したプールとモニタリングルールを関連付けます。
$ quantum lb-healthmonitor-associate 35ed6c95-13b5-4013-a21c-d15eaa01d8ec mypool
Associated health monitor 35ed6c95-13b5-4013-a21c-d15eaa01d8ec


■最後に仮想IPを作成します
$ quantum lb-vip-create --name myvip --protocol-port 80 --protocol HTTP --subnet-id 8cf82ccd-b158-460f-a284-cee2be32fc7a mypool
Created a new vip:
+------------------+--------------------------------------+
| Field            | Value                                |
+------------------+--------------------------------------+
| address          | 172.24.17.4                          |
| admin_state_up   | True                                 |
| connection_limit | -1                                   |
| description      |                                      |
| id               | 02517419-7a07-425d-87f6-75ce1151c550 |
| name             | myvip                                |
| pool_id          | 3341c179-43a9-4337-8427-2d490d06ffec |
| port_id          | f212b520-d314-481b-9110-eb2ad24e374a |
| protocol         | HTTP                                 |
| protocol_port    | 80                                   |
| status           | PENDING_CREATE                       |
| subnet_id        | 8cf82ccd-b158-460f-a284-cee2be32fc7a |
| tenant_id        | 77d868945fa249e59bd072e027bda1a0     |
+------------------+--------------------------------------+

$ quantum lb-vip-list
+--------------------------------------+-------+-------------+----------+----------------+--------+
| id                                   | name  | address     | protocol | admin_state_up | status |
+--------------------------------------+-------+-------------+----------+----------------+--------+
| 02517419-7a07-425d-87f6-75ce1151c550 | myvip | 172.24.17.4 | HTTP     | True           | ACTIVE |
+--------------------------------------+-------+-------------+----------+----------------+--------+

$ quantum lb-pool-list
+--------------------------------------+--------+-------------+----------+----------------+--------+
| id                                   | name   | lb_method   | protocol | admin_state_up | status |
+--------------------------------------+--------+-------------+----------+----------------+--------+
| 3341c179-43a9-4337-8427-2d490d06ffec | mypool | ROUND_ROBIN | HTTP     | True           | ACTIVE |
+--------------------------------------+--------+-------------+----------+----------------+--------+

$ quantum lb-healthmonitor-list
+--------------------------------------+------+----------------+--------+
| id                                   | type | admin_state_up | status |
+--------------------------------------+------+----------------+--------+
| 35ed6c95-13b5-4013-a21c-d15eaa01d8ec | HTTP | True           | ACTIVE |
+--------------------------------------+------+----------------+--------+

$ quantum lb-member-list
+--------------------------------------+-------------+---------------+----------------+--------+
| id                                   | address     | protocol_port | admin_state_up | status |
+--------------------------------------+-------------+---------------+----------------+--------+
| 0a6e7caf-8dc0-41d2-b2df-c5f919277022 | 172.24.17.2 |            80 | True           | ACTIVE |
| d03c237c-b549-4bfb-a281-189ddd1ccb25 | 172.24.17.3 |            80 | True           | ACTIVE |
+--------------------------------------+-------------+---------------+----------------+--------+

■HAProxyが起動していることが確認できます。
$ ps -ef |grep haproxy
nobody   30074     1  0 00:33 ?        00:00:00 haproxy -f /opt/stack/data/quantum/lbaas/3341c179-43a9-4337-8427-2d490d06ffec/conf -p /opt/stack/data/quantum/lbaas/3341c179-43a9-4337-8427-2d490d06ffec/pid

$ sudo ip netns
qlbaas-3341c179-43a9-4337-8427-2d490d06ffec
qrouter-ec182694-80a1-4c58-a54e-71b4277e19de
qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12

$ sudo ip netns exec qlbaas-3341c179-43a9-4337-8427-2d490d06ffec ip addr
24: tapf212b520-d3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether fa:16:3e:b2:2d:c8 brd ff:ff:ff:ff:ff:ff
    inet 172.24.17.4/24 brd 172.24.17.255 scope global tapf212b520-d3
    inet6 fe80::f816:3eff:feb2:2dc8/64 scope link 
       valid_lft forever preferred_lft forever
25: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

■ラウンドロビンで分散されていることが確認できます。
$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.4
vm2

$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.4
vm1

$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.4
vm2

$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.4
vm1

$ sudo ip netns exec qdhcp-574d032b-a44c-4b0a-b7aa-9a7fcc515e12 curl 172.24.17.4
vm2



Quantum L3,DHCP

Grizzlyでは、Folsomで議論されていたL3/DHCPのボトルネックを解消するために、分散構成(nova-networkのmulti_hostのようなイメージ)が取れるようになっています。

具体的には複数のL3/DHCPエージェントを起動して、仮想ルータやdnsmasqをどのホストへ配置するか指定できるようになっており、API/quantumコマンドのサブコマンドにいくつかの追加がなされています。
Commands for API v2.0:
  agent-delete                   Delete a given agent.
  agent-list                     List agents.
  agent-show                     Show information of a given agent.
  agent-update                   Update a given agent.
  dhcp-agent-list-hosting-net    List DHCP agents hosting a network.
  dhcp-agent-network-add         Add a network to a DHCP agent.
  dhcp-agent-network-remove      Remove a network from a DHCP agent.
  l3-agent-list-hosting-router   List L3 agents hosting a router.
  l3-agent-router-add            Add a router to a L3 agent.
  l3-agent-router-remove         Remove a router from a L3 agent.
  net-list-on-dhcp-agent         List the networks on a DHCP agent.
  router-list-on-l3-agent        List the routers on a L3 agent.

$ quantum agent-list
+--------------------------------------+--------------------+--------+-------+----------------+
| id                                   | agent_type         | host   | alive | admin_state_up |
+--------------------------------------+--------------------+--------+-------+----------------+
| 7436f0e9-572a-4450-8c2f-a3f9309b0512 | DHCP agent         | ubuntu | :-)   | True           |
| 8a2e658d-25bb-4381-ad8f-264680058ea0 | Open vSwitch agent | ubuntu | :-)   | True           |
| d9291a93-12a8-419e-85a8-9ddf11283912 | L3 agent           | ubuntu | :-)   | True           |
+--------------------------------------+--------------------+--------+-------+----------------+

$ quantum dhcp-agent-list-hosting-net 574d032b-a44c-4b0a-b7aa-9a7fcc515e12
+--------------------------------------+--------+----------------+-------+
| id                                   | host   | admin_state_up | alive |
+--------------------------------------+--------+----------------+-------+
| 7436f0e9-572a-4450-8c2f-a3f9309b0512 | ubuntu | True           | :-)   |
+--------------------------------------+--------+----------------+-------+

$ quantum l3-agent-list-hosting-router ec182694-80a1-4c58-a54e-71b4277e19de
+--------------------------------------+--------+----------------+-------+
| id                                   | host   | admin_state_up | alive |
+--------------------------------------+--------+----------------+-------+
| d9291a93-12a8-419e-85a8-9ddf11283912 | ubuntu | True           | :-)   |
+--------------------------------------+--------+----------------+-------+


ただしこの機能は可用性を担保する機能ではありません。仮想ルータやDHCPの冗長構成については今後実装が議論される予定になっています。



Quantum Metadata

MetadataはVMが自分自身の動作環境をOpenStackへ問い合わせるために使用する機能で、VMがMetadataサーバーへアクセスすることで自身が動作しているAvailability Zone情報等を知ることができます。

これまでNovaを中心として、OpenStackはVMに割り当てられるアドレスがユニークであることを前提に実装されてきたため、Metadataサーバではアクセス元VMのIPアドレスを見て、返す情報を決定してきました。

しかし、Qunatumによって仮想ネットワークが実装されたことで、別のVMが同じアドレスを持つことが可能になり、この実装では問題が発生するようになりました。またQuantumによって作られた仮想ネットワークはそのままではnova-metadataサーバとは通信できない環境に存在するので、Folsomの頃は個別にルーティングを設定しなければなりませんでした。

この問題を回避するために、実装されたのが Quantum Metadataになります。Quantum MetadataサーバはProxyのように動作し、アクセス元のVMを特定した後に、Nova Metadata への問い合わせを行います。

$ curl http://169.254.169.254
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04

$ curl http://169.254.169.254/2009-04-04
meta-data/

$ curl http://169.254.169.254/2009-04-04/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
kernel-id
local-hostname
local-ipv4
placement/
public-hostname
public-ipv4
ramdisk-id
reservation-id

$ curl http://169.254.169.254/2009-04-04/meta-data/placement/
availability-zone

$ curl http://169.254.169.254/2009-04-04/meta-data/placement/availability-zone
nova


Tempest

Grizzlyからというわけではありませんが、最後にTempestを簡単に紹介しておきます。

これはOpenStackの自動テストツールで、環境が正しく動いているかテストを実施してくれます。Pythonのテストフレームワークである unittest2 nose を利用しています。

様々なテストが実施できます。

$ cd /opt/stack/tempest

テストの条件は以下で設定されています。devstackでインストールした場合、基本的な設定は自動で行われています。
$ etc/tempest.conf

すべてのテストを実行するには以下を実行します。
$ nosetests tempest

特定のテストを実行することも可能です。
$ nosetests tempest/tests/compute/servers/test_create_server.py
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_can_log_into_created_server ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_create_server_response[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_list_servers[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_can_log_into_created_server ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_create_server_response[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_can_log_into_created_server ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_create_server_response[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_host_name_is_same_as_server_name ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_list_servers[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_list_servers_with_detail[smoke] ... ok
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_verify_created_server_vcpus ... SKIP: Instance validation tests are disabled.
tempest.tests.compute.servers.test_create_server.ServersTestXML.test_verify_server_details[smoke] ... ok

----------------------------------------------------------------------
Ran 21 tests in 148.013s

OK (SKIP=9)


参考

QuantumDevstack: https://wiki.openstack.org/wiki/QuantumDevstack

Quantum/LBaaS/HowToRun: https://wiki.openstack.org/wiki/Quantum/LBaaS/HowToRun

OpenStack QA: http://joinfu.com/presentations/openstack-qa-processes/openstack-qa-processes.pdf

1 件のコメント:

Arindam Choudhury さんのコメント...

Thanks a lot for this detailed tutorial. Hope to see more posts from you.

コメントを投稿