OpenStack 預設通過 l3-agent 建立和管理 neutron-ns-metadata-proxy,進而與 nova-metadata-api 通信。但不是所有環境都有 l3-agent,比如直接用實體 router 的場景。這時就需要走另一條路:讓 dhcp-agent 來建立和管理 neutron-ns-metadata-proxy。
打開 /etc/neutron/dhcp_agent.ini,設定 <code>force_metadata</code>
重新開機 dhcp-agent 後,可以看到控制節點上多了一個 neutron-ns-metadata-proxy 程序。
此程序通過 <code>--network_id</code> 關聯到 <code>test_net</code>,這就是 dhcp-agent 啟動的 neutron-ns-metadata-proxy,用于接收 <code>test_net</code> 網絡上 instance 的 metadata 請求。每一個 network 都有一個與之對應的 neutron-ns-metadata-proxy。
重新開機 instance <code>c1</code>,檢視路由表。
請注意,現在通路 <code>169.254.169.254</code> 的路由已由之前的 <code>17.17.17.1</code>變為 <code>17.17.17.2</code>。這裡的 <code>17.17.17.2</code> 是 dhcp-agent 在<code>test_net</code> 上的 IP。這條路由是由 dhcp-agent 添加進去的。正是因為這條路由的存在,即便 l3-agent 與 dhcp-agent 同時提供 neutron-ns-metadata-proxy 服務,metadata 請求也隻會發送給 dhcp-agent。
後面的資料流向就與 l3-agent 的場景一樣了:neutron-ns-metadata-proxy 将請求通過 unix domain socket 發給 neutron-metadata-agent,後者再通過管理網絡發給 nova-api-metadata。
到這裡,我們已經分别讨論了通過 l3-agent 和 dhcp-agent 通路 metadata 的實作方法。對于 <code>169.254.169.254</code>:
l3-agent 用 iptables 規則來轉發。
dhcp-agent 則是将此 IP 配置到自己的 interface 上。
不知道大家有沒有這樣一個疑問:
nova-api-metadata 是怎麼知道應該傳回哪個 instance 的 metadata?<code>c1</code> 隻是向 <code>169.254.169.254</code> 發送了一個 http 請求,nova-api-metadata 怎麼就知道應該傳回 <code>c1</code> 的 metadata 呢?
下節咱們詳細分析這個問題。
本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1910575