Openstack のLBaasを試してみた

投稿者: | 2015年6月3日

Openstack のLBaasを試してみた

OpenstackのneutronにはLBaaS(Load Balancer as a Service)の機能がある。
RDOのデフォルトだと無効になっているが、割と便利なので使い方のメモを残しておく。

テスト環境

まずは、ロードバランスの対象となるインスタンスを3つほど起動しておく。

$ openstack server list  --name web-server
+--------------------------------------+--------------+--------+--------------------------------+
| ID                                   | Name         | Status | Networks                       |
+--------------------------------------+--------------+--------+--------------------------------+
| d221bc75-fa0a-4c61-a8ed-e3a8d98d6011 | web-server-3 | ACTIVE | sakura-network=192.168.100.167 |
| 9b35519e-6229-47b6-8a3a-bdf41099ad41 | web-server-2 | ACTIVE | sakura-network=192.168.100.166 |
| 5bfdcc4e-e088-474d-8847-f185a470d27a | web-server-1 | ACTIVE | sakura-network=192.168.100.165 |
+--------------------------------------+--------------+--------+--------------------------------+

所属しているネットワークは、sakura-network

$ openstack server show web-server-1 -f json |jq '.[]| select(.Field == "addresses") '
{
  "Field": "addresses",
  "Value": "sakura-network=192.168.100.165"
}

サブネットは、sakura-subnet

$ neutron subnet-show b47756e2-a744-495f-807c-76ef19a27fdc
+-------------------+------------------------------------------------------+
| Field             | Value                                                |
+-------------------+------------------------------------------------------+
| allocation_pools  | {"start": "192.168.100.2", "end": "192.168.100.254"} |
| cidr              | 192.168.100.0/24                                     |
| dns_nameservers   | 8.8.4.4                                              |
|                   | 8.8.8.8                                              |
| enable_dhcp       | True                                                 |
| gateway_ip        | 192.168.100.1                                        |
| host_routes       |                                                      |
| id                | b47756e2-a744-495f-807c-76ef19a27fdc                 |
| ip_version        | 4                                                    |
| ipv6_address_mode |                                                      |
| ipv6_ra_mode      |                                                      |
| name              | sakura-subnet                                        |
| network_id        | 1b115b39-d469-48e9-a5cc-d4f7bfce78fb                 |
| subnetpool_id     |                                                      |
| tenant_id         | 64709cb5dbd0454e8dd4501061d35278                     |
+-------------------+------------------------------------------------------+

この3つでそれぞれnginxが動作している。
curlでアクセスしてみると応答が返る。

$ curl "http://192.168.100.167/"
<!DOCTYPE html>
<html>
<head>
....

まとめると

  • 3インスタンスでnginxが動作している
  • sakura-networkのsakura-subnet(192.168.100.0/24)で動作している
  • 192.168.100.65, 192.168.100.66, 192.168.100.67のIPが割り当てられている

Load Balancerの作りかた

Load Balancerの作成

以下のコマンドでLoadBalancerを作成することが出来る。
なお標準的なインストールでは、このLoadBalancerは実装としてhaproxyが利用されるようだ。

neutron lb-pool-create --name http-pool --lb-method ROUND_ROBIN --protocol HTTP --subnet-id sakura-subnet
Created a new pool:
+------------------------+--------------------------------------+
| Field                  | Value                                |
+------------------------+--------------------------------------+
| admin_state_up         | True                                 |
| description            |                                      |
| health_monitors        |                                      |
| health_monitors_status |                                      |
| id                     | 6b62d089-a77f-4052-ac66-336b6e7b2c62 |
| lb_method              | ROUND_ROBIN                          |
| members                |                                      |
| name                   | http-pool                            |
| protocol               | HTTP                                 |
| provider               | haproxy                              |
| status                 | PENDING_CREATE                       |
| status_description     |                                      |
| subnet_id              | b47756e2-a744-495f-807c-76ef19a27fdc |
| tenant_id              | 64709cb5dbd0454e8dd4501061d35278     |
| vip_id                 |                                      |
+------------------------+--------------------------------------+

メンバーの追加

lb-member-createコマンドで、作成したLoadBalancerにメンバ(LoadBalanceする対象)を追加できる。

neutron lb-member-create --address 192.168.100.165 --protocol-port 80 http-pool
neutron lb-member-create --address 192.168.100.166 --protocol-port 80 http-pool
neutron lb-member-create --address 192.168.100.167 --protocol-port 80 http-pool

正しく追加できたかを確認してみる。

