上一節咱們討論了 Neutron 將虛擬 router 放置到 namespace 中實現了不一樣 subnet 之間的路由。
今天探討爲何要用 namespace 封裝 router?
web
回顧一下前面的網絡邏輯結構圖:網絡
咱們須要討論一個深層次的問題: 爲何不直接在 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 呢? spa
答案是能夠的,只要控制節點上配置了相似下面的路由。 操作系統
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-00orm
既然不須要 namespace 也能夠路由,爲何還要加一層 namespace 增長複雜性呢? 其根本緣由是:爲了支持網絡重疊。 router
雲環境下,租戶能夠按照本身的規劃建立網絡,不一樣租戶的網絡是可能重疊的。 將路由功能放到 namespace 中,就能隔離不一樣租戶的網絡,從而支持網絡重疊。 路由
下面經過例子進一步解釋。 it
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"}io
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,網絡結構以下:
其特徵是網關 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,網絡結構以下:
其特徵是網關 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 內部網絡如何與外部網絡通訊。