上一节我们讨论了 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?的更多相关文章

  1. 理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. C++ namespace

    namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...

  3. C++ 之namespace常见用法

    一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...

  4. using namespace std 和 using std::cin

    相较using std::cin使用using namespace std不会使得程序的效率变低,或者稳定性降低,只是这样作会将很多的名字引入程序,使得程序员使用的名字集合变小,容易引起命名冲突. 在 ...

  5. Why Namespace? - 每天5分钟玩转 OpenStack(102)

    上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...

  6. 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 ...

  7. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  8. AMD and CMD are dead之Why Namespace?

    缘由 当我看到_Franky兄的微博的时候: 我觉得我有必要出来详细说说KMDjs到底有什么本质上的优势了,连教主_Franky.貘吃馍香都不能理解他的好处,那么可想而知,在前端圈.或是全端圈.或是I ...

  9. 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法

    这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...

  10. C、C++: 引用、指针、实例、内存模型、namespace

    // HelloWorld.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...

随机推荐

  1. Vue入门之v-if的使用

    在vue中一些常用的指令都是v-这样的,v-if是vue的一个内部指令,常用于html中 代码 <!DOCTYPE html> html lang="en"> & ...

  2. 算法图解之大O表示法

    什么是大O表示法 大O表示法可以告诉我们算法的快慢. 大O比较的是操作数,它指出了算法运行时间的增速. O(n) 括号里的是操作数. 举例 画一个16个格子的网格,下面分别列举几种不同的画法,并用大O ...

  3. C++构造函数实例——拷贝构造,赋值

    #define _CRT_SECURE_NO_WARNINGS //windows系统 #include <iostream> #include <cstdlib> #incl ...

  4. 字符编码笔记:ASCII、Unicode和UTF-8

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte). ...

  5. 命令执行sql

    从外网把数据库用导出脚本的方式导出来了,280M的样子,导是导出来了,但是在本机执行sql脚本的时候,直接就是out of memory,之前执行60M的脚本没出过这问题,直接双击打开.sql脚本文件 ...

  6. unknow table alarmtemp error when drop database (mysql)

    Q: unknow table alarmtemp error when  drop database (mysql) D: alarmtemp is table in rtmd database. ...

  7. Hive官方文档

    Hive官方文档     内容列表 Cloudera制作的Hive介绍视频 安装与配置 系统需求 安装Hive发行版 从Hive源码编译 运行Hive 配置管理概览 运行时配置 Hive, Map-R ...

  8. requireJS入门学习

    前言 最近网上.群里各种随便看,随便学.暑期实习还没找到,昨天开题过了,好好学习吧.最近一直看到前端的ADM,CMD规范,然后网上各种找资料看,看了好几个牛人的博客,写的很好,然后自我感觉了解了点,介 ...

  9. 【Reverse Nodes in k-Group】cpp

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  10. leetcode 【 Sort Colors 】python 实现

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...