compute-1# cd /usr/lib/python2.7/dist-packages/nova/network compute-1# patch < ~/patch-compute-nopublicip
由於 source routing 是我們新增的部分,因此必須在重新執行 nova-network 時將舊的 設定清掉,可以加入一行指令來完成:
# vim /etc/init/nova-network.conf pre-start script
...
# for PHA patch
ip ru | grep 200 | awk '{print $3 }' | xargs -I@ sudo ip ru del from @ lookup 200 end script
Compute Workers 擴展方法
由於在我們的部署中,運算節點只有與 Ceph 共享儲存空間有相依性,因此在 Ceph 系統建置完成後,我們可以重複 4.2.4小節的方法複製我們的運算節點,以便運行更多 的虛擬機。
4.3 nova.conf
fixed_ip VS. floating_ip
在設定 OpenStack 的虛擬機網路時,時常會看到 fixed_ip、fixed_range 或是 floating 的詞,其實 fixed ip 是指這組 IP 將伴隨著這個虛擬機一生,從虛擬機被建立分配到這 個 IP,一直到虛擬機被終止銷毀,這個 IP 都只屬於這個虛擬機,甚至可以當作某些服 務用來分辨虛擬機的依據 (如 Metadata API),並且被分配到的虛擬機會經由 DHCP 得 知自己被分配到這組虛擬 IP;反之,floating ip 則是一個隨時可以藉著使用者的需求而 分配給不同的虛擬機的 IP,它是藉由動態綁定到虛擬機所屬的宿主機上,然後再利用 iptables 來將封包轉送到被分配到的虛擬機上,虛擬機內部是不需要知道的。
我們的系統將 fixed_range 設定成 10.0.0.0/16,floating 則是使用公開 IP 的網段。
Metadata API
在之前我們有提到要安裝 PHA 模式的運算節點,並提到了在這種模式下,每台 運算節點都要安裝 nova-api-metadata 來提供服務。原因是因為在雲環境下有很多虛 擬機,每一台虛擬機在開機時,都會需要一些基本資料來設定好作業系統,讓雲端 服務使用者可以正常使用虛擬機,如 root 的 ssh 公鑰,主機名等,因此 OpenStack 提 供了一個服務來讓虛擬機裡的作業系統有管道查詢這些資訊,一些常見的 Linux 發
行版如 (Ubuntu, Fedora) 都有提供雲端版本的映像檔,而這些映像檔除了較為瘦身之 外,最重要的就是開機時會向 169.254.169.254 這個 IP 詢問這些基本資料 (metadata)[25]。
所以我們必須在每台運算節點上安裝 nova-api,並在 nova.conf 裡設定 enabled_apis=metadata,
只開啟 metadata api;如果是 Ubuntu 12.04 之後可以直接安裝 nova-api-metadata,也就是 之前安裝流程建議的套件即可,並在 nova.conf 裡指明 metadata_host=$my_ip,如此一來 nova 就會增加一條轉送指令
iptables A novanetworkPREROUTING d 169.254.169.254/32 p tcp m tcp dport 80 j DNAT --to-destination < 你 的 主 機 IP>:8775
讓虛擬機的查詢可以到達 metadata 真正處在的 IP 和連接端口,而 nova-api-metadata 也會依照 request 的來源 IP 判斷,是哪一個虛擬機正在向我詢問資料,進而回 答正確的 metadata。所以一旦你的虛擬機開機時很慢 (time out),並伴隨著使用 ssh key 時無法登入,而且 log 出現以下訊息:
2012-08-23 12:21:21,694 - util.py[WARNING]: 'http://169.254.169.254/2009-04-04/meta-data/
instance-id' failed [119/120s]: url error [timed out]
那就請檢查一下 metadata api 的設定,或是參考下一個子小節的 dmz_cidr。
dmz_cidr & routing_source_ip
DMZ 這 個 詞 在 網 路 架 構 裡 常 出 現, 主 要 就 是 希 望 在 內 部 網 路 (Private Service Network) 與外部網路 (Internet) 之間加入一個子網段當緩衝,避免外面的主機可以直接 對內部重要伺服器進行連線或攻擊,但內部網路還是可以有限的與 DMZ 裡的機器做連 線,有解除武裝區的意思。
那在 OpenStack 裡外部網路依然是指 Internet,而內部網路指的就是虛擬機所使用的 網段 (fixed_range)。此外,我們知道除非我們設定了 auto_assign_floating_ip = true,不然 建立虛擬機時預設只會給 fixed_ip(通常是 private IP),所以外部網路是沒辦法直接訪問 虛擬機的;那內部網路的機器要跟 Internet 連線,主要是透過 routing_source_ip 的設置,
然後 nova-network 就會幫你加入以下規則:
iptables -A nova-network-snat -s <fixed_range> -j SNAT --to-source <routing_source_ip>
讓 iptables 幫你修改虛擬機送出來的封包,把裡面的來源 IP 改成 routing_source_ip,一 般的情形下也就是設定成宿主機的 public IP,做類似 NAT 的動作,讓你的虛擬機可以 正常的對外連線。
但有的時候我們不希望 VM 發出去的封包裡面的來源 IP 被修改,所以這裡的 dmz_cidr 所指定的就是那些你希望虛擬機可以直接使用內部網路 IP 存取的網段。例 如上一個子小節所介紹的 Metadata API 服務,nova-api-metadata(192.168.100.11) 需要
知道來向他訪問的來源端 IP 是甚麼 (10.0.100.2),才能回答相對應的 hostname 和 ssh key 回去。如果此時來源端 IP 被修改成對外的 public ip(floating ip),Metadata API 服 務就不清楚發出查詢需求的虛擬機是哪一台了。這時我們就可以將 dmz_cidr 設為 192.168.100.0/24,確保這個連線不會被 nova-network 所定義的 iptables 規則修改掉來源 IP(SNAT) 了。8 9
VNC
OpenStack Essex 版本後建議改用 novnc 這個套件 [17],因此我們除了安裝相關套件 之外,還必須把 novnc_enabled 設為 true。值得一提的是,novncproxy_base_url 這個值 會被使用在 Dashboard 的 iframe 上,用來指出你的 nova-novncproxy 這隻程式 (剛剛安裝 在 controller 上了) 所在的 IP 跟連接端口 (預設是 6080),因為 Dashboard 的使用者正常 情形下皆來自於 Internet,所以這邊必須使用 controller 的公開 IP,使用者才能正常的與 nova-novncproxy 連線。至於 vncserver_listen 這個參數指定了每一台 compute worker 上 的 vncserver(KVM 內建) 要 listen 的 IP,為了讓 novncproxy 可以存取,而且又因為安全 性問題不想讓整個 Internet 的機器都可以連線,所以我們設定為 listen 在私有 IP 上。
API Listen
我們在 nova.conf 裡 (其實所有 OpenStack 設定檔都是) 都將各種 API(如 ec2_listen, osapi_compute_listen 等) 設定成要 listen 在私有 IP,避免讓服務暴露在 Internet 上,否則 OpenStack 裡預設都是 listen 在 0.0.0.0,可能會有潛在地安全性問題。只是如此一來,
各種指定 API 位址的參數,(如 ec2_host, osapi_host 等),或是 Keystone 的 catalog,甚至 於設定環境變數 (如.novarc, .glancerc 等),都要設定好服務所在的私有 IP,不可以是預 設的 127.0.0.1,否則會無法正常的連線。
Quota
OpenStack 可以針對每個專案 (tenant 或 project 常會混用) 制定限額,可以限制的內 容包含了可用的記憶體總量 (quota_ram),可啟動的虛擬機總數 (quota_instances),可使 用的 CPU 總數 (quota_cores) 等,這些限制一般預設的值會太寬鬆,因此可以參考附錄 B.3修改預設的限額設定。
8