实现细节

跟大部分的高级服务一样,LBaaS 在网络节点上实现。

qlbaas 命名空间

在启动了 LBaaS 之后,网络节点上会多一个 qlbaas-xxx 命名空间,其中一个 tap 类型端口,绑定了我们定义的 VIP。

$ sudo ip netns exec qlbaas-574a31da-a28a-449f-8c9d-3d3687c3c02a ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    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
52: tapfb358342-59: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether fa:16:3e:68:77:37 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.250/24 brd 10.0.0.255 scope global tapfb358342-59
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe68:7737/64 scope link
       valid_lft forever preferred_lft forever

该 tap 类型端口,会连接到网络节点的 br-int 网桥上。

HAProxy

此时在网络节点上查看进程,会发现一个 haproxy 进程。

$ ps aux|grep haproxy
nobody   17331  0.0  0.0  20376  1104 ?        Ss   15:08   0:00 haproxy -f /opt/stack/data/neutron/lbaas/574a31da-a28a-449f-8c9d-3d3687c3c02a/conf -p /opt/stack/data/neutron/lbaas/574a31da-a28a-449f-8c9d-3d3687c3c02a/pid -sf 17323

查看 HAProxy 的配置文件

$ cat /opt/stack/data/neutron/lbaas/574a31da-a28a-449f-8c9d-3d3687c3c02a/conf
global
        daemon
        user nobody
        group nogroup
        log /dev/log local0
        log /dev/log local1 notice
        stats socket /opt/stack/data/neutron/lbaas/574a31da-a28a-449f-8c9d-3d3687c3c02a/sock mode 0666 level user
defaults
        log global
        retries 3
        option redispatch
        timeout connect 5000
        timeout client 50000
        timeout server 50000
frontend df25900f-53b1-4aab-8436-8411ec710445
        option tcplog
        bind 10.0.0.250:22
        mode tcp
        default_backend 574a31da-a28a-449f-8c9d-3d3687c3c02a
backend 574a31da-a28a-449f-8c9d-3d3687c3c02a
        mode tcp
        balance leastconn
        server 45481748-3104-462c-ae4b-fae0f4b08c20 10.0.0.2:22 weight 1
        server 227b69fe-8685-4df6-b2a5-2f964c74886c 10.0.0.4:22 weight 1

可见,里面的配置信息,跟我们之前配置的完全一致。

当有请求访问 10.0.0.250:22 的时候,最终会到达该 qlbaas 命名空间,请求被 HAProxy 收到,按照负载均衡策略,转发给合适的虚机。

可以通过 ssh 进行测试。

$ sudo ip netns exec qrouter-40fff075-d3a2-477b-942c-6b1adb42e35e ssh 10.0.0.250

在后端的虚机抓包,SSH 请求是 10.0.0.250 -> 10.0.0.2,说明实际上是 HAProxy 转发了请求。


书籍推荐