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.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所示:
部署过程中所涉及到的服务器管理网口的IP地址如下表所示:
设备名称 | 接口 | IP地址 | 备注 |
---|---|---|---|
controller | 管理口 | 192.168.4.145 | |
compute | 管理口 | 192.168.4.144 | |
ODL | 管理口 | 192.168.4.150 |
表1:服务器理口列表
3 硬件与软件环境
部署环境中涉及到的硬件和软件如表2和表3所示:
名称 | 类型 | 硬件指标 | 数量 | 备注 |
---|---|---|---|---|
服务器 | X86 | 1.至少8G内存 | 3 | |
2.磁盘不少于500G | ||||
3.Server1和Server3的BIOS开启CPU嵌套虚拟化(INTEL:VT-x,AMD:AMD-V) |
表2:硬件环境
软件 | 版本 | 备注 |
---|---|---|
操作系统 | Centos7.7 | 安装时选择Compute Node 模式,根目录/至少500G |
OpenStack | stein | |
ODL | karaf-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,位于
解压:
[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地址。
- 虚拟机不能访问外网
- 需要修改网络节点/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 参考资料
- https://docs.opendaylight.org/projects/netvirt/en/stable-oxygen/openstack-guide/openstack-with-netvirt.html#installing-opendaylight-on-an-existing-openstack
- https://docs.opendaylight.org/en/stable-nitrogen/getting-started-guide/common-features/dlux.html
- https://docs.openstack.org/networking-odl/latest/install/installation.html#odl-installation
- https://www.sdnlab.com/18099.html
如有其它问题,请填写右侧需求表单联系我们。