跳转到: 导航, 搜索

Neutron/DynamicRouting/TestingDynamicRouting

动态路由测试教程

本页面解释了如何测试动态路由功能。目前此功能尚未合并,预计将在 Juno 版本中可用。本教程解释了如何构建和使用正在审核的代码。

测试环境

我们希望测试动态路由代理 (dr_agent) 如何将 Neutron 的路由信息交换到上联 Quagga 实例。为此,我们将部署一台使用 devstack 的虚拟机,以及另一台安装 quagga 实例的虚拟机。这不会是一个真实的部署场景,因为我们需要在 neutron 网关路由器中进行一些技巧,但本教程的目的是了解 dr_agent 如何通告和发现路由,以及通过 python-neutronclient 工具暴露的 neutron 资源。

环境的粗略示意图如下

Dynamic routing test.jpg


准备 devstack

只需在一台具有桥接接口的虚拟机上部署 devstack。假设此桥接接口获得 192.168.2.38 地址。gerrit 中有一个 WIP 补丁,允许部署 dr-agent 这里。将其 cherry pick 到 master 分支。应该可以正常工作。

要让 devstack 克隆正在审核的 BGP 代码 (neutron 和 python-neutronclient),请使用以下 local.conf

 !/usr/bin/env bash
 
 [[local|localrc]]
 
 THE_PASSWORD=dummy
 DATABASE_PASSWORD=${DATABASE_PASSWORD:-$THE_PASSWORD}
 RABBIT_PASSWORD=${RABBIT_PASSWORD:-$THE_PASSWORD}
 SERVICE_TOKEN=${SERVICE_TOKEN:-$THE_PASSWORD}
 SERVICE_PASSWORD=${SERVICE_PASSWORD:-$THE_PASSWORD}
 ADMIN_PASSWORD=${ADMIN_PASSWORD:-$THE_PASSWORD}
 
 SCREEN_LOGDIR=/tmp
 
 NEUTRON_REPO=https://review.openstack.org/openstack/neutron
 NEUTRON_BRANCH=refs/changes/38/115938/1
 NEUTRONCLIENT_REPO=https://review.openstack.org/openstack/python-neutronclient
 NEUTRONCLIENT_BRANCH=refs/changes/18/111318/5
 
 #disable heat, too much time for the Fedora image
 disable_service h-eng
 disable_service h-api
 disable_service h-api-cfn
 disable_service h-api-cw
  
 # enable neutron
 disable_service n-net
 enable_service q-svc
 enable_service q-dhcp
 enable_service q-meta
 enable_service q-lbaas
 enable_service q-agt
 enable_service q-l3
 
 # enable dynamic routing agent (NEW!)
 enable_service q-dragent
 
 HOST_IP=192.168.2.38

请注意 enable_service q-dragent 行是部署 dr-agent 的关键,并且 gerrit 中使用的分支名表示补丁集。因此,要检查最新版本,您应该查看分支名的最后一部分是否是可用的最新补丁集。

在运行 devstack 之前,您应该安装 Ryu BGP 驱动程序。Ryu 使用 olso.config 来声明和加载配置选项,最新版本会抛出冲突异常。最好从源代码安装最新版本

 $ git clone https://github.com/osrg/ryu
 $ cd ryu && sudo python setup.py install

现在您可以运行 devstack 了。

配置 Quagga

在另一台具有桥接接口的虚拟机上安装 Quagga。假设此接口获得 IP 地址 192.168.2.65。

 $ sudo apt-get install quagga

配置以下文件

in /etc/quagga/daemons
 zebra=yes
 bgpd=yes
 ospfd=no
 ospf6d=no
 ripd=no
 ripngd=no
 isisd=no

/etc/quagga/zebra.conf

 # Zebra configuration
 
 # name of the router
 hostname quagga_1
 password zebra
 
 # log
 log file /var/log/quagga/zebra.log

/etc/quagga/bgpd.conf

 # declare a router with local-as 1000
 router bgp 1000
 
 # expose networks
 neighbor 192.168.2.38 remote-as 12345
 network 10.100.0.0/24
 network 10.200.0.0/24
 
 log file /var/log/quagga/bgpd.log
 debug bgp events
 debug bgp filters
 debug bgp fsm
 debug bgp keepalives
 debug bgp updates

根据这些文件,测试完成后,Neutron 路由器应该通过 nexthop 192.168.2.65 学习到路由 10.100.0.0/2410.200.0.0/24

现在您可以重启 quagga 了

 sudo service quagga restart

执行 Neutron 调用

您应该使用 admin 用户运行所有调用,因此加载 openrc 文件是必需的

 $ source devstack/openrc admin

第一步是创建路由实例实体

 $ neutron routinginstance-create test_dynamicrouting

Neutron 默认使用配置属性 dynamic_routing_auto_schedule = True 。因此,在创建路由实例后,dr_agent 将负责它并定期与其同步。这意味着在声明此路由实例中的 peer 或通告路由后,代理将执行所需的操作。在这种方法中,一个 dr_agent 只能与单个路由实例同步,以避免冲突。

因此,您需要使用 Quagga 远程 peer 值更新路由实例

 $ neutron routinginstance-update test_dynamicrouting --peers type=dict list=true peer=192.168.2.65,remote_as=1000
 Updated routinginstance: test_dynamicrouting
 $ neutron routinginstance-show test_dynamicrouting
 
  +-----------------+-------------------------------------------------------------+
  | Field           | Value                                                       |
  +-----------------+-------------------------------------------------------------+
  | advertiseroutes |                                                             |
  | id              | e316b071-2a13-454c-9b2f-f1c15d4a6d9d                        |
  | name            | test_dynamicrouting                                         |
  | peers           | {"peer": "192.168.2.65", "password": "", "remote_as": 1000} |
  | tenant_id       | 157aff04848b43d19c6c4e4a8f78003e                            |
  +-----------------+-------------------------------------------------------------+
  

