Why Namespace?
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由。
今天探讨为什么要用 namespace 封装 router?
回顾一下前面的网络逻辑结构图:
我们需要讨论一个深层次的问题:
为什么不直接在 tape17162c5-00 和 tapd568ba1a-74 上配置 Gateway IP,而是引入一个 namespace,在 namespace 里面配置 Gateway IP 呢?
首先考虑另外一个问题:
如果不用 namespace,直接 Gareway IP 配置到 tape17162c5-00 和 tapd568ba1a-74 上,能不能连通 subnet_172_16_100_0 和 subnet_172_16_101_0 呢?
答案是可以的,只要控制节点上配置了类似下面的路由。
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.100.0 * 255.255.255.0 U 0 0 0 tapd568ba1a-74
172.16.101.0 * 255.255.255.0 U 0 0 0 tape17162c5-00
既然不需要 namespace 也可以路由,为什么还要加一层 namespace 增加复杂性呢?
其根本原因是:为了支持网络重叠。
云环境下,租户可以按照自己的规划创建网络,不同租户的网络是可能重叠的。
将路由功能放到 namespace 中,就能隔离不同租户的网络,从而支持网络重叠。
下面通过例子进一步解释。
Tenant A vlan100 subnet A-1: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.254"}
Tenant A vlan101 subnet A-2: 10.10.2.0/24 {"start": "10.10.2.1", "end": "10.10.2.254"}Tenant B vlan102 subnet B-1: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.254"}
Tenant B vlan103 subnet B-2: 10.10.2.0/24 {"start": "10.10.2.1", "end": "10.10.2.254"}
A,B 两个租户定义了完全相同的两个 subnet,网络完全重叠。
不使用 namespace 的场景
如果不使用 namespace,网络结构如下:
其特征是网关 IP 配置在 TAP interface 上。
因为没有 namespace 隔离,router_100_101 和 router_102_103 的路由条目都只能记录到控制节点操作系统(root namespace)的路由表中,内容如下:
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.1.0 * 255.255.255.0 U 0 0 0 tap1
10.10.2.0 * 255.255.255.0 U 0 0 0 tap2
10.10.1.0 * 255.255.255.0 U 0 0 0 tap3
10.10.2.0 * 255.255.255.0 U 0 0 0 tap4
这样的路由表是无法工作的。
按照路由表优先匹配原则,Tenant B 的数据包总是错误地被 Tenant A 的 router 路由。
例如 vlan102 上有数据包要发到 vlan103。
选择路由时,会匹配路由表的第二个条目,结果数据被错误地发到了 vlan101。
使用 namespace 的场景
如果使用 namespace,网络结构如下:
其特征是网关 IP 配置在 namespace 中的 veth interface 上。
每个 namespace 拥有自己的路由表。
router_100_101 的路由表内容如下:
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.1.0 * 255.255.255.0 U 0 0 0 qr-1
10.10.2.0 * 255.255.255.0 U 0 0 0 qr-2
router_102_103 的路由表内容如下:
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.1.0 * 255.255.255.0 U 0 0 0 qr-3
10.10.2.0 * 255.255.255.0 U 0 0 0 qr-4
这样的路由表是可以工作的。
例如 vlan102 上有数据包要发到 vlan103。
选择路由时,会查看 router_102_103 的路由表, 匹配第二个条目,数据通过 qr-4 被正确地发送到 vlan103。
同样当 vlan100 上有数据包要发到 vlan101时,会匹配 router_100_101 路由表的第二个条目,数据通过 qr-2 被正确地发送到 vlan101。
可见,namespace 使得每个 router 有自己的路由表,而且不会与其他 router 冲突,所以能很好地支持网络重叠。
好了,目前我们已经搞清楚了 Neutron 内部 subnet 之间是如何通信的了。
下一节我们将学习 OpenStack 内部网络如何与外部网络通信。
Why Namespace?的更多相关文章
- 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- C++ namespace
namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...
- C++ 之namespace常见用法
一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...
- using namespace std 和 using std::cin
相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...
- Why Namespace? - 每天5分钟玩转 OpenStack(102)
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...
- struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path
1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...
- PHP 命名空间(namespace)
PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...
- AMD and CMD are dead之Why Namespace?
缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
- C、C++: 引用、指针、实例、内存模型、namespace
// HelloWorld.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...
随机推荐
- 读取properties的简单方法,使用@Configuration
配置类代码如下 import org.springframework.beans.factory.annotation.Value; import org.springframework.contex ...
- shell脚本中case的用法
shell脚本中case选择语句可以结合read指令实现比较好的交互应答操作,case接收到read指令传入的一个或多个参数,然后case根据参数做选择操作. case的语法如下 case $char ...
- 认识/etc/passwd和/etc/shadow
认识/etc/passwd和/etc/shadow============================== /etc/passwd [root@aminglinux ~]# head -n1 /e ...
- 10分钟了解 react 引入的 Hooks
"大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...
- ATM-conf-settings
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__))BASE_DB = os.path.join(BASE_DIR, 'db' ...
- Essential C++ 3.1 节的代码练习——指针方式
// // PointerToValue.cpp // Working // // Created by Hawkins, Dakota Y on 6/3/16. // Copyright 2016 ...
- 江西理工大学编程俱乐部 2328 Star
: Star 时间限制: C/C++ s Java/Python s 内存限制: MB 答案正确: 提交: 题目描述 31世纪,人类世界的科技已经发展到了空前的高度,星际移民,星际旅游早已经不再是问题 ...
- SQLite学习和使用
创建数据库并创建表格 1.创建MyDatabaseHelper继承于SQLiteOpenHelper(抽象类,必须实现onCreate()和onUpgrade()方法)2.把数据库建表指令弄成一个字符 ...
- 利用本地SQL Server维护计划来维护SQL Database
On-Premise的SQL Server提供了维护计划来定期.定时的维护SQL Server.一般的做法是:定义SQL Server Agent Jobs,而后维护计划帮助我们定期.定时执行SQL ...
- TCP的运输连接管理
TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1. ...