$ neutron lb-member-list
+--------------------------------------+-----------------+---------------+--------+----------------+--------+
| id                                   | address         | protocol_port | weight | admin_state_up | status |
+--------------------------------------+-----------------+---------------+--------+----------------+--------+
| 0ccf99f3-e252-45a8-ab41-394d873e784b | 192.168.100.167 |            80 |      1 | True           | ACTIVE |
| 7e2025b8-2bae-4014-bf7d-bbb027ee9ce4 | 192.168.100.166 |            80 |      1 | True           | ACTIVE |
| 92118549-b6f4-4ebd-88c2-f09d9168cfc9 | 192.168.100.165 |            80 |      1 | True           | ACTIVE |
+--------------------------------------+-----------------+---------------+--------+----------------+--------+
$ neutron lb-pool-show http-pool
+------------------------+--------------------------------------+
| Field                  | Value                                |
+------------------------+--------------------------------------+
| admin_state_up         | True                                 |
| description            |                                      |
| health_monitors        |                                      |
| health_monitors_status |                                      |
| id                     | 6b62d089-a77f-4052-ac66-336b6e7b2c62 |
| lb_method              | ROUND_ROBIN                          |
| members                | 0ccf99f3-e252-45a8-ab41-394d873e784b |
|                        | 7e2025b8-2bae-4014-bf7d-bbb027ee9ce4 |
|                        | 92118549-b6f4-4ebd-88c2-f09d9168cfc9 |
| name                   | http-pool                            |
| protocol               | HTTP                                 |
| provider               | haproxy                              |
| status                 | ACTIVE                               |
| status_description     |                                      |
| subnet_id              | b47756e2-a744-495f-807c-76ef19a27fdc |
| tenant_id              | 64709cb5dbd0454e8dd4501061d35278     |
| vip_id                 |                                      |
+------------------------+--------------------------------------+

http-poolにmemberが追加されていることが確認できる

ヘルスモニタを追加

メンバの死活監視のためのhealthmonitorを作成する

$ neutron lb-healthmonitor-create --delay 5 --type HTTP --max-retries 3 --timeout 2
Created a new health_monitor:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| admin_state_up | True                                 |
| delay          | 5                                    |
| expected_codes | 200                                  |
| http_method    | GET                                  |
| id             | ea06e766-8b19-40fd-bf10-daaa6b2ab8a0 |
| max_retries    | 3                                    |
| pools          |                                      |
| tenant_id      | 64709cb5dbd0454e8dd4501061d35278     |
| timeout        | 2                                    |
| type           | HTTP                                 |
| url_path       | /                                    |
+----------------+--------------------------------------+

このヘルスモニタをhttp-poolに関連付ける。

neutron lb-healthmonitor-associate ea06e766-8b19-40fd-bf10-daaa6b2ab8a0 http-pool
Associated health monitor ea06e766-8b19-40fd-bf10-daaa6b2ab8a0

neutron lb-pool-showをすると関連付けられたことを確認できる。

neutron lb-pool-show http-pool
+------------------------+--------------------------------------------------------------------------------------------------------+
| Field                  | Value                                                                                                  |
+------------------------+--------------------------------------------------------------------------------------------------------+
| admin_state_up         | True                                                                                                   |
| description            |                                                                                                        |
| health_monitors        | ea06e766-8b19-40fd-bf10-daaa6b2ab8a0                                                                   |
| health_monitors_status | {"monitor_id": "ea06e766-8b19-40fd-bf10-daaa6b2ab8a0", "status": "ACTIVE", "status_description": null} |
| id                     | 6b62d089-a77f-4052-ac66-336b6e7b2c62                                                                   |
| lb_method              | ROUND_ROBIN                                                                                            |
| members                | 0ccf99f3-e252-45a8-ab41-394d873e784b                                                                   |
|                        | 7e2025b8-2bae-4014-bf7d-bbb027ee9ce4                                                                   |
|                        | 92118549-b6f4-4ebd-88c2-f09d9168cfc9                                                                   |
| name                   | http-pool                                                                                              |
| protocol               | HTTP                                                                                                   |
| provider               | haproxy                                                                                                |
| status                 | ACTIVE                                                                                                 |
| status_description     |                                                                                                        |
| subnet_id              | b47756e2-a744-495f-807c-76ef19a27fdc                                                                   |
| tenant_id              | 64709cb5dbd0454e8dd4501061d35278                                                                       |
| vip_id                 |                                                                                                        |
+------------------------+--------------------------------------------------------------------------------------------------------+

virtual ip の作成

load balancerが利用するvipを追加する。

neutron lb-vip-create --name http-vip --protocol-port 80 --protocol HTTP --subnet-id sakura-subnet http-pool
Created a new vip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| address             | 192.168.100.168                      |
| admin_state_up      | True                                 |
| connection_limit    | -1                                   |
| description         |                                      |
| id                  | 85d12819-d4ed-40e4-9ef9-2c17b3923177 |
| name                | http-vip                             |
| pool_id             | 6b62d089-a77f-4052-ac66-336b6e7b2c62 |
| port_id             | b6c0bfd5-29a5-4999-84d5-e779c2cd3455 |
| protocol            | HTTP                                 |
| protocol_port       | 80                                   |
| session_persistence |                                      |
| status              | PENDING_CREATE                       |
| status_description  |                                      |
| subnet_id           | b47756e2-a744-495f-807c-76ef19a27fdc |
| tenant_id           | 64709cb5dbd0454e8dd4501061d35278     |
+---------------------+--------------------------------------+