现在您可以准备好通告和发现来自此 peer 的路由了。

您希望通过 eth1 接口通告浮动 IP 范围,因此路由发现值为:174.24.4.0/24,nexthop 为 192.168.2.38。相应地更新 advertiseroute

 $ neutron routinginstance-update test_dynamicrouting --advertiseroutes type=dict list=true destination=174.24.4.0/24,nexthop=192.168.2.38
 Updated routinginstance: test_dynamicrouting
 $ neutron routinginstance-show test_dynamicrouting
 
  +-----------------+-------------------------------------------------------------+
  | Field           | Value                                                       |
  +-----------------+-------------------------------------------------------------+
  | advertiseroutes | {"destination": "174.24.4.0/24", "nexthop": "192.168.2.38"} |
  | id              | e316b071-2a13-454c-9b2f-f1c15d4a6d9d                        |
  | name            | test_dynamicrouting                                         |
  | peers           | {"peer": "192.168.2.65", "password": "", "remote_as": 1000} |
  | tenant_id       | 157aff04848b43d19c6c4e4a8f78003e                            |
  +-----------------+-------------------------------------------------------------+
  

过一段时间后,您应该在 Quagga 虚拟机中看到以下内容

 $ ip r | grep 174.24.4.0
 174.24.4.0/24 via 192.168.2.38 dev eth1  proto zebra

学习路由

Neutron 路由器不允许学习 nexthop 在外部子网范围之外的路由。当前的子网是 174.24.4.0/24,因此,从 192.168.2.65 学习路由会在更新路由器时引发错误。这是因为 br-ex 没有连接到 192.168.2.0/24 网络,这实际上是有道理的。我们需要进行一些技巧来了解动态路由如何学习路由。我们将在 Neutron 外部网络中创建一个 192.168.2.0/24 假的子网,并将一个接口关联到路由器的端口,以避免引发错误。

 $ neutron subnet-create --name test_dynamicrouting_subnet 9ef55f14-b7ab-4646-aac9-c24ba4bf8876 192.168.2.0/24 --gateway 192.168.2.200
 Created a new subnet:
 +-------------------+----------------------------------------------------+
 | Field             | Value                                              |
 +-------------------+----------------------------------------------------+
 | allocation_pools  | {"start": "192.168.2.1", "end": "192.168.2.199"}   |
 |                   | {"start": "192.168.2.201", "end": "192.168.2.254"} |
 | cidr              | 192.168.2.0/24                                     |
 | dns_nameservers   |                                                    |
 | enable_dhcp       | True                                               |
 | gateway_ip        | 192.168.2.200                                      |
 | host_routes       |                                                    |
 | id                | c0365ee9-7688-4589-a763-8e81fa29aedd               |
 | ip_version        | 4                                                  |
 | ipv6_address_mode |                                                    | 
 | ipv6_ra_mode      |                                                    |
 | name              | test_dynamicrouting_subnet                         |
 | network_id        | 9ef55f14-b7ab-4646-aac9-c24ba4bf8876               |
 | tenant_id         | 157aff04848b43d19c6c4e4a8f78003e                   |
 +-------------------+----------------------------------------------------+
 $ neutron router-list
 +--------------------------------------+---------+-----------------------------------------------------------------------------+-------------+
 | id                                   | name    | external_gateway_info                                                       | distributed |
 +--------------------------------------+---------+-----------------------------------------------------------------------------+-------------+
 | 11c199ef-0025-4185-b523-f2d7537090f8 | router1 | {"network_id": "9ef55f14-b7ab-4646-aac9-c24ba4bf8876", "enable_snat": true} | False       |
 +--------------------------------------+---------+-----------------------------------------------------------------------------+-------------+
 $ neutron router-interface-add router1 test_dynamicrouting_subnet

您准备好将路由器添加到路由实例了

 $ neutron routinginstance-list
 +--------------------------------------+---------------------+----------------------------------+
 | id                                   | name                | tenant_id                        |
 +--------------------------------------+---------------------+----------------------------------+
 | e316b071-2a13-454c-9b2f-f1c15d4a6d9d | test_dynamicrouting | 157aff04848b43d19c6c4e4a8f78003e |
 +--------------------------------------+---------------------+----------------------------------+
 $ neutron routinginstance-router-add e316b071-2a13-454c-9b2f-f1c15d4a6d9d router1 (i've just realised that routinginstance name does not work here... bug to fix)

过一段时间后,您将看到路由器如何学习 Quagga 暴露的网络

 $ neutron router-show router1
 +-----------------------+-----------------------------------------------------------------------------+
 | Field                 | Value                                                                       |
 +-----------------------+-----------------------------------------------------------------------------+
 | admin_state_up        | True                                                                        |
 | distributed           | False                                                                       |
 | external_gateway_info | {"network_id": "9ef55f14-b7ab-4646-aac9-c24ba4bf8876", "enable_snat": true} |
 | id                    | 11c199ef-0025-4185-b523-f2d7537090f8                                        |
 | name                  | router1                                                                     |
 | routes                | {"destination": "10.100.0.0/24", "nexthop": "192.168.2.65"}                 |
 |                       | {"destination": "10.200.0.0/24", "nexthop": "192.168.2.65"}                 |
 | status                | ACTIVE                                                                      |
 | tenant_id             | 157aff04848b43d19c6c4e4a8f78003e                                            |
 +-----------------------+-----------------------------------------------------------------------------+

就这样!