openstack-neutron

  1、neutron

    1.1 neutron架构

   

 

neutron-server

对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理请求

Plugin

处理 Neutron Server 发来的请求,维护 OpenStack 逻辑网络的状态, 并调用 Agent 处理请求

分为core plugin 和 service plugin,已经集成到 neutron server,不需要运行独立的 plugin 服务。

neutron-dhcp-agent

提供DHCP服务

neutron-metadata-agent

为虚拟机访问metadata服务提供网络通道

该agent 让 instance 能够通过 dhcp-agent 或者 l1-agent 与 nova-metadata-api 通信

neutron-openvswitch-agent

配置openvswitch流表,提供二层转发路径

neutron-vc-vswitch-agent

对接VMWare,将Neutron网络模型转换成VMWare的网络模型,形成统一虚拟网络

neutron-sriov-nic-agent

支持SRIOV网卡虚拟化

network provider

提供网络服务的虚拟或物理网络设备,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交换机。

   1.2 网络概念

      参考:https://www.cnblogs.com/CloudMan6/p/5716947.html

   1.3 部署架构

        参考:https://www.cnblogs.com/CloudMan6/p/5710297.html

   1.4 Neutron server

       参考:https://www.cnblogs.com/CloudMan6/p/5718110.html

       Core Plugin,其功能是维护数据库中 network, subnet 和 port 的状态,并负责调用相应的 agent 在 network provider 上执行相关操作,比如创建 network。

   1.5 ML2 plugin替代原有的core plugin,减少开发成本和使用多个network provider

        

   1.6 service plugin

        参考:https://www.cnblogs.com/CloudMan6/p/5770744.html

        

        

          Firewall 与 Security Group 的区别在于:

              1、Firewall 安全策略位于 router,保护的是某个 project 的所有 network。

              2、Security Group 安全策略位于 instance,保护的是单个 instance。

    1.7 部署架构

          参考:https://www.cnblogs.com/CloudMan6/p/5784099.html

    1.8 linux-bridge

       1.8.0 linux bridge 环境中的各种网络设备    参考: https://www.cnblogs.com/CloudMan6/p/5808629.html

            一个数据包从 instance 发送到物理网卡会经过下面几个类型的设备:

1、tap interface 命名为 tapN (N 为 0, 1, 2, 1......)。
2、linux bridge 命名为 brqXXXX。
1、vlan interface 命名为 ethX.Y(X 为 interface 的序号,Y 为 vlan id)。
4、vxlan interface 命名为 vxlan-Z(z 是 VNI)。
5、物理 interface 命名为 ethX(X 为 interface 的序号)。

           mechanism driver配置  参考 https://www.cnblogs.com/CloudMan6/p/5801450.html

       1.8.1 local network配置     参考 https://www.cnblogs.com/CloudMan6/p/5811792.html

                  type_drivers = local

                  ps:local network下,只能同一主机内的vm可以互访

                                    

              小结local network
              1. 位于同一 local network 的 instance 可以通信。
              2. 位于不同 local network 的 instance 无法通信。
              1. 一个 local network 只能位于一个物理节点,无法跨节点。           

           通过gui创建network      参考 https://www.cnblogs.com/CloudMan6/p/5821721.html

          instance连接到network        参考 https://www.cnblogs.com/CloudMan6/p/5818174.html

            当 instance 启动时:

              1. 宿主机上的 neutron-linuxbridge-agent 会根据 port 信息创建 tap 设备,并连接到 local 网络所在的linux  bridge

              2. 同时该 tap 会映射成instance的虚拟网卡,即 virtual interface (VIF),tapxxxxxx(xxxxxx对应port id)。 

       1.8.2 flat network                          参考  https://www.cnblogs.com/CloudMan6/p/5869885.html

            

 

                flat network配置:                            参考  https://www.cnblogs.com/CloudMan6/p/5869885.html

                   在各节点 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 flat network 相关参数:

                         type_drivers = local,flat,vlan,gre,vxlan

                    接着需要指明 flat 网络与物理网卡的对应关系:

                        

                    ps:因为 flat 网络与物理网卡一一对应,一般情况下租户网络不会采用 flat

                创建flat network           参考  https://www.cnblogs.com/CloudMan6/p/5875849.html

             部署instance                  参考  https://www.cnblogs.com/CloudMan6/p/5880194.html

                                    

       1.8.3 配置dhcp服务           参考: https://www.cnblogs.com/CloudMan6/p/5887164.html

        DHCP agent 在网络节点运行上,默认通过 dnsmasq 实现 DHCP 功能

         linux namespace隔离      参考: https://www.cnblogs.com/CloudMan6/p/5894891.html

          作用:Neutron 通过 namespace 为每个 network 提供独立的 DHCP 和路由服务,从而允许租户创建重叠的网络。  

          veth pair实现两个namespace互通    

          tap19a0ed1d-fe 与 ns-19a0ed1d-fe 就是一对 veth pair,它们将 qdhcp-f151b42f-c1a1-4b6c-8865-c09b5b2aa274 连接到 brqf151b42f-c1。如下图所示:

             

       instance 获取 IP 的过程如下:        参考:https://www.cnblogs.com/CloudMan6/p/5905996.html  

