Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

OpenStack融合OpenDaylight的部署

OpenStack融合OpenDaylight的部署

1 介绍

OpenStack是流行的开源基础架构即服务项目,涵盖计算,存储和网络管理。OpenStack可以通过Modular Layer 2(ML2)北向插件将OpenDaylight用作其网络管理提供程序。OpenDaylight通过OVSDB南向插件管理OpenStack计算节点的网络流。本文分别介绍实验环境构建前准备、ODL安装、OpenStack配置、OpenStack和ODL集成等四个部分。

1.1 OpenDaylight简介

OpenDaylight(ODL)作为软件定义网络(SDN)的控制面,拥有一套模块化、可插拔灵活地控制平台作为核心,这个控制平台基于Java开发,理论上可以运行在任何支持Java的平台上,在一定程度上能够降低北向应用和南向协议的耦合性。相比于传统网络架构来说具有很多优点:

(1)传控分离,网络资源集中控制,统一调度,提高网络运行的效率.

(2)实现于数据面的解耦合,改善了传统网络升级、维护带来的难题。

(3)可以实现大规模路由,提高网络资源的利用率。

1.2 OpenStack集成OpenDaylight架构

图1:ODL与OpenStack架构图

1.3 OpenStack对接OpenDaylight原理

OpenStack是主流的云平台, ODL是主流的SDN Controller。对于这两个开源项目,在其社区中,已经提供了标准的对接接口。厂商的商用云平台一般不会改变对外的接口,所有深度开发主要局限在接口之内,以此保证不同品牌的云平台和控制器之间的兼容性。具体的对接模型如下。

对接关键就是Networking-odl插件,云平台和SDN控制器有一方需要提供这个插件,并安装到OpenStack平台上。Networking-odl包含Open Daylight Mechanism Driver和Open Daylight L3 Router Plugin。

  • Open Daylight Mechanism Driver是OpenDaylight的ML2 Mechanism Driver,通过类似REST proxy的方式实现了ML2 Mechanism Driver功能。它把Mechchanism Driver的所有调用转化成Neutron API传递给OpenDaylight,由OpenDaylight的NB REST Service(Neutron API Service)处理后返回。
  • Open Daylight L3 Router Plugin是OpenDaylight的L3 Router plugin,实现基本router、ext-gw-mode、extraroute、dvr、L3-ha等功能。Open Daylight L3 Router Plugin本身也只是实现了类似REST proxy的功能,它以现有的OpenStack L3 Router plugin为基础,封装了一层L3调用转Neutron API到ODL的功能。

云平台和SDN控制器之间的所有调用信息基本都是通过这个组件。对接完成后,便可以在云平台上依次创建网络、子网、路由、路由和子网绑定、云主机等。

2 目标与物理网络拓扑

环境物理拓扑,如图1所示:

图2:物理网络拓扑

部署过程中所涉及到的服务器管理网口的IP地址如下表所示:

设备名称接口IP地址备注
controller管理口192.168.4.145
compute管理口192.168.4.144
ODL管理口192.168.4.150

表1:服务器理口列表

3 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称类型硬件指标数量备注
服务器X861.至少8G内存3
2.磁盘不少于500G
3.Server1和Server3的BIOS开启CPU嵌套虚拟化(INTEL:VT-x,AMD:AMD-V)

表2:硬件环境

软件版本备注
操作系统Centos7.7安装时选择Compute Node 模式,根目录/至少500G
OpenStackstein
ODLkaraf-0.6.4-Carbon

表3:软件环境

4 融合部署

4.1 安装前准备

进入本实验前,确保您以安装好OpenStack环境,并确保实例间可以ping通。

OpenStack环境是基于centos7.7使用stein版,本文档的参考部署是2节点集群:

  • 一个控制节点,一个计算节点。
  • 控制节点(keystone,glance,nova,neutron-server,mysql,dhcp-agent,l3-agent,metadata-agent,neutron-plugin-openvswitch-agent)
  • 计算节点(nova-compute,neutron-plugin-openvswitch-agent,cinder-volume)
  • Neutron将OVS后端和vxlan用于隧道

