본문 바로가기
Openstack

Openstack LBaaS


LBaaS개요

Neutron 은 NeutronAPI 통하여 기존 Neutron 기능을 확장 가능한 플리그인 메커니즘을 가지고 있다.

대표적으로 Neutron LBaaS(Load-Balancer-as-a-Service,이하 LBaaS)  는 Load-Balancer 기능을 제공 하며, NeutronAPI 를 통하여 기능을 구현한다.

기본적으로  Load-Balancer 기능은 LBaaS agent 데몬으로 작동 되며 해당 데몬은 haproxy 기반으로  Load-Balancer 기능을 제공 하고 있다.

LBaaS v1 과 LBaaS v2 로 버전이 있으며   LBaaS v1는 openstack 릴리즈 Newton 에서 삭제 되어 지금은 기본적으로 LBaaS v2로 작동한다.

(공식적으로 LBaaS v1 에서 LBaaS v2 의 migration은 불가능)

해당 문서는 LBaaS v2 기준으로 작성 되었다.


LBaaS Concepts

LBaaS 논리적인 Concept 은 아래와 같은 형태로 구성 되어 있다.


Load balancer load balancer 는 neutron 네트워크 포트를 사용 하여 서브넷에 아이피를 할당한다.
Listener

Load balancers 는 1개가 아닌 다수의 listener 를 설정 하여 여러 포트에서 대한 요청을 수신 할 수 있다.

Pool풀에는 로드 밸런서를 통해 콘텐츠를 제공하는 멤버 목록이 저장됩니다.
Member

멤버는 로드 밸런서 뒤에서 트래픽을 처리하는 서버로. 각 멤버는 트래픽을 서비스하는 데 사용하는 IP주소 및 포트로 지정된다.

Health monitor

Member는  때때로 오프라인 상태가 될 수 있으며 상태 모니터는 올바르게 응답하지 않는 구성원의 트래픽을 우회시킵니다.

상태 모니터는 풀과 연결됩니다.


아래 그림과 Load balancer 라는 가상의   Load-Balancer 가 있다면 해당   Load-Balancer 에는 다수의 Listener 를 지정 하여V-port 를 지정 하여 
Load-Balancing을 진행 한다. 

Listener 에는 특정 pool을 지정 하여 해당 pool 에 있는 member  에게 Load-Balancing을 진행 하며 Health monitor 에 의하여 상태를 체크를 진행 하다가

상태가 이상이 있을 경우 해당 상태이상있는 member로 연결 되지 않도록 한다.(해당 부분은 haproxy로 작동한다)



Create load balancer 

아래 처럼 해당 프로젝트에는  web1,web2 라는 프로젝트가 각각 selfservice(private) ip 로 할당 되어 있으며 각각 웹서버 호출시 해당 인스턴스의 

이름이 나오도록 설정 되어 있다.


Default WEb server
# openstack server list
+--------------------------------------+------+--------+-----------------------------------------+-------+---------+
| ID                                   | Name | Status | Networks                                | Image | Flavor  |
+--------------------------------------+------+--------+-----------------------------------------+-------+---------+
| c3246bbb-d42f-4633-addf-c905226486d1 | web2 | ACTIVE | selfservice=172.20.0.6192.168.93.219  |       | m1.cent |
| c8975b4e-4c37-41d9-936b-0704c091569e | web1 | ACTIVE | selfservice=172.20.0.12192.168.93.222 |       | m1.cent |
+--------------------------------------+------+--------+-----------------------------------------+-------+---------+
 
 
# curl 192.168.93.219
web2
# curl 192.168.93.222
web1


LBaaS 에서  load-balancer  생성을 위하여 위에 설명한 것 처럼 top-down 방식으로 각 컴포넌트들을 생성 해야 한다.

 load-balancer → listener → pool → member → healthmonitor 이러한 구조생성한다.

