2014年8月7日 星期四

OpenStack Nova 使用外部 DHCP 的設定方法

最近試了蠻久的 OpenStack 設定,目前最新版的 icehouse 版本有 Neutron 這個網路套件
不過我們實驗了一段時間,一直沒辦法把 Neutron 設定好
後來改嘗試完全不使用 Neutron,而是使用原本 Nova 自帶的 Nova Network 套件。

其中因為我們暫時的目標是要能夠透過 ssh 直接連上 OpenStack 上的虛擬機器,因此設定選用 FlatManager 這個最基本的網路設定。
補充:FlatManager 在某些方面不太被認同,可以參考 [8] 的討論。

FlatManager 的概念可以參考 [1],以下節錄一張簡易的架構圖。


FlatManager 的網路拓撲,節錄自 [1]

從圖中可以稍微看出,在 FlatManager 的模式中,Nova 不做任何網路的管理,而是把網路設定轉嫁給外部的 DHCP 伺服器
因此在這個設定裡,所有 Nova 上的虛擬機器都會直接向外部的 DHCP 伺服器取得 IP,也可以直接由外部連線至 Nova 上的虛擬機器。

以下介紹的部分,操作環境是 ubuntu server 12.04.4;使用的 Nova 版本是 2014.1.1,而使用的版本檢測方法來自 [2],檢測過程如下:
root@ubuntu:~# nova-manage shell python
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from nova import version
>>> version.version_string()
'2014.1.1'
>>>
操作的主機有兩張網卡 eth0 和 eth1,其中 eth1 沒有設定 IP(預留給 Nova Network 橋接用的)。

以下是 FlatManager 的設定步驟。其他相關資料可以參考 [3-5],而關於網路問題,也可以看看 [6],可能會有幫助。

1. 設定 Nova Network 的網路環境
因為 FlatManager 不管理網路,所以會需要事先在 Nova Network 的伺服器上設定要提供給 Nova Compute 運行的網路環境。
補充:本文中雖然會特別提到 Nova Compute 和 Nova Network,但我是直接把這兩個都裝在同一台伺服器上。
具體來說,就是要建立一個 bridge interface 供 Nova 產生的虛擬機器橋接。

首先要先安裝 birdge-utils 這個工具。
apt-get install bidge-utils

安裝完以後,要建立一個永久的 bridge interface,因此要編輯 /etc/network/interfaces 檔案,設定如下的內容:
auto eth1

auto br100
iface br100 inet manual
        bridge_ports eth1
        bridge_stp off
        bridge_maxwait 0
        bridge_fd 0
eth1 是實體網卡,而 br100 是要讓 bridge-utils 在開機時自動建立的 bridge interface。

設定完成後,把網路重新啟動。
/etc/init.d/networking restart

2. 設定 Nova Network
假設 Nova Compute 已經安裝完成了,要在有安裝 Nova Network 套件的伺服器上編輯 /etc/nova/nova.conf:
# NETWORK
network_manager=nova.network.manager.FlatManager
# For injected network informations in instance
flat_injected=true
#firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
# Temporary removing firewall for debugging
firewall_driver=nova.virt.firewall.NoopFirewallDriver
# Have nova-network on each compute-node
multi_host=true

flat_network_bridge=br100
flat_network_dns = 8.8.4.4
force_dhcp_release = True
gateway = aaa.bbb.26.1


有關各個設定的用途,可以參考 [7]。比較特別的是為了測試,這裡有加上 firewall_driver=nova.virt.firewall.NoopFirewallDriver 的設定
這段設定是把 Nova Network 的防火牆關閉,不過根據官方文件的描述是建議網路設定測試完以後,要把這段設定去除以確保安全。
另外 aaa.bbb.26.1 表示的是我的網路環境中的 gateway 位址。

設定完以後記得重新啟動 Nova 的服務。
service nova-compute restart

3. 新增虛擬網路
在沒有安裝 Neutron 的狀況下,OpenStack Dashboard 上其實看不到任何網路相關的東西,但這並不表示就沒有虛擬網路需要設定。
可以透過 Nova Client 做基本的測試:
root@ubuntu:~# nova network-list
+--------------------------------------+------------+----------------+
| ID                                   | Label      | Cidr           |
+--------------------------------------+------------+----------------+
+--------------------------------------+------------+----------------+
這樣的結果表示目前沒有建立任何的虛擬網路。此時如果想要建立虛擬機器,虛擬機器開機後會因為無法取得網路介面而一直卡在 Spawning 的階段
而且有時候因為這個原因卡住時,因為實際上虛擬機器並沒有被建立,所以想要把這個虛擬機器關掉時也可能會關不掉(卡在 Deleting 的階段)....。

想要建立網路,可以使用以下的指令:
nova-manage network create --multi_host=T --fixed_range_v4=aaa.bbb.26.0/24 --bridge=br100 --bridge_interface=br100 --num_networks=1 --network_size=10 --label=network100
其中 --fixed_range_v4 是表示這個虛擬網路的 IP 範圍。不過特別的地方是,根據結果來看,這裡指定的 IP 好像跟實際虛擬機器拿到的 IP 沒有關連。