/1、cirros-vm1 开机启动,发出 DHCPDISCOVER 广播,该广播消息在整个 flat_net 中都可以被收到。
2、广播到达 veth tap19a0ed1d-fe,然后传送给 veth pair 的另一端 ns-19a0ed1d-fe。dnsmasq 在它上面监听,dnsmasq 检查其 host 文件,发现有对应项,于是dnsmasq 以 DHCPOFFER 消息将 IP(172.16.1.101)、子网掩码(255.255.255.0)、地址租用期限等信息发送给 cirros-vm1。
1、cirros-vm1 发送 DHCPREQUEST 消息确认接受此 DHCPOFFER。
4、dnsmasq 发送确认消息 DHCPACK,整个过程结束。

      1.8.4 vlan network

       

       ps:这里的eth1为trunk口

       在ML2中配置Vlan Network   参考:https://www.cnblogs.com/CloudMan6/p/5922014.html

      创建第一个vlan network    参考: https://www.cnblogs.com/CloudMan6/p/5927400.html

        

      创建第二个vlan network        参考:https://www.cnblogs.com/CloudMan6/p/5914921.html

         

    1.8.5 router network

     简单介绍(路由服务提供跨valan间subnet 互联互通功能)   参考:https://www.cnblogs.com/CloudMan6/p/5950490.html

     配置L1 agnet                        参考:https://www.cnblogs.com/CloudMan6/p/5958211.html

     创建 router 连通 subnet                   参考:https://www.cnblogs.com/CloudMan6/p/5965919.html

     虚拟router原理                     参考:https://www.cnblogs.com/CloudMan6/p/5975106.html

       l1 agent 会为每个 router 创建了一个 namespace,通过 veth pair 与 TAP 相连,然后将 Gateway IP 配置在位于 namespace 里面的 veth interface 上,这样就能提供路由了            

       namespace 中有两个 interface:         

       qr-e17162c5-00 上设置了 Gateway IP 172.16.101.1,与 root namespace 中的 tape17162c5-00 组成 veth pair。
       qr-d568ba1a-74 上设置了 Gateway IP 172.16.100.1,与 root namespace 中的 tapd568ba1a-74 组成 veth pair。

       网络结构如图所示:

        

       为什么要用 namespace 封装 router?      参考:https://www.cnblogs.com/CloudMan6/p/5982514.html

         其根本原因是:为了支持网络重叠。

          不使用namespace,主机路由表会混乱,如下:

         

      访问外网 ML2 的配置   参考:https://www.cnblogs.com/CloudMan6/p/5990577.html   

        如果类型为 flat,控制节点 /etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:

         

        如果类型为 vlan,配置如下:

         

         修改配置后,需要重启 neutron 的相关服务。

      创建flat外网    参考:https://www.cnblogs.com/CloudMan6/p/5998198.html

      外网连接到 Neutron 的虚拟路由器  参考:https://www.cnblogs.com/CloudMan6/p/6005081.html

        外网访问原理分析          

          当数据包从 router 连接外网的接口 qg-b8b12a88-01 发出的时候,会做一次 Source NAT,即将包的源地址修改为 router 的接口地址 10.10.10.2,

        这样就能够保证目的端能够将应答的包发回给 router,然后再转发回源端 instance。SNAT 让 instance 能够直接访问外网,但外网还不能直接访问 instance   

        router 的每个 interface 在 namespace 中都有对应的 veth。 
          1、如果 veth 用于连接租户网络,命名格式为 qr-xxx,比如 qr-d568ba1a-74 和 qr-e17162c5-00。 
          2、如果 veth 用于连接外部网络,命名格式为 qg-xxx,比如 qg-b8b32a88-03。

         

      创建float ip 实现外网能访问内容instance    参考:https://www.cnblogs.com/CloudMan6/p/6011051.html

      floating IP 原理分析               参考:https://www.cnblogs.com/CloudMan6/p/6020949.html

       qg-b8b12a88-01网卡下,有两个ip

        

     iptables 增加了两条处理 floating IP 的规则: 
       1. 当 router 接收到从外网发来的包,如果目的地址是 floating IP 10.10.10.1,将目的地址修改为 cirros-vm1 的 IP 172.16.101.1。这样外网的包就能送达到 cirros-vm1。 
       2. 当 cirros-vm1 发送数据到外网,源地址 172.16.101.1 将被修改为 floating IP 10.10.10.1。

         

  1.8.6 VXLAN network

     VXLAN概念    参考:https://www.cnblogs.com/CloudMan6/p/6028281.html   

      VXLAN 封装和包格式

       

    VXLAN Tunnel Endpoint

        VXLAN 独立于底层的网络拓扑; 反过来,两个 VTEP 之间的底层 IP 网络也独立于 VXLAN。 
        VXLAN 数据包是根据外层的 IP header 路由的,该 header 将两端的 VTEP IP 作为源和目标 IP。

       

     VXLAN 包转发流程      参考:https://www.cnblogs.com/CloudMan6/p/6014721.html      

       目前比较成熟的 VTEP 软件实现包括:       

         1、带 VXLAN 内核模块的 Linux
         2、Open vSwitch

     在 ML2 中配置 VXLAN    参考:https://www.cnblogs.com/CloudMan6/p/6042974.html

    创建VXLAN          参考:https://www.cnblogs.com/CloudMan6/p/6051007.html

    部署 instance 到 VXLAN    参考:https://www.cnblogs.com/CloudMan6/p/6058985.html

      

    L2 Population作用(减少大量广播问题)    参考:https://www.cnblogs.com/CloudMan6/p/6064244.html

    配置 L2 Population              参考:https://www.cnblogs.com/CloudMan6/p/6072115.html

 1.87 Security Group    参考:https://www.cnblogs.com/CloudMan6/p/6081410.html

    过 iptables 对 instance 所在计算节点的网络流量进行过滤

    应用新安全组  参考:https://www.cnblogs.com/CloudMan6/p/6089115.html    

      安全组有以下特性:
      1. 通过宿主机上 iptables 规则控制进出 instance 的流量。
      2. 安全组作用在 instance 的 port 上。
      3. 安全组的规则都是 allow,不能定义 deny 的规则。
      4. instance 可应用多个安全组叠加使用这些安全组中的规则。

 1.88 Firewall as a Service(FWaaS)  

    理解概念和配置  参考:https://www.cnblogs.com/CloudMan6/p/6099111.html

     传统网络中的防火墙一般放在网关上,用来控制子网之间的访问。 FWaaS 的原理也一样,是在 Neutron 虚拟 router 上应用防火墙规则,控制进出租户网络的数据。   

      Firewall
      租户能够创建和管理的逻辑防火墙资源。 Firewall 必须关联某个 Policy,因此必须先创建 Policy。

      Firewall Policy
      Policy 是 Rule 的集合,Firewall 会按顺序应用 Policy 中的每一条 Rule。

     Firewall Rule
      Rule 是访问控制的规则,由源与目的子网 IP、源与目的端口、协议、allow 或 deny 动作组成。
      例如,我们可以创建一条 Rule,允许外部网络通过 ssh 访问租户网络中的 instance,端口为 22。

      与 FWaaS 容易混淆的概念是安全组(Security Group)。

      安全组的应用对象是虚拟网卡,由 L2 Agent 实现,比如 neutron_openvswitch_agent 和 neutron_linuxbridge_agent。
      安全组会在计算节点上通过 iptables 规则来控制进出 instance 虚拟网卡的流量。
      也就是说:安全组保护的是 instance

      FWaaS 的应用对象是 router,由 L1 Agent 实现,可以在安全组之前控制外部过来的流量,但是对于同一个 subnet 内的流量不作限制。
      也就是说:FWaaS 保护的是 subnet

      所以,可以同时部署 FWaaS 和安全组实现双重防护。

 

   添加无rule的firewall    参考:https://www.cnblogs.com/CloudMan6/p/6106441.html

   在防火墙中添加一条规则  参考:https://www.cnblogs.com/CloudMan6/p/6112171.html

