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の対象として追加、削除が行なわれていた
ことも確認できた。