【SFC】学习 -- Service Function Chain 实验验证3

151 阅读2分钟

image.png

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

  • 创建VLAN网络

image.png

SFC_VLAN_1
10.0.10.0/24
10.0.10.100,10.0.10.252


SFC_VLAN_2
10.0.11.0/24
10.0.11.100,10.0.11.252


SFC_VLAN_3
10.0.12.0/24
10.0.12.100,10.0.12.252


SFC_VLAN_4
10.0.13.0/24
10.0.13.100,10.0.13.252

交换机配置

interface range Ten-GigabitEthernet 1/0/10 to Ten-GigabitEthernet 1/0/35
port trunk permit vlan 2010 to 2013

interface Vlan-interface 2010
ip address 10.0.10.254 24


interface Vlan-interface 2011
ip address 10.0.11.254 24

interface Vlan-interface 2012
ip address 10.0.12.254 24

interface Vlan-interface 2013
ip address 10.0.13.254 24

openstack port create --network vlan29-mgt pm6
openstack port create --network vlan29-mgt pm7 
openstack port create --network vlan29-mgt pm8 
openstack port create --network vlan29-mgt pm9 
openstack port create --network vlan29-mgt pm10

openstack port create --network SFC_VLAN_1 ps8 
openstack port create --network SFC_VLAN_1 ps9 
openstack port create --network SFC_VLAN_2 ps10 
openstack port create --network SFC_VLAN_2 ps11
openstack port create --network SFC_VLAN_3 ps12
openstack port create --network SFC_VLAN_3 ps13
openstack port create --network SFC_VLAN_4 ps14
openstack port create --network SFC_VLAN_4 ps15


openstack port set --no-security-group pm6
openstack port set --no-security-group pm7
openstack port set --no-security-group pm8
openstack port set --no-security-group pm9
openstack port set --no-security-group pm10

openstack port set --no-security-group ps8
openstack port set --no-security-group ps9
openstack port set --no-security-group ps10
openstack port set --no-security-group ps11
openstack port set --no-security-group ps12
openstack port set --no-security-group ps13
openstack port set --no-security-group ps14
openstack port set --no-security-group ps15

openstack port set --disable-port-security pm6
openstack port set --disable-port-security pm7
openstack port set --disable-port-security pm8
openstack port set --disable-port-security pm9
openstack port set --disable-port-security pm10


openstack port set --disable-port-security ps8
openstack port set --disable-port-security ps9
openstack port set --disable-port-security ps10
openstack port set --disable-port-security ps11
openstack port set --disable-port-security ps12
openstack port set --disable-port-security ps13
openstack port set --disable-port-security ps14
openstack port set --disable-port-security ps15

openstack server create --image centos7.9 --flavor 2C2G50G --port pm6 --port ps8 SFC-VLAN-SRC

openstack server create --image centos7.9 --flavor 2C2G50G --port pm7 --port ps9 --port ps10 SFC-VLAN-VM1

openstack server create --image centos7.9 --flavor 2C2G50G --port pm8 --port ps11 --port ps12 SFC-VLAN-VM2

openstack server create --image centos7.9 --flavor 2C2G50G --port pm9 --port ps13 --port ps14 SFC-VLAN-VM3

openstack server create --image centos7.9 --flavor 2C2G50G --port pm10 --port ps15 SFC-VLAN-DEST

# 192.168.10.11 SRC
# 192.168.10.31 vm1
# 192.168.10.37 vm2
# 192.168.10.25 vm3
# 192.168.10.24 vm4

image.png

  • 由于使用的为VLAN组网,因此虚机可以访问自己的网关
openstack sfc port pair create --ingress ps9 --egress ps10 PP4
openstack sfc port pair create --ingress ps11 --egress ps12 PP5
openstack sfc port pair create --ingress ps13 --egress ps14 PP6
  • 创建接口报错,SFC不支持VLAN组网

image.png

查看networking_sfc源码,有这么一处:

@log_helpers.log_method_call  
def _get_port_detail_info(self, port_id):  
    *"""Get port detail.  
  
    @param: port_id: uuid  
    @return: (host_id, local_ip, network_type, segment_id,  
    service_insert_type): tuple  
    """  
  
*core_plugin = directory.get_plugin()  
    port_detail = core_plugin.get_port(self.admin_context, port_id)  
    host_id, local_ip, network_type, segment_id, mac_address = (  
        (None, ) * 5)  
  
    if port_detail:  
        host_id = port_detail['binding:host_id']  
        network_id = port_detail['network_id']  
        mac_address = port_detail['mac_address']  
        network_info = core_plugin.get_network(  
            self.admin_context, network_id)  
        network_type = network_info['provider:network_type']  
        segment_id = network_info['provider:segmentation_id']  
  
    if network_type != const.TYPE_VXLAN:  
        LOG.warning("Currently only support vxlan network")  
        return ((None, ) * 5)  
    elif not host_id:  
        LOG.warning("This port has not been binding")  
        return ((None, ) * 5)  
    else:  
        driver = core_plugin.type_manager.drivers.get(network_type)  
        host_endpoint = driver.obj.get_endpoint_by_host(host_id)  
        if host_endpoint:  
            local_ip = host_endpoint['ip_address']  
        else:  
            local_ip = None  
  
    return host_id, local_ip, network_type, segment_id, mac_address

目前只支持vxlan网络,否则host_id, local_ip, network_type, segment_id, mac_address设置为空,因此会引发上述异常。