安装好OpenStack,连接到Horizon执行一些操作来验证它是否正常工作。要检查Neutron的配置,创建两个实例,分配公网浮动IP和私网IP,确认可以连通,并且它们之间可以互通。

4.2 安装OpenDaylight

先决条件:OpenDaylight需要Java 1.8.0和Open vSwitch> = 2.5.0

1) 安装JDK1.8

先通过-version命令查看JDK已安装情况:

[root@localhost ~]# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)Carbon

如果没有安装或版本较低,则:

[root@localhost ~]# yum install java-11-openjdk-devel.x86_64

进入安装目录确认java的路径:

[root@localhost ~]# cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/

打开配置文件并在最后添加如下几行:

[root@ localhost ~]# vim /etc/profile
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
PATH=$PATH:$JAVA_HOME/bin 
export JAVA_HOME PATH

立即生效:

[root@ localhost ~]# source /etc/profile

2) 安装Opendaylight

下载OpenDaylight Carbon,位于

https://nexus.opendaylight.org/content/groups/public/org/opendaylight/integration/distribution-karaf/0.6.4-Carbon/distribution-karaf-0.6.4-Carbon.tar.gz

解压:

[root@ localhost ~]# tar -zxvf distribution-karaf-0.6.4-Carbon.tar.gz

进入解压目录并执行:

[root@ localhost ~]# cd distribution-karaf-0.6.4-Carbon/
[root@ localhost distribution-karaf-0.6.4-Carbon]# ./bin/start
[root@ localhost distribution-karaf-0.6.4-Carbon]# ./bin/client
Apache Karaf starting up. Press Enter to open the shell now...
Logging in as karaf
________ ________ .__ .__ .__ __
\_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/ |_
/ | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\
/ | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > Y \ |
\_______ / __/ \___ >___| /_______ (____ / ____||____/__\___ /|___| /__|
\/|__| \/ \/ \/ \/\/ /_____/ \/
Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown OpenDaylight.
opendaylight-user@root>

安装如下组件:

opendaylight-user@root>feature:install odl-netvirt-openstack odl-dlux-core odl-mdsal-apidocs opendaylight-user@root>feature:install odl-ovsdb-southbound-impl-ui odl-neutron-service odl-restconf-all

3) 配置opendaylight

vim  etc/opendaylight/datastore/initial/config/netvirt-dhcpservice-config.xml
<dhcpservice-config xmlns="urn:opendaylight:params:xml:ns:yang:dhcpservice:config">
<controller-dhcp-enabled>true</controller-dhcp-enabled>
<dhcp-dynamic-allocation-pool-enabled>true</dhcp-dynamic-allocation-pool-enabled>

vim etc/custom.properties
ovsdb.of.version=1.3
ovsdb.l3.fwd.enabled=yes
ovsdb.l3.arp.responder.disabled=yes

</dhcpservice-config>

4) 重新启动opendaylight

[root@ localhost ~]#./bin/stop
[root@ localhost ~]#./bin/start

5) 验证安装

http://192.168.4.150:8181/index.html

用户名密码都是admin

4.3 集成过程

1) 首先要清除原有的实例和neutron网络

控制节点执行:

nova list 
nova delete <instance names> 
neutron subnet-list 
neutron router-list 
neutron router-port-list <router name> 
neutron router-interface-delete <router name> <subnet ID or name> 
neutron subnet-delete <subnet name> 
neutron net-list 
neutron net-delete <net name> 
neutron router-delete <router name> 
neutron port-list

删除所有port、router、subnet后,再用如下命令检查一遍,应该为空

2) 停止Neutron服务

当Neutron在计算和控制节点上管理OVS实例时,OpenDaylight和Neutron可能会发生冲突。为防止出现问题,我们需要关闭控制节点Neutron服务,并在所有节点上关闭Neutron的Open vSwitch agent。

关闭Neutron服务:

控制节点执行

[root@controller ~ (keystone_admin)]# systemctl stop neutron-server
[root@controller ~ (keystone_admin)]# systemctl stop neutron-l3-agent
[root@controller ~ (keystone_admin)]# systemctl disable neutron-l3-agent

