用 namspace 隔離 DHCP 服務 - 每天5分鍾玩轉 OpenStack(90)


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 的詳細過程。

 

blob.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM