跳转到: 导航, 搜索

Neutron/ServiceInsertionAndChaining

旧版本链接

Neutron/APIForServiceChaining

贡献者

每周 IRC 项目会议信息

每周四 1700 UTC 在 #openstack-meeting-4 https://wiki.openstack.org/wiki/Meetings/ServiceFunctionChainingMeeting

networking-sfc IRC 频道

还有一个 #networking-sfc SFC IRC 频道

概述

服务功能链是一种覆盖基于目的地的典型 IP 网络转发的机制。它在概念上与物理网络中的 基于策略的路由 相关,但通常被认为是软件定义网络技术。它通常与安全功能结合使用,尽管它也可以用于更广泛的功能。从根本上说,SFC 能够使网络数据包流通过网络以不同于通过数据包的目的 IP 地址在路由表中查找所选择的路径。它最常与 网络功能虚拟化 结合使用,在虚拟环境中重现一系列传统上由通过电缆连接的物理网络设备集合实现的网络功能。

服务链的一个非常简单的例子是强制所有从点 A 到点 B 的流量都通过防火墙,即使防火墙从路由表的角度来看并不在点 A 和点 B 之间。

一个更复杂的例子是按顺序排列的一系列函数,每个函数都在多个 VM 中实现,以便流量必须在链中的每个跃点通过一个 VM,但网络使用哈希算法将不同的流分布到每个跃点的多个 VM 上。

Series-Parallel Service Chain

在 Liberty 周期中,正在为 Neutron 开发服务功能链的 API 和初始参考实现。

单主机 networking-sfc 安装步骤和测试环境设置

如果您的测试环境中已经安装了以前的 networking-sfc 补丁,请执行以下操作以获取新的更新补丁代码集

1. 清理 networking-sfc

  • cd /opt/stack
  • rm –rf networking-sfc

2. 将 networking-sfc 克隆到本地仓库

3. cd /opt/stack/networking-sfc 并运行 "sudo python setup.py install"

4. cd ~/devstack/ 并运行 unstack.sh 和 stack.sh


如果您之前尚未在测试环境中安装 networking-sfc,请执行以下操作以获取补丁代码集

1. 安装 Ubuntu 14.04 和 git

  • sudo apt-get update
  • sudo apt-get install git-core
  • git config --global user.name "testuser"
  • git config --global user.email "testuser@example.com"
  • sudo apt-get install software-properties-common
  • sudo add-apt-repository cloud-archive:mitaka


2. 升级 Linux 内核和 Open vSwitch 2.5.0

  • sudo apt-get install linux-image-generic-lts-wily linux-headers-generic-lts-wily
  • sudo reboot (重启服务器以确保安装了新的内核)
  • apt-cache policy openvswitch-switch ( 确保 Candidate 是 2.5.0-0ubuntu1~cloud0)
  • sudo apt-get install openvswitch-switch
  • sudo ovs-vsctl -V (确保您已安装 Open vSwitch 2.5.0)


3. 将 networking-sfc 克隆到本地仓库


4. 下载 devstack


5. 将 local.conf 复制到本地仓库并添加以下行

或者

  • enable_plugin networking-sfc /opt/stack/networking-sfc


6. 运行 stack.sh

  • cd devstack
  • ./stack.sh

如果报告了一些错误,请阅读错误消息并尝试修复它。

7. 安装 OVS 2.4 或 OVS 2.5。请注意,OVS 版本应与其支持的 Linux 内核版本匹配,以便 OVS 正常工作。下表列出了 Open vSwitch 内核模块将成功构建的 Linux 内核版本。

Open vSwitch Linux 内核
2.0.x 2.6.32 到 3.10
2.1.x 2.6.32 到 3.11
2.3.x 2.6.32 到 3.14
2.4.x 2.6.32 到 4.0
2.5.x 3.1 及更高版本


8. 运行 unstack.sh 和 stack.sh

  • ./unstack
  • ./stack

在我们的单服务器测试环境中,所有 OpenStack 组件都在一台物理服务器上运行。我们创建了 3 个 VM,一个用于源 VM,另一个用于服务功能 VM,最后一个用于目标 VM。

数据路径封装流程

SFC-datapath-flow-format-MAC-Rewriting


初始参考实现将基于使用流表条目编程 Open vSwitch,这些条目会覆盖默认的基于 MAC 的转发,而是基于通过 Neutron SFC API 定义的标准转发帧。对于具有 Neutron 集成和 SFC 功能的第三方 SDN 实现(例如 Contrail、Nuage 等),也可以编程它们各自的转发平面,基于 Neutron SFC API,但这取决于各自的供应商更新其 SDN 控制器与 Neutron 的集成。


多主机安装

术语

  • H1 – 物理主机 1(控制器 + 网络 + 计算)
  • H2 – 物理主机 2(计算)
  • H3 – 物理主机 3(计算)
  • SRC – 源 VM
  • SF1 – 服务功能 1
  • SF2 – 服务功能 2
  • DST – 目标 VM


SRC                             DST
  |                              |
 H1=============H2===============H3
  |             |                                   
SF1             SF2


重要提示:当前,使用 OVS 2.4.0 时,内核模块会丢弃命中洪泛条目的 MPLS over tunnel 数据包。可以通过启用 l2population 来解决此问题。请参阅以下步骤以获取详细的设置说明。

步骤 1:准备 H1(控制器 + 网络 + 计算)

步骤 1.1

H1 的 local.conf:localrc

