美文网首页
玩转 OpenStack(八.2)Linux Bridge 实

玩转 OpenStack(八.2)Linux Bridge 实

作者: 河码匠 | 来源:发表于2019-04-15 19:01 被阅读0次

    上一节中介绍了 Local Network、Flat Network、VLAN Network 和 DHCP 服务。以及他们在测试环境中的实际情况。

    本节将继续介绍 OpenStack 的其他网络类型,Routing 和 VXLAN

    一、Routing

    路由服务提供跨 subnet 互联互通功能。

    在上一节的 VLAN Network 中创建了两个 VLAN:
    test-vlan-100 192.168.16.0/24
    test-vlan-101 192.168.26.0/24

    两台 Instance 分别加入 VLAN100 和 VLAN101。


    这两个 Instance 要通信必须借助 router,这个 router 可以是物理 router 或者虚拟 router。

    1. 虚拟 router

    L3 Agent 会在控制节点或者网络节点上运行虚拟 router,为 subnet 提供路由服务。

    * 配置 L3 Agent

    配置文件 /etc/neutron/l3_agent.ini

    [DEFAULT]
    external_network_bridge =
    interface_driver = linuxbridge
    ovs_use_veth = False
    debug = True
    

    查看 agent 运行情况

    root@controller:~# source /opt/stack/devstack/openrc admin admin
    root@controller:~# neutron agent-list
    neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
    +-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
    | id                    | agent_type         | host       | availability_zone | alive | admin_state_up | binary                |
    +-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
    | 0f0901db-dd80-4f79-81 | Linux bridge agent | compute    |                   | :-)   | True           | neutron-linuxbridge-  |
    | 65-f1dbe32eb884       |                    |            |                   |       |                | agent                 |
    | 3c5058ab-ea53-44fe-   | Linux bridge agent | controller |                   | :-)   | True           | neutron-linuxbridge-  |
    | 98d1-998bddf1d269     |                    |            |                   |       |                | agent                 |
    | 6f469203-717c-4b96-93 | Metadata agent     | controller |                   | :-)   | True           | neutron-metadata-     |
    | 65-d044936c542c       |                    |            |                   |       |                | agent                 |
    | 6f7bc4ca-6023-4613    | DHCP agent         | controller | nova              | :-)   | True           | neutron-dhcp-agent    |
    | -979b-6e06420763d0    |                    |            |                   |       |                |                       |
    | ea906b28-db14-484c-   | L3 agent           | controller | nova              | :-)   | True           | neutron-l3-agent      |
    | a3e3-37ea0698d7d4     |                    |            |                   |       |                |                       |
    +-----------------------+--------------------+------------+-------------------+-------+----------------+-----------------------+
    
    * 创建 router

    创建 router


    给 router 添加两个接口


    在虚拟机 test_vlan3 尝试 ping valn-test2 发现可以 ping 通

    查看 route

    * 底层变化

    查看 brctl

    root@controller:~# brctl show
    bridge name bridge id       STP enabled interfaces
    br-ex       8000.000000000000   no
    brq2b85ebb9-a6      8000.000c2945542f   no      ens35.100
                                tap0e13c0a5-3c
                                tap16284e31-78
                                tapf85d61d8-c3
    brqded938ea-60      8000.000c2945542f   no      ens35.101
                                tap1a862bc1-b9
                                tap88d7a622-24
    

    可以看到多出来两个 tap tap16284e31-78 tap1a862bc1-b9 分别对应 router 上的两个接口名

    * 当前网络结构如下
    * 查看router 创建的两个 TAP 设备并没有配置相应的 Gateway IP
    tap16284e31-78 Link encap:Ethernet  HWaddr c6:44:26:43:37:30
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:22 errors:0 dropped:0 overruns:0 frame:0
              TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1510 (1.5 KB)  TX bytes:604 (604.0 B)
    
    tap1a862bc1-b9 Link encap:Ethernet  HWaddr 46:cd:ad:23:f7:d5
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:30 errors:0 dropped:0 overruns:0 frame:0
              TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:2260 (2.2 KB)  TX bytes:1159 (1.1 KB)
    

    因为 L3 Agent 会为每个 router 创建一个 namespace,通过 veth pair 与 TAP 相连,然后将 Gateway IP 配置在位于 namespace 里面的 veth Interface 上,这样就能提供路由了。

    * 使用 ip netns 查看 namespace
    root@controller:~# neutron router-list
    neutron CLI is deprecated and will be removed in the future. Use openstack CLI instead.
    +---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+
    | id                        | name                   | tenant_id                 | external_gateway_info | distributed | ha    |
    +---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+
    | 4de6a512-01ed-4184-a12f-  | router_valn100_vlan101 | b25eb8ed9c804fc79ea248ec1 | null                  | False       | False |
    | 095a3e26cf26              |                        | 05df93c                   |                       |             |       |
    +---------------------------+------------------------+---------------------------+-----------------------+-------------+-------+
    
    root@controller:~# ip netns
    qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 (id: 0)
    qdhcp-ded938ea-60fa-4a7d-8a3f-9bd9947ae25f (id: 3)
    qdhcp-2b85ebb9-a6d4-45de-bba2-24896b4ab274 (id: 2)
    

    使用 ip netns exec <namespace> ip a 查看 veth Interface 配置

    root@controller:~# ip netns exec qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: qr-16284e31-78@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether fa:16:3e:8f:03:6c brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 192.168.16.1/24 brd 192.168.16.255 scope global qr-16284e31-78
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fe8f:36c/64 scope link
           valid_lft forever preferred_lft forever
    3: qr-1a862bc1-b9@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether fa:16:3e:db:a2:d1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 192.168.26.1/24 brd 192.168.26.255 scope global qr-1a862bc1-b9
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fedb:a2d1/64 scope link
           valid_lft forever preferred_lft forever
    

    namespace 中有两个 Interface:

    • qr-16284e31-78 上设置了 Gateway IP 192.168.16.1,与 root namespace 中的 tap16284e31-78 组成 veth pair
    • qr-1a862bc1-b9 上设置了 Gateway IP 192.168.26.1,如 root namespace 中的 tap1a862bc1-b9 组成 veth pair

    网络结构如下


    namespace 中的路由表也保证了 test-vlan-100 和 test-vlan-101 之间使可以路由的,如下

    root@controller:~# ip netns exec qrouter-4de6a512-01ed-4184-a12f-095a3e26cf26 route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    192.168.16.0    *               255.255.255.0   U     0      0        0 qr-16284e31-78
    192.168.26.0    *               255.255.255.0   U     0      0        0 qr-1a862bc1-b9
    

    二、VXLAN

    VXLAN 全称 Virtual Extensible Local Area Network。VXLAN 提供与 VLAN 相同的以太网二层服务。

    1. 优势

    • 支持更多的二层网段
      VLAN 使用 12-bit 标记 VLAN ID,最多支持 4096 个 VLAN,VXLAN 使用 24-bit 标记 VXLAN ID,最多支持 16777216 个。

    • 能更好的利用已有的网络路径。
      VLAN 使用 Spanning Tree Protocol 避免环路,这会导致有一半的网络路径被 block 掉。VXLAN 的数据包是封装到 UDP 通过三层传输和转发的,可以使用所有的路径。

    • 避免物理交换机 MAC 表耗尽
      由于采用隧道机制,TOR(TOP on Rack)交换机无须在 MAC 表中记录虚拟机的信息。

    2. VXLAN 封装和包格式

    VXLAN 是将二层建立在三层上的网络。通过将二层数据封装到 UDP 的方式来扩展数据中心的二层网段数量。
    VXLAN 定义了一个 MAC-in-UDP 的封装格式。在原始的 Layer 2 网络包前加上 VXLAN Header,然后放到 UDP 和 IP 包中。通过 MAC-in-UDP 封装,VXLAN 能够在 Layer 3 网络上建立一条 Layer 2 的隧道。

    3. VXLAN Tunnel EndPoint

    VXLAN 使用 VXLAN Tunnel Endpoint(VTEP)设备处理 VXLAN 的封装和解封。
    每个 VTEP 有一个 IP Interface,配置了一个 IP 地址。VTEP 使用该 IP 封装 Layer 2 frame,并通过该 IP Interface 传输和接收封装后的 VXLAN 数据包。

    4. VXLAN 包转发流

    VXLAN 在 VTEP 间建立隧道,通过 Layer 3 网络传输封装后的 Layer 2 数据。

    1. Host-A 向 Host-B 发送数据时,Host-B 的 MAC 和 IP 作为数据包的目标 MAC 和 IP,Host-A 的 MAC 作为数据包的源 MAC 和 IP,然后通过 VTEP-1 将数据发送出去。

    2. VTEP-1 从自己维护的映射表中找到 MAC-B 对应的 VTEP-2,然后执行 VXLAN 封装,加上 VXLAN 头,UDP 头,以及外层 IP 和 MAC 头。此时的外层 IP 头,目标地址为 VTEP-2 的 IP,源地址为 VTEP-1 的 IP。同时由于下一跳是 Router-1,所以外层 MAC 头中目标地址为 Router-1 的 MAC。

    3. 数据包从 VTEP-1 发送出去后,外部网络的路由器会依据外层 IP 头进行包路由,最后到达与 VTEP-2 连接的路由器 Router-2。

    4. Router-2 将数据包发送给 VTEP-2。VTEP-2 负责解封数据包,依次去掉外层 MAC 头,外层 IP 头,UDP 头 和 VXLAN 头。

    5. VTEP-2 依据目标 MAC 地址将数据包发送给 Host-B。

    5. 配置

    配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini

    [ml2]
    tenant_network_types = vxlan
    extension_drivers = port_security
    mechanism_drivers = openvswitch,linuxbridge
    
    [ml2_type_geneve]
    vni_ranges = 1:1000
    
    [vxlan]
    local_ip = 172.16.245.138
    enable_vxlan = True
    

    tenant_network_types 普通用户创建的网络类型为 VXLAN
    vni_ranges 指定 VXLAN 的范围
    local_ip 指定 VTEP 的 IP 地址

    5. 创建 VXLAN

    绑定子网



    6. 底层变化

    root@controller:~# brctl show
    bridge name             bridge id       STP enabled        interfaces
    brqc6be1e75-a8      8000.1a56041da633   no              tapf41de604-d4
                                                              vxlan-100
    

    Neutron 创建了

    • vxlan 100 对应的网桥 brqc6be1e75-a8
      [图片上传中...(屏幕快照 2019-04-14 下午2.49.06.png-b5ca12-1555224554638-0)]
    • vxlan Interface vxlan-100
    • dhcp 的 tap 设备 tapf41de604-d4

    查看 vxlan Interface 的详细配置

    root@controller:~# ip -d link show dev vxlan-100
    50: vxlan-100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brqc6be1e75-a8 state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether 1a:56:04:1d:a6:33 brd ff:ff:ff:ff:ff:ff promiscuity 1
        vxlan id 100 group 224.0.0.1 dev ens35 srcport 0 0 dstport 8472 ageing 300
        bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on addrgenmode eui64
    

    7. 创建 Instance 并连入 vxlan100

    当前网桥状态

    root@compute:~# brctl show
    bridge name           bridge id     STP enabled     interfaces
    brqc6be1e75-a8      8000.a68bc1fe0af0   no      tap4484a47b-b6
                                                    tapf41de604-d4
                                                        vxlan-100
    

    当前 vxlan100 的结构图


    在创建一台 Instance。两台 Instance 分别在 控制节点和计算节点
    vxlan100 的结构图如下


    三、L2 Population

    L2 Population 是用来提高 VXLAN 网络的 Scalability 的

    1. 作用

    如图:5 个节点的 VXLAN 网络,每个节点上运行若干个 vm

    假设 Host A 上的 VM 1 想要与 Host D 上的 VM 7 通信,VM 1 首先要获取 VM 7 的 MAC 地址。
    于是 VM 1 需要在整个 VXLAN 网络中广播 ARP 报文。如下图


    如果 VXLAN 网络的节点很多,上面广播的成本就会很大,这样 Scalability 就成问题了。

    这时 L2 Population 出现。如下图


    L2 Population 的作用是在 VTEP 上提供 Proxy ARP 功能,使得 VTEP 能预先获取 VXLAN 网络中的信息:

    • VM IP - MAC 对应关系
    • VM - VTEP 对应关系

    当 VM 1 与 VM 7 通信时:

    • Host A 上的 VTEP 直接响应 VM 1 的 ARP 请求,告知 VM 7 的 MAC 地址
    • 因为 Host A 上的 VTEP 知道 VM 7 位于 Host D 上,会将封装好的 VXLAN 数据包直接发送给 Host D 的 VTEP

    2. 存储原理

    Neutron 中保存每个 port 的状态,而 port 保存了 IP,MAC 相关数据。

    Instance 启动时,其 port 状态会从 down 到 build 刀 active。

    因此。每次 port 发生变化时,Neutron 都会通过 RPC 消息通知各节点上的 Neutron agent,使得 VTEP 能够更新相关信息,从而避免不必要的隧道连接和广播。

    相关文章

      网友评论

          本文标题:玩转 OpenStack(八.2)Linux Bridge 实

          本文链接:https://www.haomeiwen.com/subject/krhlwqtx.html