本文以DHCP為例,介紹了network namespace的基本原理,以及他在OpenStack中的應用。基本概念
1: Linux系統的全局資源
user:用戶ID和組ID
uts:主機名和域名
pid:進程ID
mount:文件系統掛載點
network:網路資源
ipc:進程間通信
2:Linux Namespace
Linux Namespaces提供了一種隔離系統全局資源的方法, 通過這個方法,每個namespace都了有一份獨立的資源。這樣,不同的進程在各自的namespace里對同一種資源的訪問不會發生沖突。

每個Namespace看上去就像一個單獨的Linux系統,從而實現了系統的隔離(Isolating Your System with Linux Namespaces)。與hypervisor比較,這是一個輕量級的系統虛擬化解決方案。被OpenStack廣泛使用,并且是docker的核心技術之一。

3:Linux Network Namespace
Network namespace主要實現了網絡資源的隔離,網絡資源包括網絡設備、IPv4和IPv6協議棧、IP路由表、防火墻、socket等。給一個或多個進程私有的網絡資源。在OpenStack里,用來實現L3層網路的虛擬化。4:DHCP在Openstack中的實現
DHCP的基本功能就是給客戶端動態提供IP,具體原理不在這里描述,下面只是簡單地介紹一下DHCP在OpenStack里的如何工作的。(1):neutron-dhcp-agent 用參數"--dhcp-hostsfile=filename" 啟動dnsmasq服務。當新的port被創建或者舊的port被刪除時,OpenStack以dnsmasq-format的格式更新hostsfile文件。如下例所示:
fa:17:4e:86:18:a6,,192.168.10.10,192800
fa:17:4e:78:18:9b,,192.168.10.20,192800(2):當OpenStack從hostsfile增加或者刪除一條記錄時,他給dnsmasq服務發送一個HUP信號,dnsmasq會重新讀取配置文件和hostsfile。當VM發出DHCP-Discover后,dnsmasq分配IP地址給VM。管理Network Namespace
新建network namespace

經過上面幾步,創建出如下的網絡拓撲圖:

創建veth pair
創建一個veth pair, 一端接在在新建的namespace中, 通常命名為eth0,一端接在Open vSwitch, 通常命名為veth。通過Open vSwitch進行路由轉發, 達到兩個namespace通信的目的。



對green namespace做同樣的操作,把他和openvswitch也連起來。


配置IP地址
給eth-r和eth-g配置IP地址后,兩個namespace就可以互相交流了。



DHCP在Openstack中的實現
虛擬機,DHCP服務和Linux bridge在OpenStack中的邏輯結構圖如下圖所示。本文以linux bridge為例來解釋說明。

虛擬機和dhcp namespace都連在linux bridge上,dnsmasq服務在dhcp namespace的veth pair端口監聽虛擬機dhcp的請求。具體實現步驟如下:新建一個namespace:dhcp-r
新建一個veth-pair(tab-1,ns-1)
把dhcp的Ip地址配置在ns-1端口上
起dnsmasq服務,讓他監聽在ns-1上


