• Openstack组件实现原理 — OpenVswitch/Gre/vlan


    目录

    前文提要

    Openstack组件部署 — Overview和前期环境准备
    Openstack组建部署 — Environment of Controller Node
    Openstack组件部署 — Keystone功能介绍与认证实现流程
    Openstack组件部署 — Keystone Install & Create service entity and API endpoints
    Openstack组件部署 — keystone(domain, projects, users, and roles)
    Openstack组件实现原理 — Keystone认证功能
    Openstack组建部署 — Glance Install
    Openstack组件实现原理 — Glance架构(V1/V2)
    Openstack组件部署 — Nova overview
    Openstack组件部署 — Nova_安装和配置Controller Node
    Openstack组件部署 — Nova_Install and configure a compute node
    Openstack组件实现原理 — Nova 体系结构
    Openstack组件部署 — Netwotking service组件介绍与网络基本概念
    Openstack组件部署 — Networking service_安装并配置Controller Node
    Openstack组件部署 — Networking service_Compute Node

    Neutron 管理的网络相关实体

    • network 网络:为每个用户提供独立的网络环境,用户可以定义多个 network,彼此之间都独立隔离。network 可以拥有无数个动态可创建和销毁的 ports。而这些端点都会连接到 network 中的 subnets。network 是最基础的实体,subnets 和 ports 都需要关联到 network 上才能生效。每个 network 相当于一个虚拟交换机,同一个 subnet 上的 Instance 可以通过这个 “交换机” 来通信。

    • subnet 子网:不同的 subnet 拥有不同的网段,其中的每一个 Instances 都有一个 IP,不同 subnet 的 Instance 在 L3 域上彼此不可见,因为路由会阻断广播。所以不同的 subnet 之间的 Instances 需要三层网络设备(网关、DNS、路由)来支持通信。每个 subnet 都必须有一个 CIDR 和关联到一个 network。Instance 的 IP 可以从 CIDR 或者用户指定的地址池中选取。

    • port 端口:可以进出流量的接口,往往绑定上若干的 MAC 地址和 IP 地址,来进行寻址。一般为虚拟交换机上的虚拟接口。 Instance 将虚拟网卡挂载到 port 上,通过 port 来访问 network 。当 port 有 IP 时,说明它属于某个 subnet 。

    OpenVswitch(OVS)

    OpenVswitch 虚拟交换机,网络2层(L2)设备,可以创建多个 vSwitch 分配给不同的 network,使 network 中同一个 subnet 的 Instance 能够通信。在同一个 sunbet 中的两个 Instance 之间通信的过程:
    Instacne_A
    ⇒ vNIC(port)
    ⇒ Virtual Switch
    ⇒ Physical Switch
    ⇒ Virtual Switch
    ⇒ vNIC
    ⇒ Instance_B

    这里写图片描述

    Virtual Switch 作为 Physical Switch 和 Instance 之间的桥梁。

    OVS 的架构

    这里写图片描述

    • ovsdb-sever:OVS 的数据库服务器,用来存储虚拟交换机的配置信息。它使用 OVSDB(JSON-RPC) 的方式来与 manager 和 ovs-vswitchd 交换信息。

    • ovs-vswitchd:OVS 的核心部件,它和上层 Controller 通信遵从 OPENFLOW 协议,它与 ovsdb-server 通信使用 OVSDB 协议,它和 ovs kernel module 通过 netlink 通信,它支持多个独立的 datapath(网桥),它通过更改 flow table 实现了绑定,和 VLAN 等功能。

    • ovs kernel module:OVS 的内核模块,处理包交换隧道,缓存 flow,如果在内核的缓存中找到了转发规则,则转发,否则发向用户空间去处理。

    VLan

    VLan 虚拟局域网,在 L2 上应用。对网包打上 tag 标签。拥有同一个 tag 标签的网包就属于同一个 VLan,VLan 能够将存在于同一个 subnet 的 Instance 隔离成若干个 subnet 。

    GRE 隧道

    如果希望运行在 Compute Node 上的 Instance 能够通过 Neutron Node 去访问 Pubilc Network,这就表示同一个数据包需要在不同的协议之间(L2的数据帧和L3的报文包之间)被传输,这样的话就需要使用隧道技术来实现这个需求。使用隧道传递的数据可以是不同协议的数据帧或包,隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。

    Compute Node 中的 Instance 通过 GRE 访问 Public Network

    涉及的 Linux 网络技术

    • bridge(网桥):Linux 中用于表示一个能连接不同网络设备的虚拟设备,Linux 中传统实现的网桥类似于一个 Hub 设备,而 OVS 管理的网桥一般类似交换机。
    • br-int(bridge-integration):综合网桥,常用于表示实现主要内部网络功能的网桥。
    • br-ex(brifge-external):外部网桥,负责跟外部网络通信的网桥。
    • GRE(General Routing Encapsulation):一种通过封装来实现隧道的方式,在 Openstack 中一般是基于 L3 的 GRE。
    • VETH(虚拟 Ethernet接口):通常以 Pair 对的方式出现,一端发出网包,会被对应的另一端接收,可以形成两个网桥之前的通道。
    • qvb(虚拟接口):neutron veth,Linux Bridge-side
    • qvo(虚拟接口):OVS-Side
    • TAP设备:模拟一个 L2 的网络设备,用于接收和发送 L2 网包。
    • TUN设备:模拟一个 L3 的网络设备,可以接受和发送 L3 网包。
    • iptables:Linux 安全策略防火墙。
    • Vlan:虚拟 Lan,同一个物理 Lan 下用标签来实现隔离,可用标号为1-4094.
    • VXLAN:一套利用 UDP 协议作为底层传输协议的 Overlay 实现。被认为是 VLan 技术的延伸和替代者。
    • namespace:命名空间,是一套用于资料隔离的机制,不同 namespace 中的资源之间彼此不可见。
    • qbr(Linux 传统网桥):为了让 Instance 能够连接到 br-int (综合网桥上)。因为 br-int 只能对 L3 做防火墙限制,不能针对一个 Instance 做防火墙设置。所以需要 qbr 来完成对一个 Instance 做安全策略。

    这里写图片描述

    • [A, B] (VM1 ⇒ qbr-1 ) : 被应用在 L2 中,将 VM1 的网包传输到 qbr-1 ,为什么不直接传输到 br-int 呢?因为这之中会涉及到一个 SecurityGroup 的问题。 br-int 综合网桥只能对 L3 层做安全策略,即只能对同一个 subnet 内所有的 Instance 做一个统一的安全策略。这样的话就无法防止同一个 subnet 内的 Instance 去攻击另外一个 Instance 。所以还需要针对单个 Instance 做安全策略,来防止同网段中的 Instance 攻击,而这个针对单个 Instance 的安全策略由 qbr-1(传统 Linux 网桥)来提供。

    • [C,D] (qbr-1 ⇒ br-int) : qvb 和 qvo 分别作为 Bridge-side 和 OVS-side 的虚拟接口。如果 qbr-1 要跟 br-int 传输数据,就需要将这两个虚拟接口对接。在 br-int 中会对整个 Subnet 中的 Instance 做统一的安全策略。而且 br-int 还能提供 VLan 的功能,br-int 对同一个 subnet 上传输来的网包打上相同的 tag 标记,就是说拥有不同的 tag 的响应数据包会被转发到不同的 VLan 。 br-int 提供的 VLan 功能,将不同的 subnet 隔开,实现了 L3 的隔离(L3 的广播阻断)。br-int 和 qbr-1 完成了 OVS 的功能。

    • [E,F] ( br-int ⇒ br-tun) : 将网包传输给 br-tun 之后会为每个网包做流表限制,保证了网包响应时,能够根据流表找到对应的 VLan ,而不会胡乱的将响应网包分发给错误的 VLan 中。

    • [G,H] (br-tun ⇒ br-tun) : 直连的GRE隧道传输,即跨协议传输,拥有相同流表的网包会在同一个隧道中被传输,可以同时拥有多条隔离的隧道。

    • [I,J] (br-tun ⇒ br-int) : 与 [E,F] 类似,主要完成将隧道号(流表号)和 VLan 号对应转换,保证数据的完整传输和独立性。

    • [O,P] (br-int ⇒ DHCP):在创建 Instacne 的过程中,会向 DHCP 申请分配 IP。

    • [M,N] ( br-int ⇒ Route):将内网 Instance 网包的 IP 转换为 Public Network IP

    • [K,L] (Route ⇒ br-ex) : 最后再通过 br-ex 将网包转发到物理网卡。

    相关阅读:

  • 相关阅读:
    django学习笔记(一)
    Python之函数进阶
    Python之函数初识
    Python之文件操作
    基础补充
    字典
    神奇的列表
    万能的字符串
    Python基础(二)
    使用paramiko进行ssh连接
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13310762.html
Copyright © 2020-2023  润新知