테스트 환경
## lb 를 적용할 subnet 의 id 를 확인 한다. 해당 테스트에서는 selfservice 의 id 를 확인 한다.
#neutron
(neutron) subnet-list
+--------------------------------------+---------------------------------------------------+----------------------------------+------------------+------------------------------------------------------+
| id                                   | name                                              | tenant_id                        | cidr             | allocation_pools                                     |
+--------------------------------------+---------------------------------------------------+----------------------------------+------------------+------------------------------------------------------+
| 39a4ff90-f682-434e-bb3b-68af8e5a950b | provider                                          | f51c4ada9f7d4fd8ab740b3257e4eadc | 192.168.0.0/16   | {"start""192.168.93.210""end""192.168.93.245"} |
| 66d21ef1-cc91-466d-b7f3-483c1f08ea37 | selfservice                                       | f51c4ada9f7d4fd8ab740b3257e4eadc | 172.20.0.0/24    | {"start""172.20.0.2""end""172.20.0.254"}       |
| d261a2d0-ea15-4ad1-af8b-07c0e74a7f43 | HA subnet tenant f51c4ada9f7d4fd8ab740b3257e4eadc |                                  | 169.254.192.0/18 | {"start""169.254.192.1""end""169.254.255.254"} |
+--------------------------------------+---------------------------------------------------+----------------------------------+------------------+------------------------------------------------------+
 
 
## lbaas-loadbalancer-create 를 이용 하여 이름과 서브넷 아이디를 입력 하여 lb를 생성 한다.
## lb 생성시 해당 vip 를 확인 할 수 있다.
 
(neutron) lbaas-loadbalancer-create --name test_lb 66d21ef1-cc91-466d-b7f3-483c1f08ea37
Created a new loadbalancer:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| admin_state_up      | True                                 |
| description         |                                      |
| id                  | 8c3db9cf-b7a1-490c-aa3d-327d997ae097 |
| listeners           |                                      |
| name                | test_lb                              |
| operating_status    | OFFLINE                              |
| pools               |                                      |
| provider            | haproxy                              |
| provisioning_status | PENDING_CREATE                       |
| tenant_id           | f51c4ada9f7d4fd8ab740b3257e4eadc     |
| vip_address         | 172.20.0.4                           |
| vip_port_id         | dc6c5904-21ac-4ad5-bde1-bdccf0d72dc4 |
| vip_subnet_id       | 66d21ef1-cc91-466d-b7f3-483c1f08ea37 |
+---------------------+--------------------------------------+
 
 
## 해당 lb에 바인딩 될 포트를 추가 하기 위하여 lbaas-listener-create 를 이용 하여 listener를 생성 한다.
## 해당 테스트에서는 http 프로토콜 80 포트를 부하 분산 하기 위하여 아래와 같은 옵션을 추가 한다. 이때 --loadbalancer
## 옵셥을 추가하여 해당 listener 를 lb에 적용 할 수 있도록 한다.
 
 
(neutron) lbaas-listener-create   --protocol HTTP --protocol-port 80 --loadbalancer test_lb  --name test_listener
Created a new listener:
+---------------------------+------------------------------------------------+
| Field                     | Value                                          |
+---------------------------+------------------------------------------------+
| admin_state_up            | True                                           |
| connection_limit          | -1                                             |
| default_pool_id           |                                                |
| default_tls_container_ref |                                                |
| description               |                                                |
| id                        | 4f997ddd-a36e-4105-b81d-f4744002dd98           |
| loadbalancers             | {"id""8c3db9cf-b7a1-490c-aa3d-327d997ae097"} |
| name                      | test_listener                                  |
| protocol                  | HTTP                                           |
| protocol_port             | 80                                             |
| sni_container_refs        |                                                |
| tenant_id                 | f51c4ada9f7d4fd8ab740b3257e4eadc               |
+---------------------------+------------------------------------------------+
 
 
## 해당 listener 에 적용 할 pool 생성을 위하여 lbaas-pool-create 를 이용 하여 pool 을 생성 한다.
## --protocol 을 이용 하여 해당 pool의 프로토콜을 입력 하며 (지원 프로토콜: HTTP,HTTPS,TCP)
##  --lb-algorithm 로  ROUND_ROBIN 으로 부하 분산 하도록 한다 (지원 알고리즘 :ROUND_ROBIN,LEAST_CONNECTIONS,SOURCE_IP)
## Pool 도 해당 적용할 listener,loadbalancer 이름을 추가 하여 적용 할 수 있도록 한다.
 
 
(neutron) lbaas-pool-create --name test_pool --listener test_listener --loadbalancer test_lb --protocol http --lb-algorithm  ROUND_ROBIN
Created a new pool:
+---------------------+------------------------------------------------+
| Field               | Value                                          |
+---------------------+------------------------------------------------+
| admin_state_up      | True                                           |
| description         |                                                |
| healthmonitor_id    |                                                |
| id                  | b9f7ea85-7a4c-4614-855d-4614a1a840f7           |
| lb_algorithm        | ROUND_ROBIN                                    |
| listeners           | {"id""4f997ddd-a36e-4105-b81d-f4744002dd98"} |
| loadbalancers       | {"id""8c3db9cf-b7a1-490c-aa3d-327d997ae097"} |
| members             |                                                |
| name                | test_pool                                      |
| protocol            | HTTP                                           |
| session_persistence |                                                |
| tenant_id           | f51c4ada9f7d4fd8ab740b3257e4eadc               |
+---------------------+------------------------------------------------+
 
 
## 위에서 생성한 Pool 에 적용 할 member를 lbaas-member-create  로 이용 하여 적용 한다.
## --address ,--protocol  옵셥을 이용 하여 실제 부하분산할 아이피와 포트를 추가 하며,
## 해당 --subnet 를 추가 한다.
 
(neutron) lbaas-member-create --name web1 --subnet 66d21ef1-cc91-466d-b7f3-483c1f08ea37  --address 172.20.0.6 --protocol 80 test_pool
Created a new member:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 172.20.0.6                           |
| admin_state_up | True                                 |
| id             | 5f2f9cc2-d066-4644-9a72-39b909ed487b |
| name           | web1                                 |
| protocol_port  | 80                                   |
| subnet_id      | 66d21ef1-cc91-466d-b7f3-483c1f08ea37 |
| tenant_id      | f51c4ada9f7d4fd8ab740b3257e4eadc     |
| weight         | 1                                    |
+----------------+--------------------------------------+
(neutron) lbaas-member-create --name web2 --subnet 66d21ef1-cc91-466d-b7f3-483c1f08ea37  --address 172.20.0.12 --protocol 80 test_pool
Created a new member:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| address        | 172.20.0.12                          |
| admin_state_up | True                                 |
| id             | 950acaae-c366-4e82-8335-a38670f7dee1 |
| name           | web2                                 |
| protocol_port  | 80                                   |
| subnet_id      | 66d21ef1-cc91-466d-b7f3-483c1f08ea37 |
| tenant_id      | f51c4ada9f7d4fd8ab740b3257e4eadc     |
| weight         | 1                                    |
+----------------+--------------------------------------+
 
 
## 마지막으로 해당 pool 의 health-check를 위하여 lbaas-healthmonitor-create 를 생성 한다.
## 해당 health-check 의 자세한 옵션은 neutron-CLI_reference(https://docs.openstack.org/python-neutronclient/6.4.0/cli/neutron-reference.html)를 참조 한다.
 
 
(neutron) lbaas-healthmonitor-create --type HTTP --delay 1 --timeout 1 --pool test_pool --max-retries 2
Created a new healthmonitor:
+------------------+------------------------------------------------+
| Field            | Value                                          |
+------------------+------------------------------------------------+
| admin_state_up   | True                                           |
| delay            | 1                                              |
| expected_codes   | 200                                            |
| http_method      | GET                                            |
| id               | dd37d5c6-4ab3-440a-947c-075c0edeabb3           |
| max_retries      | 2                                              |
| max_retries_down | 3                                              |
| name             |                                                |
| pools            | {"id""b9f7ea85-7a4c-4614-855d-4614a1a840f7"} |
| tenant_id        | f51c4ada9f7d4fd8ab740b3257e4eadc               |
| timeout          | 1                                              |
| type             | HTTP                                           |
| url_path         | /                                              |
+------------------+------------------------------------------------+
 
 
(neutron) lbaas-loadbalancer-list
+--------------------------------------+---------+----------------------------------+-------------+---------------------+----------+
| id                                   | name    | tenant_id                        | vip_address | provisioning_status | provider |
+--------------------------------------+---------+----------------------------------+-------------+---------------------+----------+
| 8c3db9cf-b7a1-490c-aa3d-327d997ae097 | test_lb | f51c4ada9f7d4fd8ab740b3257e4eadc | 172.20.0.4  | ACTIVE              | haproxy  |
+--------------------------------------+---------+----------------------------------+-------------+---------------------+----------+

