Neutron 通過 dnsmasq 提供 DHCP 服務,而 dnsmasq 如何獨立的為每個 network 服務呢?
答案是通過 Linux Network Namespace 隔離,本節将詳細讨論。
在二層網絡上,VLAN 可以将一個實體交換機分割成幾個獨立的虛拟交換機。 類似地,在三層網絡上,Linux network namespace 可以将一個實體三層網絡分割成幾個獨立的虛拟三層網絡。
每個 namespace 都有自己獨立的網絡棧,包括 route table,firewall rule,network interface device 等。
Neutron 通過 namespace 為每個 network 提供獨立的 DHCP 和路由服務,進而允許租戶建立重疊的網絡。
如果沒有 namespace,網絡就不能重疊,這樣就失去了很多靈活性。
每個 dnsmasq 程序都位于獨立的 namespace, 命名為
qdhcp-<network id>,例如 flat_net,我們有:
ip netns list 指令列出所有的 namespace。
qdhcp-f153b42f-c3a1-4b6c-8865-c09b5b2aa274 就是 flat_net 的 namespace。
其實,主控端本身也有一個 namespace,叫 root namespace,擁有所有實體和虛拟 interface device。
實體 interface 隻能位于 root namespace。
新建立的 namespace 預設隻有一個 loopback device。
管理者可以将虛拟 interface,例如 bridge,tap 等裝置添加到某個 namespace。
對于 flat_net 的 DHCP 裝置 tap19a0ed3d-fe,需要将其放到 namespace qdhcp-f153b42f-c3a1-4b6c-8865-c09b5b2aa274 中,但這樣會帶來一個問題:
tap19a0ed3d-fe 将無法直接與 root namespace 中的 bridge 裝置 brqf153b42f-c3 連接配接。
Neutron 使用 veth pair 解決了這個問題。
veth pair 是一種成對出現的特殊網絡裝置,它們象一根虛拟的網線,可用于連接配接兩個 namespace。向 veth pair 一端輸入資料,在另一端就能讀到此資料。
tap19a0ed3d-fe 與 ns-19a0ed3d-fe 就是一對 veth pair,它們将 qdhcp-f153b42f-c3a1-4b6c-8865-c09b5b2aa274 連接配接到 brqf153b42f-c3。如下圖所示:
可以通過 ip netns exec <network namespace name> <command> 管理 namespace。
例如檢視 ns-19a0ed3d-fe 的配置:
了解了 namespace,下一節我們分析 instance 從 dnsmasq 擷取 IP 的詳細過程。
本文轉自CloudMan6 51CTO部落格,原文連結:
http://blog.51cto.com/cloudman/1855662