前面章節我們看到 instance 在啟動過程中能夠從 Neutron 的 DHCP 服務獲得 IP,本節將詳細討論其內部實現機制。
Neutron 提供 DHCP 服務的組件是 DHCP agent。 DHCP agent 在網絡節點運行上,默認通過 dnsmasq 實現 DHCP 功能。
配置 DHCP agent
DHCP agent 的配置文件位於 /etc/neutron/dhcp_agent.ini。
dhcp_driver
使用 dnsmasq 實現 DHCP。
interface_driver
使用 linux bridge 連接 DHCP namespace interface。
當創建 network 並在 subnet 上 enable DHCP 時,網絡節點上的 DHCP agent 會啟動一個 dnsmasq 進程為該 network 提供 DHCP 服務。
dnsmasq 是一個提供 DHCP 和 DNS 服務的開源軟件。 dnsmasq 與 network 是一對一關系,一個 dnsmasq 進程可以為同一 netowrk 中所有 enable 了 DHCP 的 subnet 提供服務。
回到我們的實驗環境,之前創建了 flat_net,並且在 subnet 上啟用了 DHCP,執行 ps 查看 dnsmasq 進程,如下圖所示:
DHCP agent 會為每個 network 創建一個目錄 /opt/stack/data/neutron/dhcp/,用於存放該 network 的 dnsmasq 配置文件。
下面討論 dnsmasq 重要的啟動參數:
--dhcp-hostsfile
存放 DHCP host 信息的文件,這里的 host 在我們這里實際上就是 instance。 dnsmasq 從該文件獲取 host 的 IP 與 MAC 的對應關系。 每個 host 對應一個條目,信息來源於 Neutron 數據庫。
對於 flat_net,hostsfile 是 /opt/stack/data/neutron/dhcp/f153b42f-c3a1-4b6c-8865-c09b5b2aa274/host,記錄了 DHCP,cirros-vm1 和 cirros-vm2 的 interface 信息。
--interface
指定提供 DHCP 服務的 interface。 dnsmasq 會在該 interface 上監聽 instance 的 DHCP 請求。
對於 flat_net,interface 是 ns-19a0ed3d-fe。 或許大家還記得,之前我們看到的 DHCP interface 叫 tap19a0ed3d-fe(如下圖所示),並非 ns-19a0ed3d-fe。
從名稱上看,ns-19a0ed3d-fe 和 tap19a0ed3d-fe 應該存在某種聯系,但那是什么呢?
要回答這個問題,需要先搞懂一個概念:Linux Network Namespace,我們下一節詳細討論。