아래와 같이 테스트를 진행 한다.

lb test
## test_lb 의 vip 를 접속시 아이피가 변경 되는 것을 확인 한다.
[centos@web2 ~]$ curl 172.20.0.4
web1
[centos@web2 ~]$ curl 172.20.0.4
web2
 
 
## member에서 httpd 데몬을 중지 하여 한쪽 member에게만 접속 되는 것을 확인 한다.
[centos@web2 ~]$ sudo systemctl stop httpd
[centos@web2 ~]$ curl 172.20.0.4
web1
[centos@web2 ~]$ curl 172.20.0.4
web1
[centos@web2 ~]$ curl 172.20.0.4
web1
[centos@web2 ~]$ curl 172.20.0.4
 
 
## member를 다시 httpd데몬 활성화시 정상적으로 부하분산 되는 것을 확인 한다.
[centos@web2 ~]$ sudo systemctl start httpd
[centos@web2 ~]$ curl 172.20.0.4
web1
[centos@web2 ~]$ curl 172.20.0.4
web2

how to ?

 위 과정으로 lb 생성시 아래와 같이 namespace 가 생성 되어 있는 것을 확인 할 수 있다.

또한  같은 selfservice 네트워크와 연결 될 수 있도록 해당 브릿지에 인터페이스가 추가 되어 내부 selfservice 네트워크 인스턴스들과 통신 할 수 있는 것을 확인 할 수 있다.

controller node namespace
[root@controller02 ~]# ip netns
qlbaas-8c3db9cf-b7a1-490c-aa3d-327d997ae097 (id: 3)
qrouter-36e5aa69-14de-439e-9453-e912509eb3c6 (id: 2)
qdhcp-cd846033-2d68-4d9b-83e1-12e035639f86 (id: 1)
qdhcp-54a5e33b-faa8-411f-b773-940bb90191b4 (id: 0)
 
 
[root@controller02 ~]# ip netns exec qlbaas-8c3db9cf-b7a1-490c-aa3d-327d997ae097 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ns-dc6c5904-21@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP qlen 1000
    link/ether fa:16:3e:04:e2:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.20.0.4/24 brd 172.20.0.255 scope global ns-dc6c5904-21
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe04:e206/64 scope link
       valid_lft forever preferred_lft forever
 
 
[root@controller02 ~]# brctl show
bridge name bridge id       STP enabled interfaces
brq54a5e33b-fa      8000.42bab22ae116   no      tapdc6c5904-21
                            tapdd9d862d-9f
                            tapfb8feb1f-cd
                            vxlan-86
brqcd846033-2d      8000.06dd6658f1ba   no      eth4
                            tap47f965de-50
                            tap7e72f93a-98
brqe7a65d82-a5      8000.cec04e6d50ce   no      tap074697fa-f5
                            vxlan-53
docker0     8000.0242bf2c7dd9   no


실제로 vip 가  contoller node  에 설정 되기 때문에 해당 vip를 바인딩 하여 부하분산의 역할을 하는 haproxy를 확인 할 수 있다.

위에서 설정한 옵션이 haproxy옵션으로 추가 되는 것을 확인 할 수 있다.