下面将 FWaaS 和安全组做个比较。

相同点: 1. 底层都是通过 iptables 实现。

不同点:

   1. FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络;
安全组则应用在虚拟网卡上,保护单个 instance。

  2. FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。

  1. 目前 FWaaS 规则不能区分进出流量,对双向流量都起作用;
安全组规则可以区分 ingress 和 egress。

  1.89 Load Balance as a Service(LBaaS)负载均衡器    参考:https://www.cnblogs.com/CloudMan6/p/6121851.html

    配置        参考:https://www.cnblogs.com/CloudMan6/p/6112578.html

    创建 Pool & VIP   参考:https://www.cnblogs.com/CloudMan6/p/6119211.html

    添加 Pool Member  参考:https://www.cnblogs.com/CloudMan6/p/6141656.html

      创建 Monitor 并测试  参考:https://www.cnblogs.com/CloudMan6/p/6160225.html

    LBaaS 实现机制    参考:https://www.cnblogs.com/CloudMan6/p/6171191.html

    通过 floating IP 访问 VIP  参考:https://www.cnblogs.com/CloudMan6/p/6184912.html

   

2 openvswitch

  2.1 启用 Open vSwitch  参考:https://www.cnblogs.com/CloudMan6/p/6195449.html

  2.2 初始网络状态        参考:https://www.cnblogs.com/CloudMan6/p/6204547.html

  2.3 OVS   Local Network 

  创建 OVS Local Network  参考:https://www.cnblogs.com/CloudMan6/p/6212736.html

  将 instance 部署到 OVS Local Network 参考:https://www.cnblogs.com/CloudMan6/p/6220469.html

    为什么 tapfc1c6ebb-71 不能像左边的 DHCP 设备 tap7970bdcd-f2 那样直接连接到 br-int 呢?
    其原因是: Open vSwitch 目前还不支持将 iptables 规则放在与它直接相连的 tap 设备上。

    

  再部署一个 instance 和 Local Network 参考:https://www.cnblogs.com/CloudMan6/p/6227449.html

  OVS local network 连通性分析 参考:https://www.cnblogs.com/CloudMan6/p/6234812.html

    同一个local network下的vm1和vm2可以互通;

    不同local network下,vm1和vm2不能互通,因为Open vSwitch 的每个网桥都可以看作一个真正的交换机,可以支持 VLAN,这里的 tag 就是 VLAN ID

    

  2.4 OVS  flat network

   在 ML2 中配置 OVS flat network 参考:https://www.cnblogs.com/CloudMan6/p/6245478.html

    配置完后,如下图

    

    来 veth pair 和 patch port 都可以连接网桥,使用的时候如何选择呢?

      1. 连接两个 ovs bridge,优先使用 patch port。技术上veth pair 也能实现,但性能不如 patch port。

       2. 连接 ovs bridge 和 linux bridge,只能使用 veth pair。

      3. 连接两个 linux bridge,只能使用 veth pair。

   创建 OVS flat network  参考:https://www.cnblogs.com/CloudMan6/p/6254072.html 

    勾选dhcp,会创建dhcp

   部署 instance 到 OVS flat network  参考:https://www.cnblogs.com/CloudMan6/p/6261959.html

    vm1和vm2可以互通

    

  2.5 OVS  vlan network

   在 ML2 中配置 OVS vlan network 参考:https://www.cnblogs.com/CloudMan6/p/6269931.html

    需要提前通过 ovs-ovctl 命令:

    1、创建 br-eth1。

    2、将物理网卡 eth1 桥接在 br-eth1 上。

      

  创建 OVS vlan100 netwrok    参考:https://www.cnblogs.com/CloudMan6/p/6277889.html

  部署 instance 到 OVS vlan100   参考:https://www.cnblogs.com/CloudMan6/p/6287658.html

    同一个vlan100下可以互通

    

  创建 OVS vlan101 并部署 instance  参考:https://www.cnblogs.com/CloudMan6/p/6292809.html

    cirros-vm3 被 schedule 到计算节点

    cirros-vm1 与 cirros-vm2 都在 vlan100,它们之间能通信。 
    cirros-vm3 在 vlan101,不能与 cirros-vm1 和 cirros-vm2 通信。 

     

  分析 OVS 如何实现 vlan 隔离    参考:https://www.cnblogs.com/CloudMan6/p/6308552.html

     Open vSwitch 通过 flow rule(流规则)来指定如何对进出 br-int 的数据进行转发,进而实现 vlan 之间的隔离

    flow rule:

    

    in_port
      inbound 端口编号,每个 port 在 Open vSwitch 中会有一个内部的编号。
      可以通过命令 ovs-ofctl show <bridge> 查看 port 编号

        

    dl_vlan
      数据包原始的 VLAN ID。

    actions
      对数据包进行的操作。

    简单的说,数据包在物理网络中通过 VLAN 100 和 VLAN 101 隔离,在计算节点 OVS br-int 中则是通过内部 VLAN 1 和 VLAN 5 隔离。

  2.6 OVS  router 

  用虚拟 router 连通 subnet 参考https://www.cnblogs.com/CloudMan6/p/6337076.html

  Neutron Router 工作原理 参考:https://www.cnblogs.com/CloudMan6/p/6347172.html

    创建的router如下:实现两个不同vlan互通

    

  访问 Neutron 外部网络 参考:https://www.cnblogs.com/CloudMan6/p/6351625.html

    外部网络是已经存在的物理网络,一般都是 flat 或者 vlan 类型

    这里我们将外部网络的 label 命名为 “external”,网桥为 br-ex。

    如果类型为 flat,控制节点 /etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:

      

    如果类型为 vlan,配置如下:

      

    在我们的网络环境中,外部网络是 flat 类型。 修改配置后,需要重启 neutron 的相关服务。另外,我们需要提前准备好 br-ex,将 eth2 添加到 br-ex。

      

  创建 OVS 外部网络 ext_net 参考:https://www.cnblogs.com/CloudMan6/p/6357311.html

  将 ext_net 连接到 router 参考:https://www.cnblogs.com/CloudMan6/p/6358617.html

    router interface 的命名规则如下: 
      1. 如果 interface 用于连接租户网络,命名格式为 qr-xxx。 
      2. 如果 interface 用于连接外部网络,命名格式为 qg-xxx。

    如下图,实现route_100_101连接qg-cf54d3ea-6a

     

  floating IP  

    通过 SNAT 使得 instance 能够直接访问外网,但外网还不能直接访问 instance。

    直接访问 instance 指的是通信连接由外网发起,例如从外网 SSH instance。

    如果需要从外网直接访问 instance,可以利用 floating IP。

    Open vSwitch driver 环境中 floating IP 的实现与 Linux Bridge driver 完全一样:

    都是通过在 router 提供网关的外网 interface 上配置 iptables NAT 规则实现

 

  2.7 OVS  VxLAN network

  ML2 配置 OVS VxLAN 参考:https://www.cnblogs.com/CloudMan6/p/6360862.html

   创建 vxlan 并部署 instance  参考https://www.cnblogs.com/CloudMan6/p/6366459.html

   OVS vxlan 底层结构分析 参考:https://www.cnblogs.com/CloudMan6/p/6376523.html

    

    需要特别注意的是:无论存在多少个 VXLAN,devstack-controller 与 devstack-compute1 之间所有的数据都只通过 “vxlan-a642100b” 这对 port 上建立的隧道传输。

   OVS VxLAN Flow 分析  参考https://www.cnblogs.com/CloudMan6/p/6380708.html

 

转载于:https://www.cnblogs.com/kevincaptain/p/10476350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值