咱們將經過實驗詳細分析 instance 從 nova-api-metadata 獲取信息的完整過程。web
1. 一個 all-in-one 環境(多節點相似)。
api
2. 已建立 neutron 網絡 test_net,DHCP 已啓動。在這個 metadata 實驗中, test_net 的 type 不重要,flat、vlan、vxlan 均可以。
服務器
3. 暫無 neutron router。 網絡
準備就緒,開始實驗。 架構
上面的 log 中咱們看到兩個信息: spa
① instance 從 DHCP 拿到了 IP 17.17.17.5,這個好理解,由於咱們在test_net 上開啓的 DHCP 服務。 設計
② instance 會去訪問 http://169.254.169.254/2009-04-04/instance-id,嘗試了 20 次都失敗了。 3d
169.254.169.254 是個什麼地址? 日誌
這是 metadata service 的 IP。 orm
這個地址來源於 AWS,當年亞馬遜在設計公有云的時候,爲了讓 instance 可以訪問 metadata,就將 169.254.169.254 這個特殊的 IP 做爲 metadata 服務器的地址,instance 啓動時就會向 169.254.169.254 請求 metadata。OpenStack 以後也沿用了這個設計。
咱們如今遇到的問題是 169.254.169.254 無法訪問啊!cirros 的 cloud-init 顯然是沒有拿到 metadata 的,這點至少能夠從 instance 的 hostname 沒有被設置爲 c1 判斷出來。
前面咱們在 Metadata Service 架構部分介紹了,instance 首先會將 metadata 請求發送給 DHCP agent 或者 L3_agent 管理的 neutron-ns-metadata-proxy。那目前究竟是誰在管理 neutron-ns-metadata-proxy 呢?咱們先在控制節點上查看一下 neutron-ns-metadata-proxy 的進程。
盡然沒有 neutron-ns-metadata-proxy 在運行!
其緣由是:默認配置下,neutron-ns-metadata-proxy 是由 L3_agent 管理的(後面會討論讓 DHCP 來管理),因爲當前 test_net 並無掛在 neutron router 上,因此沒有啓動 neutron-ns-metadata-proxy。
如今控制節點上已經可以看到 test_router 管理的 neutron-ns-metadata-proxy 了。
重啓 instance c1,看會發生怎樣的變化。
instance 成功訪問到 169.254.169.254。從結果看,cloud-init 已經獲取到 metadata,由於 hostname 已經設置爲 c1。
下一節咱們詳細分析 c1 是如何拿到 metadata 的。