LB haproxy
# [root@controller02 ~]# docker exec neutron_lbaas_agent
(neuton-lbaas-agent)[neutron@controller02 /]$ ps aux | grep haproxy | grep -v
nobody     150  0.0  0.0  48208  1732 ?        Ss   10:28   0:01 haproxy -f /var/lib/neutron/lbaas/v2/8c3db9cf-b7a1-490c-aa3d-327d997ae097/haproxy.conf -p
/var/lib/neutron/lbaas/v2/8c3db9cf-b7a1-490c-aa3d-327d997ae097/haproxy.pid -sf 144
 
 
(neuton-lbaas-agent)[neutron@controller02 /]$ cat /var/lib/neutron/lbaas/v2/8c3db9cf-b7a1-490c-aa3d-327d997ae097/haproxy.conf
 
 
 
# Configuration for test_lb
global
    daemon
    user nobody
    group haproxy
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 2000
    stats socket /var/lib/neutron/lbaas/v2/8c3db9cf-b7a1-490c-aa3d-327d997ae097/haproxy_stats.sock mode 0666 level user
 
defaults
    log global
    retries 3
    option redispatch
    timeout connect 5000
    timeout client 50000
    timeout server 50000
 
frontend 4f997ddd-a36e-4105-b81d-f4744002dd98
    option tcplog
    option forwardfor
    bind 172.20.0.4:80
    mode http
    default_backend b9f7ea85-7a4c-4614-855d-4614a1a840f7
 
backend b9f7ea85-7a4c-4614-855d-4614a1a840f7
    mode http
    balance roundrobin
    timeout check 1s
    option httpchk GET /
    http-check expect rstatus 200
    server 950acaae-c366-4e82-8335-a38670f7dee1 172.20.0.12:80 weight 1 check inter 1s fall 2
    server 5f2f9cc2-d066-4644-9a72-39b909ed487b 172.20.0.6:80 weight 1 check inter 1s fall 2


위  haproxy 설정중 frontend 에 option forwardfor 가 자동으로 http mode 일 경우 추가 된다.

실제로 클라이언트에서 wireshark로 packet를 확인 하면 아래와 같이 http header에 추가 된것을 볼 수 있다.





Delete load-balancer 

load-balancer 삭제 과정은 생성 과정의 반대로 진행 해야 한다 

만약 해당 load-balancer에 listener 가있으면 load-balancer가 삭제가 안되며,  pool 에  member 가 있을 경우 pool 이 삭제가 안된다.

그렇기 때문에 healthmonitor->member->pool->listener-> load-balancer 순서로 삭제를 모두 해야 정상적으로 삭제가 된다.


Delete healthmonitor
# neutron
 
(neutron) lbaas-healthmonitor-list
 
+--------------------------------------+------+----------------------------------+------+----------------+
| id                                   | name | tenant_id                        | type | admin_state_up |
+--------------------------------------+------+----------------------------------+------+----------------+
| 0d3a22c6-5767-4cc1-97a8-1f383b6bc724 |      | f51c4ada9f7d4fd8ab740b3257e4eadc | HTTP | True           |
+--------------------------------------+------+----------------------------------+------+----------------+
 
(neutron) lbaas-healthmonitor-delete  0d3a22c6-5767-4cc1-97a8-1f383b6bc724
Deleted lbaas_healthmonitor(s): 0d3a22c6-5767-4cc1-97a8-1f383b6bc724
Delete Pool/Member
## 삭제하려는 POOL 의 ID 를 확인 한다.
# neutron
(neutron) lbaas-pool-list
 
+--------------------------------------+--------+----------------------------------+--------------+----------+----------------+
| id                                   | name   | tenant_id                        | lb_algorithm | protocol | admin_state_up |
+--------------------------------------+--------+----------------------------------+--------------+----------+----------------+
| 1fa68f4e-a021-42d9-9084-645c7c77eb44 | Pool 1 | f51c4ada9f7d4fd8ab740b3257e4eadc | ROUND_ROBIN  | HTTP     | True           |
+--------------------------------------+--------+----------------------------------+--------------+----------+----------------+
 
 
## 삭제하려는 POOL 의 할당된 MEMBER 의 ID 를 확인 한다.
 
(neutron) lbaas-member-list  1fa68f4e-a021-42d9-9084-645c7c77eb44
 