关闭并禁用Neutron的代理服务:

控制节点和计算节点执行

systemctl stop neutron-openvswitch-agent
systemctl disable neutron-openvswitch-agent

3) 停止Open vSwitch服务,并清除现有的OVSDB

控制节点和计算节点执行

systemctl stop openvswitch
rm -rf /var/log/openvswitch/*
rm -rf /etc/openvswitch/conf.db
systemctl start openvswitch

查看ovs状态时应该没有任何的网桥

[root@compute ~]# ovs-vsctl show
9f0995a9-5d9e-433b-aae4-0fa447a9e8a6
    ovs_version: "2.11.0"

4) 将其交给ODL管理

控制节点和计算节点执行

ovs-vsctl set-manager tcp:192.168.4.150:6640

(设置所有节点上用于VXLAN连接的IP。该IP必须与每台计算机上的实际linux接口相对应)

控制节点执行

ovs-vsctl set Open_vSwitch . other_config:local_ip=192.168.4.145
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex eno2
ovs-vsctl set Open_vSwitch . other_config:provider_mappings=provider:br-ex
ovs-vsctl set Open_vSwitch . external_ids:provider_mappings="{\"provider\": \"br-ex\"}"

计算节点执行

ovs-vsctl set Open_vSwitch . other_config:local_ip=192.168.4.144

ovs-vsctl show命令可以看到OpenDaylight将自动创建一个连接到控制器的br-int网桥

[root@controller ~ (keystone_admin)]# ovs-vsctl show
97391679-66bb-4654-a4bd-ef22b45b9c27
    Manager "tcp:192.168.4.150:6640"
        is_connected: true
    Bridge br-int
        Controller "tcp:192.168.4.150:6653"
            is_connected: true
        fail_mode: secure
        Port br-int
            Interface br-int
                type: internal
    ovs_version: "2.11.0"

如果您没有在上面看到结果,可能存在iptables限制,需要打开相关端口(6640、6653)。
同时要在opendaylight服务器上禁用selinux。

setenforce 0
sed -i -e 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

5) 配置Neutron中使用OpenDaylight

  • 安装Neutron networking-odl模块

控制节点和计算节点执行

[root@controller ~ (keystone_admin)]# yum install python2-networking-odl
  • 配置Neutron以使用OpenDaylight的ML2驱动程序

控制节点执行

[root@controller ~ (keystone_admin)]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers = opendaylight_v2
tenant_network_types = vxlan
[ml2_odl]
url = http://192.168.4.150:8181/controller/nb/v2/neutron
password = admin
username = admin
port_binding_controller = pseudo-agentdb-binding
enable_dhcp_service = True
  • 配置Neutron以将OpenDaylight的odl-router服务插件用于L3连接:

控制节点执行

[root@controller ~ (keystone_admin)]# vim /etc/neutron/neutron.conf 
[DEFAULT]
service_plugins = odl-router_v2
  • 配置Neutron DHCP代理以提供元数据服务:

控制节点执行

[root@controller ~ (keystone_admin)]# vim /etc/neutron/dhcp_agent.ini
[DEFAULT]
force_metadata = True
[ovs]
ovsdb_interface = vsctl
  • 重置Neutron的数据库 (控制节点)

控制节点执行

[root@controller ~ (keystone_admin)]#mysql  -u root  -p123456  -e "DROP DATABASE IF EXISTS neutron;"
[root@controller ~ (keystone_admin)]#mysql   -u root  -p123456  -e "CREATE DATABASE neutron CHARACTER SET utf8;"
[root@controller ~ (keystone_admin)]#mysql   -u root  -p123456  -e " GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron'; "
[root@controller ~ (keystone_admin)]#neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
  • 重新启动neutron-server:

控制节点执行

systemctl start neutron-server
  • openstack启用odl控制:

控制节点和计算节点执行

neutron-odl-ovs-hostconfig --datapath_type=system

4.4 可能遇到的问题

  • OVS与OpenDaylight连接之后,不能自动创建br-int

原因:OpenDaylight的组件问题,组件之间可能相互干扰

解决办法:清空组件,安装以下组件(以下组件为最小配置,如需使用OpenDaylight的其他功能请依照需求自行添加)

odl-ovsdb-openstack odl-dlux-core

  • 重启neutron服务失败

原因是虽然指定了mechanism_driver为opendaylight,但是还没有安装此driver的实现。使用以下命令安装之后,就能重启neutron服务了。

yum install python2-pip
pip install networking_odl
  • 实验中,创建的虚拟机启动之后无法获取ip

原因:计算节点与网络节点的隧道没有建立

解决办法:将OVS相关信息告诉OpenDaylight,建立计算节点和网络节点之间的隧道,使得计算节点的虚拟机可以访问网络节点的dhcp服务。

ovs-vsctl set Open_vSwitch uuid other_config={'local_ip'='192.168.4.145'}
ovs-vsctl set Open_vSwitch uuid other_config={'local_ip'='192.168.4.144'}

上述命令中的uuid是OVS的uuid,可通过ovs-vsctl show命令查看,也可以通过ovs-vsctl get Open_vSwitch . _uuid命令查询,local_ip需要指定节点数据口的ip地址。

  • 虚拟机不能访问外网
  1. 需要修改网络节点/etc/neutron/l3_agent.ini文件,增加br-ex的配置,该配置在安装阶段默认留空,需要做如下配置:
[DEFAULT] 
external_network_bridge = br-ex

2. 为br-int和br-ex之间建立patch对,使它们之间可以通信

ovs-vsctl add-port br-ex "ex-patch-int"
ovs-vsctl set interface "ex-patch-int" type=patch
ovs-vsctl set interface "ex-patch-int" options:peer=int-patch-ex
 
ovs-vsctl add-port br-int "int-patch-ex"
ovs-vsctl set interface "int-patch-ex" type=patch
ovs-vsctl set interface "int-patch-ex" options:peer=ex-patch-int

4.5 验证测试

  • 验证OpenDaylight的ML2接口是否正常工作:
curl -u admin:admin http://192.168.4.150:8181/controller/nb/v2/neutron/networks
{
   "networks" : [ ]
}

如果这不起作用或出现错误,请检查中的Neutron日志文件/var/log/neutron/server.log。

这里的错误消息应该提供一些有关与OpenDaylight连接问题的线索。

使用Neutron CLI创建网络,子网,路由器,连接端口并启动实例:

neutron router-create router1
neutron net-create private
neutron subnet-create private --name=private_subnet 10.10.5.0/24
neutron router-interface-add router1 private_subnet
nova boot --flavor <flavor> --image <image id> --nic net-id=<network id> test1
nova boot --flavor <flavor> --image <image id> --nic net-id=<network id> test2

至此,OpenDaylight可以为网络上的实例创建网络端点并管理到它们的流量。

可以使用Horizon控制台访问VM,也可以通过发出 nova get-vnc-console novnc

通过控制台,可以验证虚拟机之间的连接。

添加用于浮动IP连接的外部网络

为了使用浮动IP连接到VM,我们需要通过创建外部网络和子网来配置外部网络连接。该外部网络必须链接到计算机上的物理端口,该端口将提供到外部网关的连接。

sudo ovs-vsctl set Open_vSwitch . other_config:provider_mappings=physnet1:eno2
neutron net-create public-net -- --router:external --is-default --provider:network_type=flat --provider:physical_network=physnet1
neutron subnet-create --allocation-pool start=10.10.10.2,end=10.10.10.254 --gateway 10.10.10.1 --name public-subnet public-net 10.10.0.0/16 -- --enable_dhcp=False
neutron router-gateway-set router1 public-net

neutron floatingip-create public-net
nova floating-ip-associate test1 <floating_ip>

4.6 结论

OpenStack和OpenDaylight可以分开安装,并进行集成,鉴于两者的版本变化很大,且有很多问题,中间集成的过程中可能因为安装环境不同,遇到各种问题。但都可以一一解决。

4.7 参考资料

如有其它问题,请填写右侧需求表单联系我们。

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2