Neutron/DynamicRouting/TestingDynamicRouting
动态路由测试教程
本页面解释了如何测试动态路由功能。目前此功能尚未合并,预计将在 Juno 版本中可用。本教程解释了如何构建和使用正在审核的代码。
测试环境
我们希望测试动态路由代理 (dr_agent) 如何将 Neutron 的路由信息交换到上联 Quagga 实例。为此,我们将部署一台使用 devstack 的虚拟机,以及另一台安装 quagga 实例的虚拟机。这不会是一个真实的部署场景,因为我们需要在 neutron 网关路由器中进行一些技巧,但本教程的目的是了解 dr_agent 如何通告和发现路由,以及通过 python-neutronclient 工具暴露的 neutron 资源。
环境的粗略示意图如下
准备 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/24 和 10.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 |
+-----------------------+-----------------------------------------------------------------------------+
就这样!