+--------------------------------------+------+----------------------------------+-------------+---------------+--------+--------------------------------------+----------------+
| id                                   | name | tenant_id                        | address     | protocol_port | weight | subnet_id                            | admin_state_up |
+--------------------------------------+------+----------------------------------+-------------+---------------+--------+--------------------------------------+----------------+
| 9961ebb7-82fd-4201-86d0-a2844479b21b |      | f51c4ada9f7d4fd8ab740b3257e4eadc | 172.20.0.12 |            80 |      1 | 66d21ef1-cc91-466d-b7f3-483c1f08ea37 | True           |
| b166439d-11d4-4118-9fca-110c85d9fd05 |      | f51c4ada9f7d4fd8ab740b3257e4eadc | 172.20.0.6  |            80 |      1 | 66d21ef1-cc91-466d-b7f3-483c1f08ea37 | True           |
+--------------------------------------+------+----------------------------------+-------------+---------------+--------+--------------------------------------+----------------+
 
 
## 해당 POOL 의 MEMBER 삭제시 " lbaas-member-delete [MEMBER ID] [POOLID]" 형식으로 삭제 한다.
(neutron) lbaas-member-delete 9961ebb7-82fd-4201-86d0-a2844479b21b 1fa68f4e-a021-42d9-9084-645c7c77eb44
Deleted lbaas_member(s): 9961ebb7-82fd-4201-86d0-a2844479b21b
 
(neutron)  lbaas-member-delete b166439d-11d4-4118-9fca-110c85d9fd05 1fa68f4e-a021-42d9-9084-645c7c77eb44
Deleted lbaas_member(s): b166439d-11d4-4118-9fca-110c85d9fd05
 
 
## 해당 POOL 의 모든 MEMBER 가 없어야 정상적으로 POOL 이 삭제 된다.
(neutron) lbaas-pool-delete 1fa68f4e-a021-42d9-9084-645c7c77eb44
Deleted lbaas_pool(s): 1fa68f4e-a021-42d9-9084-645c7c77eb44
Delete listener/loadbalancer
# neutron
(neutron) lbaas-listener-list
+--------------------------------------+-----------------+------------+----------------------------------+----------+---------------+----------------+
| id                                   | default_pool_id | name       | tenant_id                        | protocol | protocol_port | admin_state_up |
+--------------------------------------+-----------------+------------+----------------------------------+----------+---------------+----------------+
| 612298e7-9d3d-4780-ac7f-3d425b3ecf6d |                 | Listener 1 | f51c4ada9f7d4fd8ab740b3257e4eadc | HTTP     |            80 | True           |
+--------------------------------------+-----------------+------------+----------------------------------+----------+---------------+----------------+
(neutron) lbaas-listener-delete 612298e7-9d3d-4780-ac7f-3d425b3ecf6d
Deleted listener(s): 612298e7-9d3d-4780-ac7f-3d425b3ecf6d
 
 
 
(neutron) lbaas-loadbalancer-list
+--------------------------------------+-----------------+----------------------------------+-------------+---------------------+----------+
| id                                   | name            | tenant_id                        | vip_address | provisioning_status | provider |
 
+--------------------------------------+-----------------+----------------------------------+-------------+---------------------+----------+
| 07a82fb4-07e1-4180-b4ce-edd89186914c | Load Balancer 1 | f51c4ada9f7d4fd8ab740b3257e4eadc | 172.20.0.8  | ACTIVE              | haproxy  |
+--------------------------------------+-----------------+----------------------------------+-------------+---------------------+----------+
(neutron) lbaas-loadbalancer-delete 07a82fb4-07e1-4180-b4ce-edd89186914c
Deleted loadbalancer(s): 07a82fb4-07e1-4180-b4ce-edd89186914c


LBaaS scheduling

그렇다면 다중 controller 구조에서 lb를 어떠한 기준으로 scheduling 할까? 라는 의문점이 들었다.


아래 gitbub  공개된 neutron_lbaas 소스중 agent_scheduler.py 파일을 확인해보았다.

LoadbalancerAgentBinding 클래스를 통하여 agent가 활성 되어 있는 것을 확인 하며
LbaasAgentSchedulerDbMixin 통하여 active 상태를 랜덤 하게 할당 하는 것을 볼 수 있다.(자세한 부분은 해당 소스 직접 확인)


neutron_lbaas/agent_scheduler.py
class LoadbalancerAgentBinding(model_base.BASEV2):
    """Represents binding between neutron loadbalancer and agents."""
 
    __tablename__ = "lbaas_loadbalanceragentbindings"
 
    loadbalancer_id = sa.Column(
        sa.String(36),
        sa.ForeignKey("lbaas_loadbalancers.id", ondelete='CASCADE'),
        primary_key=True)
    agent = orm.relation(agents_db.Agent)
    agent_id = sa.Column(
        sa.String(36),
        sa.ForeignKey("agents.id", ondelete='CASCADE'),
        nullable=False)
 
 
class LbaasAgentSchedulerDbMixin(agentschedulers_db.AgentSchedulerDbMixin,
                                 lbaas_agentschedulerv2
                                 .LbaasAgentSchedulerPluginBase):
 
    agent_notifiers = {}
 
    def get_agent_hosting_loadbalancer(self, context,
                                       loadbalancer_id, active=None):
        query = context.session.query(LoadbalancerAgentBinding)
        query = query.options(joinedload('agent'))
        binding = query.get(loadbalancer_id)
 
        if (binding and self.is_eligible_agent(
                active, binding.agent)):
            return {'agent': self._make_agent_dict(binding.agent)}
 
    def get_lbaas_agents(self, context, active=None, filters=None):
        query = context.session.query(agents_db.Agent)
        query = query.filter_by(agent_type=lb_const.AGENT_TYPE_LOADBALANCERV2)
        if active is not None:
            query = query.filter_by(admin_state_up=active)
        if filters:
            for key, value in filters.items():
                column = getattr(agents_db.Agent, key, None)
                if column:
                    query = query.filter(column.in_(value))
 
        return [agent
                for agent in query
                if self.is_eligible_agent(active, agent)]
 
...


그렇기 때문에  neutron  db에서는 해당 로드밸런서 가 특정 agent id 에 할당 되어 있는것을 확인 할 수 있다.

neutron db
MariaDB [neutron]> select * from lbaas_loadbalanceragentbindings;
+--------------------------------------+--------------------------------------+
| loadbalancer_id                      | agent_id                             |
+--------------------------------------+--------------------------------------+
| 8c3db9cf-b7a1-490c-aa3d-327d997ae097 | 1e79c326-aad3-4d02-b80b-b00068f59492 |
+--------------------------------------+--------------------------------------+


LBaaS rescheduling(LBaaS high-ability)



LBaaS 는 기본적으로 Neutron L3-HA와 같이  HA 구성이 불가능하다.(추후  L3-HA와 같이 구성할 예정이라는 글만 보이고 있다.)

그렇기 때문에 특정 controller node 에 스케쥴링된  load balancer 가 장애시 다른  controller node 로 복구 되지 않는다.

하지만, allow_automatic_lbaas_agent_failover 옵션을 통하여 agent 간 상태가 DOWN일 경우 rescheduling  하여 가용 할 수 있는 controller node 

 load balancer 를 재 할당 한다.



allow_automatic_lbaas_agent_failover 

(BoolOpt) Automatically reschedule loadbalancer from offline to online lbaas agents. This is only supported for drivers who use the neutron LBaaSv2 agent

참고: https://docs.openstack.org/ocata/config-reference/tables/conf-changes/neutron.html



설정은 neutron.conf,neutron_lbaas.conf 파일을 수정 하여 Neutron 재시작 하여 사용 한다.

/etc/neutron/neutron.conf
[DEFAULT]
allow_automatic_lbaas_agent_failover=True


/etc/neutron/neutron_lbaas.conf
[DEFAULT]
allow_automatic_lbaas_agent_failover=True




Ref : https://docs.openstack.org/mitaka/networking-guide/config-lbaas.html


반응형