これで、192.168.100.168にアクセスするとリクエストが各インスタンスに分散されるようになる。

$ curl 192.168.100.168
<!DOCTYPE html>
<html>
<head>
...

floating ip の関連付け

ここまでの設定で、load balancerとしては動作するようになる。
しかし、Webサーバの場合は、外部からアクセスできるようにすることが多いため
floating-ipを割り振りたくなる。

$ neutron lb-vip-list
+--------------------------------------+----------+-----------------+----------+----------------+--------+
| id                                   | name     | address         | protocol | admin_state_up | status |
+--------------------------------------+----------+-----------------+----------+----------------+--------+
| 85d12819-d4ed-40e4-9ef9-2c17b3923177 | http-vip | 192.168.100.168 | HTTP     | True           | ACTIVE |
+--------------------------------------+----------+-----------------+----------+----------------+--------+

$ neutron lb-vip-show http-vip
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| address             | 192.168.100.168                      |
| admin_state_up      | True                                 |
| connection_limit    | -1                                   |
| description         |                                      |
| id                  | 85d12819-d4ed-40e4-9ef9-2c17b3923177 |
| name                | http-vip                             |
| pool_id             | 6b62d089-a77f-4052-ac66-336b6e7b2c62 |
| port_id             | b6c0bfd5-29a5-4999-84d5-e779c2cd3455 |
| protocol            | HTTP                                 |
| protocol_port       | 80                                   |
| session_persistence |                                      |
| status              | ACTIVE                               |
| status_description  |                                      |
| subnet_id           | b47756e2-a744-495f-807c-76ef19a27fdc |
| tenant_id           | 64709cb5dbd0454e8dd4501061d35278     |
+---------------------+--------------------------------------+

ここで、port_idを控えておく。

neutron floatingip-list                                                                                                                                             [master ~/.emacs.d]
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| 360e7cbc-8913-4bb3-9dce-30d6bf6984f9 |                  | 192.168.1.70        |                                      |
| 59a8b735-3b97-43bd-b876-170342da1e19 |                  | 192.168.1.53        |                                      |
| 5cfe1810-b4ad-4d5d-b66e-e153fa9ef28e | 192.168.100.16   | 192.168.1.55        | 19591c79-89fb-4587-b109-ef97106a270f |
| 63a2a781-1c77-4f6e-b189-86337ec629b0 |                  | 192.168.1.56        |                                      |
| 6677398b-de17-4c81-98ae-5e168266f1d0 |                  | 192.168.1.69        |                                      |
| 80d0753b-4ff6-409e-b2ee-b171dcd0052a |                  | 192.168.1.52        |                                      |
| d296ce45-6ebd-47b7-9c2f-ecb6d70f1409 |                  | 192.168.1.54        |                                      |
+--------------------------------------+------------------+---------------------+--------------------------------------+

floatingipを適当に割り当てる。

$ neutron floatingip-associate 360e7cbc-8913-4bb3-9dce-30d6bf6984f9 b6c0bfd5-29a5-4999-84d5-e779c2cd3455
$ neutron floatingip-list
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| 360e7cbc-8913-4bb3-9dce-30d6bf6984f9 | 192.168.100.168  | 192.168.1.70        | b6c0bfd5-29a5-4999-84d5-e779c2cd3455 |
| 59a8b735-3b97-43bd-b876-170342da1e19 |                  | 192.168.1.53        |                                      |
| 5cfe1810-b4ad-4d5d-b66e-e153fa9ef28e | 192.168.100.16   | 192.168.1.55        | 19591c79-89fb-4587-b109-ef97106a270f |
| 63a2a781-1c77-4f6e-b189-86337ec629b0 |                  | 192.168.1.56        |                                      |
| 6677398b-de17-4c81-98ae-5e168266f1d0 |                  | 192.168.1.69        |                                      |
| 80d0753b-4ff6-409e-b2ee-b171dcd0052a |                  | 192.168.1.52        |                                      |
| d296ce45-6ebd-47b7-9c2f-ecb6d70f1409 |                  | 192.168.1.54        |                                      |
+--------------------------------------+------------------+---------------------+--------------------------------------+

これで、LoadBalancerにfloating-ipでアクセスできるようになる。

$ curl 192.168.1.70                                                                                                                                                   [master ~/.emacs.d]
<!DOCTYPE html>
<html>
<head>
....

まとめ

neutron の LBaaSを試してみた。
haproxyなどが動作しているインスタンスを用意するよりは手軽に利用できるのが良い。
未検証だが、VM上で動作せずにホストのプロセスとして動作させているようなのでVMでやるよりパフォーマンス的にも優れてそう。
なお、上記のメモには残していないが、インスタンスを停止したり起動した際には適切にLoadBalanceの対象として追加、削除が行なわれていた
ことも確認できた。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です