instance 的網卡是如何被配置並拉起的?這是理解和用好 cloud-init 很是關鍵的一步。咱們先討論一個最簡單基礎的場景:鏡像中沒有安裝 cloud-init。ubuntu
此時 instance 啓動時網卡能不能被拉起來徹底 靠運氣!是的,就是運氣。centos
由於這種狀況下網卡的配置是死的,徹底依賴於鏡像中 /etc/network/interfaces 原有的配置。好比原鏡像中的配置是:
auto eth0
iface eth0 inet dhcp
instance 只有知足下面全部條件網卡才能被拉起來:網絡
正好只有一塊網卡spa
正好網卡就叫 eth0操作系統
正好 subnet 開了 DHCPcode
只要出現下面任意一種狀況就會失敗:ip
還有其餘網卡,好比 eth1,或者部署
網卡不叫 eth0 ,好比 ens3,或者get
沒有 DHCPit
不一樣 instance 的網絡配置差異很大,在 image 中寫死的方法幾乎是無效的,只能依靠 cloud-init 動態寫入,接下來咱們詳細分析 cloud-init 的解決方案。
先考慮 subnet 有 DHCP 服務的狀況。
咱們使用的鏡像是 ubuntu 的 cloud image,已經預裝的 cloud-init,下載地址爲 http://cloud-images.ubuntu.com/ ,國內鏡像http://mirrors.ustc.edu.cn/ubuntu-cloud-images/
部署成功後,登陸 instance,ip a
顯示網卡 ens3
已經正確配置。
下面分析這個 IP 是怎樣配置上去的。
上一節咱們討論到,cloud-init 是在 local 階段完成網絡配置的,cloud-init 的執行過程被詳細記錄在 /var/log/cloud-init.log 中,讓咱們找找相關操做。
這裏能夠看到,cloud-init 會作以下工做:
① 掃描出 instance 中的全部網卡(這裏是 ens3)
② 獲取該網卡的配置信息。 由於沒有 config drive,沒法得知網卡的詳細配置信息,只能採用默認的 fallback 配置,即 dhcp 配置。
③ 將配置信息寫入 /etc/network/interfaces.d/50-cloud-init.cfg,內容爲:
這樣網卡就以 dhcp 模式拉起來,正好與 subnet 的 dhcp 服務對接上,IP、網關等信息就配上去了。
幾點說明:
instance 上的每一塊網卡都會被 cloud-init 掃描出來。
若是沒有 config drive 將採用 fallback 配置,將掃描出來的第一塊 (只有這一塊)網卡配置成 dhcp 模式。請注意:這是 cloud-init 默認行爲,跟這塊網卡對應的 subnet 是否開啓了 DHCP 沒有任何關係。
cloud-init 會根據 instance 操做系統類型生成網卡配置文件。例如操做系統是 centos 的話則會將配置寫到 /etc/sysconfig/network-scripts 目錄下。
如今請你們思考一個問題:若是 subnet 沒有開 DHCP,會是怎樣一個狀況?下節將分析這個問題。