OPENSTACK中的METADATA SERVER

OPENSTACK中的METADATA SERVER

虛擬機啓動時候需要注入hostname、password、public-key、network-info之類的信息,以便虛擬機能夠被租戶管理。對於這些信息的注入openstack提供了兩種方式, guestfs-inject以及metadata-server。

guestfs-inject的使用很受限制尤其是並不是所有鏡像都能夠支持這種方式,I版本也以及取消了這種方式; metadata-server使用上更爲靈活,但是他們都依賴鏡像內部必須裝有cloud-init組件,儘管如此,由於aws力挺metadata-server,所以這已經成爲了虛擬機 信息注入方案事實上的標準。

本文主要探討metadata-server在openstack中如何實現。

cloud-init

cloud-init是一個在啓動的時候定製你的Iaas平臺中虛擬機的包,它可以幫助你重新定義你的虛擬機而不需要重新安裝,只需要加入對應的配置項即可。在Ec2中有很多鏡像都安裝了cloud-init來方便用戶定製自己的虛擬機。它可以讓你在虛擬機啓動的時候設置語言環境,設置主機名,甚至生成私鑰,添加用戶自己的ssh公鑰到虛擬機.ssh/authorized_keys, 設置臨時掛載點等等。

cloud-init 項目地址: https://launchpad.net/cloud-init

cloud-init 文檔地址: http://cloudinit.readthedocs.org

metadata元數據服務

metadata字面上是元數據,是一個不容易理解的概念。在除了openstack的其他場合也經常會碰到。openstack裏的metadata,是提供一個機制給用戶,可以設定每一個instance 的參數。

Amazon首先提出了metadata的概念,並搭建了metadata的服務,這個服務的公網IP是169.254.169.254,通常虛擬機通過cloud-init發出的請求是:

http://169.254.169.254/latest/meta-data

後來很多人給亞馬遜定製了一些操作系統的鏡像,比如 ubuntu, fedora, centos 等等,而且將裏面獲取 metadta 的api地址也寫死了。所以opentack爲了兼容,保留了這個地址 169.254.169.254。然後通過iptables nat映射到真實的api上。

metadata在openstack中的BP: https://blueprints.launchpad.net/nova/+spec/openstack-api-metadata

nova中的metadata-server

metadata-server的具體實現是在nova-api組件中,nova.conf中與metadata有關的配置如下:

enabled_apis=ec2,osapi_compute,metadata

# OpenStack metadata service manager
metadata_manager=nova.api.manager.MetadataManager

# IP address for metadata api to listen
metadata_listen=0.0.0.0

# port for metadata api to listen
metadata_listen_port=8775

# Number of workers for metadata service
metadata_workers=<None>

# 和neutron-metadata-agent 通信相關
service_neutron_metadata_proxy=True
neutron_metadata_proxy_shared_secret=

具體的代碼實現在 api/metadata 下:

metadata=metadata {
  __init__.py
  base.py
  handler.py
  password.py
  vendordata_json.py
}

與neutron的結合使用

通常我們使用neutron實現虛擬機的網絡方案,neutron的metadata-agent並不會自己實現metadata服務,而是把cloud-init的請求轉發給nova-api中的metadata服務,具體服務流程請看下圖:


  • 虛擬機通過cloud-init組件請求169.254.169.254這個地址的metadata服務,這時這個請求會有兩種方式處理。

    當虛擬機所在的子網擁有網關而且連接了l3-router,則通過qrouter的namespace中的iptables處理; 當虛擬機所在的子網沒有網關,是個封閉的子網,那麼dhcp服務的虛擬網卡會添加一個169.254.169.254的ip;

  • 接收的cloud-init請求由ns-metadata-proxy處理,ns-metadata-proxy與metadata-agent通過unix domain socket實現IPC,實現將對ns-metadata-proxy的請求交給metadata-agent處理。

  • metadata-agent接收請求,將請求交給metadata-server的真實實現者nova-api。

發佈了91 篇原創文章 · 獲贊 55 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章