建立完以後,再用同樣的指令看看結果:
root@ubuntu:~# nova network-list
+--------------------------------------+------------+----------------+
| ID                                   | Label      | Cidr           |
+--------------------------------------+------------+----------------+
| 2445546a-4d8c-4796-bd57-1837f57b82f5 | network100 | aaa.bb.26.0/28 |
+--------------------------------------+------------+----------------+
這裡可以注意到,上頭建立時使用的參數是 aaa.bbb.26.0/24,但建出來的虛擬網路的 CIDR 卻是 aaa.bb.26.0/28....原因我還不太清楚 Orz。

4. 開啟虛擬機器
到這裡其實設定就完成了,在 [3-5] 是使用指令開啟虛擬機器,不過我是都直接從 OpenStack Dashboard 打開 XD
打開虛擬機器後,透過 Nova Client 的 API 可以看到新的虛擬機器的狀態如下:
root@ubuntu:~# nova list
+--------------------------------------+------+--------+------------+-------------+------------------------+
| ID                                   | Name | Status | Task State | Power State | Networks               |
+--------------------------------------+------+--------+------------+-------------+------------------------+
| 22bf232d-f3ea-4751-9699-5512b0fb82ac | qwer | ACTIVE | -          | Running     | network100=aaa.bb.26.2 |
+--------------------------------------+------+--------+------------+-------------+------------------------+
不過這裡顯示的 aaa.bb.26.2 並不是真正虛擬機器拿到的 IP....

從虛擬機器的 log 可以看到類似以下的訊息:
Cloud-init v. 0.7.5 running 'init-local' at Wed, 06 Aug 2014 10:40:11 +0000. Up 4.46 seconds.
 * Starting enable remaining boot-time encrypted block devices[74G[ OK ]
cloud-init-nonet[4.89]: waiting 10 seconds for network device
 * Starting Mount network filesystems[74G[ OK ]
 * Stopping Mount network filesystems[74G[ OK ]
cloud-init-nonet[6.47]: static networking is now up
 * Starting configure network device[74G[ OK ]
Cloud-init v. 0.7.5 running 'init' at Wed, 06 Aug 2014 10:40:13 +0000. Up 6.73 seconds.
ci-info: +++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++
ci-info: +--------+------+---------------+---------------+-------------------+
ci-info: | Device |  Up  |    Address    |      Mask     |     Hw-Address    |
ci-info: +--------+------+---------------+---------------+-------------------+
ci-info: |   lo   | True |   127.0.0.1   |   255.0.0.0   |         .         |
ci-info: |  eth0  | True | aaa.bb.26.121 | 255.255.255.0 | fa:16:3e:f3:b9:31 |
ci-info: +--------+------+---------------+---------------+-------------------+
ci-info: +++++++++++++++++++++++++++++++Route info++++++++++++++++++++++++++++++++
ci-info: +-------+-------------+-------------+---------------+-----------+-------+
ci-info: | Route | Destination |   Gateway   |    Genmask    | Interface | Flags |
ci-info: +-------+-------------+-------------+---------------+-----------+-------+
ci-info: |   0   |   0.0.0.0   | aaa.bb.26.1 |    0.0.0.0    |    eth0   |   UG  |
ci-info: |   1   | aaa.bb.26.0 |   0.0.0.0   | 255.255.255.0 |    eth0   |   U   |
ci-info: +-------+-------------+-------------+---------------+-----------+-------+
這上面顯示的 "aaa.bb.26.121" 就是虛擬機器透過外部 DHCP 伺服器取得的 IP。

驗證方式則是直接進入虛擬機器內,使用 ifconfig 顯示的以下資訊:
$ ifconfig
eth0      Link encap:Ethernet  HWaddr FA:16:3E:8C:0C:9F
          inet addr:aaa.bb.26.121  Bcast:aaa.bb.26.255  Mask:255.255.255.0
          inet6 addr: fe80::f816:3eff:fe8c:c9f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:155188 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1055 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:21368597 (20.3 MiB)  TX bytes:97535 (95.2 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

參考資料:
1、OpenStack Networking – FlatManager and FlatDHCPManager
2、Checking The Installed Version of OpenStack
3、Use flat network with OpenStack
4、Network configuration after the installation of the OpenStack Nova FlatManager (簡中翻譯版)
5、OPENSTACK MANUALS > OPENSTACK COMPUTE ADMINISTRATION GUIDE - GRIZZLY, 2013.1 > Libvirt Flat Networking
6、OPENSTACK MANUALS > OPENSTACK CLOUD ADMINISTRATOR GUIDE - CURRENT > Troubleshoot Networking
7、OPENSTACK MANUALS > OPENSTACK CONFIGURATION REFERENCE - JUNO > nova.conf - configuration options
8、Why do people believe the FlatManager is a bad option for networking?

沒有留言: