zoukankan      html  css  js  c++  java
  • Neutron小结

    《深入理解OpenStack Neutron》基础学习

    参考:

    https://read.douban.com/ebook/45214941/

    https://blog.51cto.com/arkling/2289431

    https://blog.csdn.net/chengqiuming/article/details/80369680

    https://www.jianshu.com/p/78f252e4c08f

    https://www.jianshu.com/p/55addeaee178

    前言:

    Linux虚拟网络既是构建Neutron网络的基础,也是构建Neutron代码的基础。Neutron的代码写到最后,不过是调用Linux的命令行而已(也包括调用OVS的命令行)。调用命令行只是Neutron代码的最后一步,在这之前Neutron还需要知道调用什么命令行。这涉及到能否正确分配逻辑资源问题。Neutron不仅需要具备分配逻辑资源的机制,还需要创建相应的虚拟网元,并将这些虚拟网元正确地连接和配置,构建成正确的网络。Neutron所能支持的二、三层网络特性,不仅体现在它的代码中,也体现在它的资源模型中,并且以RESTful接口的形式对外提供服务。

    第一章 Neutron概述

    1.2 Neutron的特性与应用

    当前支持的特性如下。

    特性

    备注

    Networks

    支持的网络类型有:

    Local,Flat,VLAN,VXLAN,GRE,Geneve

    Subnets

    Ports

    Routers

    支持路由转发,SNATDNAT,外部网关等功能

    Security Groups

    External Networks

    支持Floating IP和安全组

    DVR

    Distributed Virtual Routers

    L3 High Availability

    支持虚拟路由冗余协议

    Quality of Service

    Border Gateway Protocol

    支持BGPMPLS VPN

    DNS

    Turnk Ports

    支持VLAN aware VM

    Metering

    L3路由级路由度量

    Routed Provider

    将多段3层封装为一个网络实体

    1.2.1 基于OpenStack的应用

    基于OpenStack的应用,就是原生的云应用,Neutron作为OpenStack中的网络部件,为用户提供网络服务。

    1.2.2 基于SDN的应用

    所有的SDN控制器都是挂接在Neutron之下的。这不仅因为业界期望Neutron能够成为统一的北向接口,也是源于Neutron的可扩展能力。

    第二章 Linux虚拟网络基础

    2.1 tap

    tap从功能定位上来讲,位于数据链路层,数据链路层的主要协议有:

    点对点协议(point-to-point Protocol

    以太网(Ethernet

    高级数据链路协议(High-Level Link Protocol

    帧中继(Frame Relay

    异步传输模式(Asynchronous Rransfer Mode

    但在这些以太网协议中tap只与以太网(Ethernet)协议对应。所以,tap有时也被称为“虚拟以太网设备”。

    #创建一个tap设备

    tunctl -t tap_test

    #查看

    ip link list 或者 ifconfig -a

    #绑定IP地址

    ip addr add local 192.168.100.1/24 dev tap_test

    #或者

    ifconfig tap_test 192.168.100.1/24

    2.2 namespace

    Linux namespace 隔离的资源

    资源

    含义

    uts_ns

    UTSUnix Timesharing System的简称,包含内存名称、版本、底层体系结构等信息

    ipc_ns

    所有与进程间通信(IPC)有关的信息

    mnt_ns

    当前装载的文件系统

    pid_ns

    有关进程ID的信息

    user_ns

    资源配额的信息

    net_ns

    网络信息

    #查看

    ip netns list

    #创建

    ip netns add ns_test

    #将上面的虚拟设备迁移到namsspace里面

    ip link set tap_test netns ns_test

    #查看或者操作namespace里面的设备

    # ip [-all] netns exec [NAME] cmd

    #绑定IP

    ip netns exec ns_test ifconfig tap_test 192.168.100.1/24 up

    ip netns exec ns_test ifconfig tap_test ifconfig -a

    2.3 veth pair

    veth pair不是一个设备,而是一对设备,以连接两个虚拟以太网端口。操作veth pair要和namespace配合使用。

     

     

    #创建veth_pair

     ip link add tap1 type veth peer name tap1_peer  

     ip link add tap2 type veth peer name tap2_peer  

     ip link add tap3 type veth peer name tap3_peer  

     ip link add tap4 type veth peer name tap4_peer  

    #创建ns

     ip netns add ns1  

     ip netns add ns2  

     ip netns add ns3  

     ip netns add ns4   

    #tap移动到对应的ns

     ip link set tap1 netns ns1  

     ip link set tap2 netns ns2  

     ip link set tap3 netns ns3  

     ip link set tap4 netns ns4  

    #创建bridge

     brctl addbr br1  

    #tap peer添加到对应的bridge

     brctl addif br1 tap1_peer  

     brctl addif br1 tap2_peer  

     brctl addif br1 tap3_peer  

     brctl addif br1 tap4_peer  

    #配置对应tapIP地址

     ip netns exec ns1 ip addr add 192.168.10.1/24 dev tap1  

     ip netns exec ns2 ip addr add 192.168.10.2/24 dev tap2  

     ip netns exec ns3 ip addr add 192.168.10.3/24 dev tap3  

     ip netns exec ns4 ip addr add 192.168.10.4/24 dev tap4  

    #bridge和所有tap设备up

     ip link set br1 up  

     ip link set tap2_peer up  

     ip link set tap2_peer up  

     ip link set tap3_peer up  

     ip link set tap4_peer up  

     ip netns exec ns1 ip link set tap1 up  

     ip netns exec ns2 ip link set tap2 up  

     ip netns exec ns3 ip link set tap3 up  

     ip netns exec ns4 ip link set tap4 up

    2.4 Bridge

    brctl show

    brctl addbr <br>

    brctl delbr <br>

    brctl addif <br> <device>

    ...

    2.5 Router

    #查看转发功能是否打开

    less /proc/sys/net/ipv4/ip_forward

    #打开

    echo "1" > /proc/sys/net/ipv4/ip_forward

    2.6 tun

    Linux一共原生支持5中三层隧道。ipip/gre/sit(Ipv6 over IPv4)等。

    #ns1上创建tun1 ipip tunnel

    ip netns exec ns1 ip tunnel add tun1 mode ipip remote 192.168.200.2 local 192.168.100.2 ttl 255

    ip netns exec ns1 ip link set tun1 up

    ip netns exec ns1 ip addr add 192.168.50.10 peer 192.168.60.10 dev tun1

    #ns2上创建tun2 ipip tunnel

    ip netns exec ns2 ip tunnel add tun2 mode ipip remote 192.168.100.2 local 192.168.200.2 ttl 255

    ip netns exec ns2 ip link set tun2 up

    ip netns exec ns2 ip addr add 192.168.60.10 peer 192.168.50.10 dev tun2

    第三章 Neutron的网络实现模型

    3.1 总览

    从部署角度来说,Neutron分为三类节点:控制节点、计算节点、网络节点。网络节点和计算节点为VM构建了具体的网络,控制节点则对这些网络进行管理。Neutron的实现模型如下图所示。

     

    控制节点的Neutron进程和网络节点、计算节点的各个Agent进程互相配合(RPC通信),对内完成对网络节点、计算节点中虚拟网元的配置管理,对外提供RESTful等服务接口。

    计算节点中的各个Bridge构建了Neutron中的LocalflatVLAN,GRE,VXLAN等二层网络。

    br-ethxbr-tun对外构建用户网络,对内则为br-int屏蔽用户网络的各种差异,将不同类型的用户网络统统转换为VLAN网络。

    网络节点为Neutron提供了其他网络服务,比如DHCP等。网络节点中Router,则提供三层服务,除了普通的路由转发外,还提供SNAT/DNAT等功能。

     

    3.2 计算节点的实现模型

    一个基于OpenStack的云系统会有很多计算节点,一个计算节点就是一个Host。计算节点里充满了VM,但是VM之间需要通信。二层需要Bridge,三层需要Router

    下面以VXLAN为例,VLANGRE模型均类似。

    3.2.1 VXLAN模型为例

    VXLAN的实现模型与VLAN的实现模型非常相像

    从表面来看,VXLANVLAN的实现模型相比,仅仅一个差别:VLAN中对应的br-ethx,而VXLAN中对应的是br-tunbr-tun是一个混合单词的缩写:Bridge-Tunnel。此时的TunnelVXLAN Tunnel

    其实,br-ethx是一个OVSbr-tun也是一个OVS。所有说,两者的差别不是实现组件的差别,而是组件所执行功能的差别。br-ethx所执行的一个普通二层交换机的功能,br-tun所执行的是VXLANVTEP的功能,上图中两个tun所对应的接口IP分时标识为10.0.100.8810.0.100.77,这两个IP就是VXLAN的隧道终结点IP

    VXLANVLAN一样也存在内外VID的转换。通过VXLAN,就可以明白Neutron为什么要做内外VID的转换。

     

    上图把br-tun一分为二,设想为两部分:上层是VTEP,对VXLAN隧道进行了终结;下层是一个普通的VLAN Bridge。所以,对于Host来说,它有两层网络,虚线以上是VXLAN网络,虚线以下是VLAN网络。如此一来,VXLAN内外VID的转换则变成了不得不做工作,因为它不仅仅是表面上看起的那样,仅仅是VID数值的转变,而且背后蕴含着网络类型的转变。

    VLAN类型的网络并不存在VXLAN这样的问题。当Host遇到VLAN时,它并不会变成两重网络,可为什么要做内外VID的转换呢?这主要是为了避免内部VLAN ID的冲突。内部VLAN ID是体现在br-int上的,而一个Host内装有1br-int,也就是说VLANVXLAN是共用一个br-int.假如VLAN网络不做内外VID的转换,则很可能引发br-int上的内部VLAN ID冲突,如下表。

    网络类型

    用户视角(外部VID

    Host视角(内部VLAN)

    备注

    VLAN

    100(VLAN)

    100VLAN)

    假设内外VID不做转换

    VXLAN

    1000VNI

    100(VLAN)

    内部VLAN 冲突

    VXLAN做内外VID转换时,并不知道VLAN的外部VID是什么,所以它就根据自己的算法将内部VID转换为100,结果很不辛,与VLAN网络的外部VID相等。因为VLAN的内部VID没有做转换,仍然等于外部VID,所以两者在br-int上产生了冲突。正是这个原因,所以VLAN类型的网络,也要做内外VID的转换,而且所有的网络类型都需要做VID的转换。这样的话Neutron就能统一掌控,从而避免内部VID的冲突。

    VXLAN的转换过程如下:

    1 出报文的VID转换过程:

     

    2 入报文VID转换过程如下:

     

    3.2.2计算节点的实现网络模型小结

    计算节点一共分为两层:用户网络层、本地网络层。

     

    (1)用户网络层,是指OpenStack的用户创建的网络,即外部网络(相对于Host内部网络而言)。用户网络层对应的Bridgebr-ethx(对应FlatVLAN等非隧道二层网络)或者br-tun(对应VXLAN,GRE等隧道型三层网络),载体一般都是OVS。用户网络层的功能是将用户网络和本地网络(Host内部的本地网络)进行相互转换,比如VID转换,VXLAN封装与解封装等。用户网络层是对本地网络层的一个屏蔽,即不管用户网络采用什么技术(比如VLANVXLANGRE等),本地网络都仅用VLAN技术。

    (2)本地网络层,是指Host内部的本地网络。本地网络层也分为两层,一个是qbr(载体为Linux Bridge),它仅仅是负责安全,称为安全层。br-int的实现载体一般为OVS,它负责内部交互,称为为Bridge层。

    3.3 网络节点的实现模型

     

    Neutron的网络节点的实现模型,如图所示。从网络视角,网络节点分为4层:用户网络层、本地网络层、网络服务层、外部网络层。前两层和计算节点类似。

    (1)网络服务层,为计算节点的VM提供网络服务,比如DHCPRouter Service,且可以利用多个namespace,在每个namespace中开启DHCPRouter

    (2)外部服务层。外部服务层包含br-ex,严格来说还包含的Router,毕竟Router才是连接外部的主体,而br-ex不过是将Router对接到网络节点的物理网络。

  • 相关阅读:
    Android Studio 第一次启动应该注意的事项
    synchronized 和 volatile 比较
    synchronized 和 volatile 比较
    【Light】[1214]Large Division
    【Light】[1214]Large Division
    【Light】[1116]Ekka Dokka
    【Light】[1116]Ekka Dokka
    【Light】[1078]Integer Divisibility
    【Light】[1078]Integer Divisibility
    【Light】[1008]Fibsieve`s Fantabulous Birthday
  • 原文地址:https://www.cnblogs.com/sunnypoem/p/12491174.html
Copyright © 2011-2022 走看看