什麼是openstack的metadata

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

具體可以參見openstack的相關api和以下的藍圖:

https://blueprints.launchpad.net/nova/+spec/openstack-api-metadata

比如你想給instance設置某個屬性,比如主機名。metadata的一個重要應用,是設置每個instance的ssh公鑰。公鑰的設置有兩種方式:

1、創建instance時注入文件鏡像

2、啓動instance後,通過metadata獲取,然後用腳本寫入

第二種方式更加靈活,可以給非root用戶注入公鑰。以下是獲取ssh key的代碼片段:

# Fetch public key using HTTP
ATTEMPTS=10
while [ ! -f /root/.ssh/authorized_keys ]; do
    curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/aws-key 2>/dev/null
    if [ \$? -eq 0 ]; then
        cat /tmp/aws-key >> /root/.ssh/authorized_keys
        chmod 0600 /root/.ssh/authorized_keys
        restorecon /root/.ssh/authorized_keys
        rm -f /tmp/aws-key
        echo "Successfully retrieved AWS public key from instance metadata"
    else
        FAILED=\$((\$FAILED + 1))
        if [ \$FAILED -ge \$ATTEMPTS ]; then
            echo "Failed to retrieve AWS public key after \$FAILED attempts, quitting"
            break
        fi
        echo "Could not retrieve AWS public key (attempt #\$FAILED/\$ATTEMPTS), retrying in 5 seconds..."
        sleep 5
    fi
done

可以看到,獲取metadata的api接口是:

http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key

可是,這個IP地址,在我們 openstack 是不存在的。爲什麼可以獲取到metadata呢?

這是由於Amazon的原因,最早metadata是亞馬遜提出來的,參見:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

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

iptables -A nova-network-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.4:8775

使用metadata會帶來便利,但是經常碰到的一個問題是,metadata獲取不成功,導致instance啓動很慢,並且獲取失敗會導致ssh key等功能設置失效,剛纔獲取ssh的代碼片段中,就是嘗試10次。需要注意的是:

1、在 network 上,正確設置相關參數,在 /etc/nova/nova.conf 裏配置:

metadata_host=10.100.21.25

這裏的 10.100.21.25 是api所在的內網地址

2、network上,要能夠連接這個api地址 10.100.21.25

3、由於 api 判斷instance是通過fix ip 來判斷的,所以instance的fix ip地址段,一定要能夠正確連接 api 所在 ip, 並且沒有經過 nat 地址轉換。否則不能正確獲取instance的metadata。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章