SERVICE_TOKEN=abc123
ADMIN_PASSWORD=abc123
MYSQL_PASSWORD=abc123
RABBIT_PASSWORD=abc123
SERVICE_PASSWORD=$ADMIN_PASSWORD
 
HOST_IP=10.145.90.160
SERVICE_HOST=10.145.90.160
SYSLOG=True
SYSLOG_HOST=$HOST_IP
SYSLOG_PORT=516

LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2

disable_service tempest

RECLONE=no
PIP_UPGRADE=False

MULTI_HOST=TRUE

# Disable Nova Networking
disable_service n-net

# Disable Nova Compute
#disable_service n-cpu

# Neutron - Networking Service
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service neutron

# Cinder
disable_service c-api
disable_service c-sch
disable_service c-vol

# Disable security groups
Q_USE_SECGROUP=False
LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver

enable_plugin networking-sfc /opt/stack/networking-sfc

步骤 1.2:从您的 /opt/stack/devstack 运行 ./stack.sh

步骤 1.3:devstack 完成后,手动覆盖关键的 neutron 配置文件。我就是这样做的。我相信有一种方法可以直接在 local.conf 文件中进行配置。我手动修改以下文件 /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/l3_agent.ini /etc/neutron/dhcp_agent.ini /etc/neutron/dnsmasq-neutron.conf

/etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
tenant_network_types = vxlan
extension_drivers = port_security
type_drivers = local,flat,vlan,gre,vxlan
mechanism_drivers = openvswitch,linuxbridge,l2population

[ml2_type_flat]
flat_networks=public

[ml2_type_vxlan]
vni_ranges = 8192:100000

[securitygroup]
enable_security_group = False
enable_ipset = False
firewall_driver = neutron.agent.firewall.NoopFirewallDriver

[agent]
tunnel_types = vxlan
l2_population = True
arp_responder = True
root_helper_daemon = sudo /usr/local/bin/neutron-rootwrap-daemon /etc/neutron/rootwrap.conf
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf

[ovs]
datapath_type = system
tunnel_bridge = br-tun
bridge_mappings = public:br-ex
local_ip = 192.168.2.160


/etc/neutron/l3_agent.ini

[DEFAULT]
l3_agent_manager = neutron.agent.l3_agent.L3NATAgentWithStateReport
external_network_bridge = br-ex
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
ovs_use_veth = False
use_namespaces = True
debug = True
verbose = True

[AGENT]
root_helper_daemon = sudo /usr/local/bin/neutron-rootwrap-daemon /etc/neutron/rootwrap.conf
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf


/etc/neutron/dhcp_agent.ini

[DEFAULT]
dhcp_agent_manager = neutron.agent.dhcp_agent.DhcpAgentWithStateReport
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
ovs_use_veth = False
use_namespaces = True
debug = True
verbose = True
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

[AGENT]
root_helper_daemon = sudo /usr/local/bin/neutron-rootwrap-daemon /etc/neutron/rootwrap.conf
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf


/etc/neutron/dnsmasq-neutron.conf

dhcp-option-force=26,1450

步骤 1.4:修改上述文件后,重新启动以下服务 q-svc、q-agt、q-dhcp、q-l3

您的 Host1(控制器+网络+计算)现在已准备好进行多节点操作


步骤 2:准备 H2(计算)

步骤 2.1

H2 的 local.conf

localrc

SERVICE_TOKEN=cisco123123
ADMIN_PASSWORD=cisco123123
MYSQL_PASSWORD=cisco123123
RABBIT_PASSWORD=cisco123123
DATABASE_PASSWORD=cisco123123
SERVICE_PASSWORD=$ADMIN_PASSWORD
DATABASE_TYPE=mysql

HOST_IP=10.145.90.166
SERVICE_HOST=10.145.90.160
SYSLOG=True
SYSLOG_HOST=$HOST_IP
SYSLOG_PORT=516
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
Q_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292

NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

LOGFILE=$DEST/logs/stack.sh.log
LOGDAYS=2

disable_service tempest

RECLONE=no
PIP_UPGRADE=False

MULTI_HOST=TRUE

# Disable Nova Networking
disable_service n-net
disable_service neutron

# Neutron - Networking Service
ENABLED_SERVICES=n-cpu,q-agt

# Disable security groups
Q_USE_SECGROUP=False
LIBVIRT_FIREWALL_DRIVER=nova.virt.firewall.NoopFirewallDriver

enable_plugin networking-sfc /opt/stack/networking-sfc

步骤 2.2:从您的 /opt/stack/devstack 运行 ./stack.sh


步骤 2.3:如下覆盖 /etc/neutron/plugins/ml2/ml2_conf.ini

/etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
tenant_network_types = vxlan
extension_drivers = port_security
type_drivers = local,flat,vlan,gre,vxlan
mechanism_drivers = openvswitch,linuxbridge,l2population

[ml2_type_vxlan]
vni_ranges = 8192:100000

[securitygroup]
enable_security_group = True
enable_ipset = False
#firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
firewall_driver = neutron.agent.firewall.NoopFirewallDriver

[agent]
tunnel_types = vxlan
root_helper_daemon = sudo /usr/local/bin/neutron-rootwrap-daemon /etc/neutron/rootwrap.conf
root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
l2_population = True
arp_responder = True

[ovs]
datapath_type = system
tunnel_bridge = br-tun
local_ip = 192.168.2.166

步骤 2.4:修改上述文件后,重新启动 q-agt 服务。


步骤 3:准备 H3(计算),类似于 H2


步骤 4:您的 3 节点多主机设置现在已准备好配置服务链。