讀古今文學網 > OpenStack系統架構設計實戰 > 2.7.8 nova-network >

2.7.8 nova-network

nova-network是Nova裡面負責虛擬機網絡的組件,後來OpenStack發展了一個功能更強大的項目Neutron,用來替代nova-network。但是Neutron過於複雜,還不是很成熟,在生產環境中容易出問題,所以,目前還是有許多生產環境選擇部署nova-network。另外,nova-network也依然保留在Nova代碼內,還沒有被移除,只是這部分代碼現在比較穩定,很少改動。本節從基本概念開始,重點介紹這部分內容。

1.關鍵概念

Nova中有fixed_ip和floating_ip概念。

(1)fixed_ip

這是內網中虛擬機所使用的內部IP地址,從虛擬機創建起到虛擬機終止為止,都需要一個固定的fixed_ip來對應這個虛擬機,一個虛擬機必須要有fixed_ip。集群的網絡類型決定虛擬機獲取fixed_ip的方式,具體使用何種方式是在系統中預先配置好的,nova-controller.conf有一個選項network_manager來指定具體的方式。

(2)floating_ip

這是外網的IP地址,可動態指派給虛擬機,也可隨時收回。floating_ip是可選的(用戶需要這台虛擬機可供外網訪問時,才需要為其指派floating_ip)。flaoting_ip不是在虛擬機的虛擬網卡上,而是在nova-network的外圍網絡接口上分配。nova-network會根據用戶配置指令做NAT,將用戶內網的fixed_ip映射到外網的floating_ip,這樣,用戶訪問floating_ip時,會通過nova-network重定向到具體的flixed_ip上。nova-network通過這種NAT機制控制虛擬機的內外網連通性。

在linux_net模塊實現的floating_ip的綁定和解綁方法如下:

def bind_floating_ip(floating_ip, device): """Bind ip to public interface.""" _execute('ip', 'addr', 'add', str(floating_ip) + '/32', 'dev', device, run_as_root=True, check_exit_code=[0, 2, 254]) if FLAGS.send_arp_for_ha:_execute('arping', '-U', floating_ip, '-A', '-I', device, '-c', 1, run_as_root=True, check_exit_code=False)def unbind_floating_ip(floating_ip, device): """Unbind a public ip from public interface.""" _execute('ip', 'addr', 'del', str(floating_ip) + '/32', 'dev', device, run_as_root=True, check_exit_code=[0, 2, 254])

fixed_ip、floating_ip資源池都是由管理員事先配置好的,存放於Nova數據庫的fixed_ip表和floating_ips表中。Daiblo版本中整個OpenStack集群只有一個floating_ips資源池。為便於系統管理員管理不同租戶的floating_ips,從Essex版本開始引入多個floating_ips_pools的概念,其實就是對floating_ips地址段進行劃分,從概念和數據庫表屬性上進行表徵,不同的池屬於不同的租戶。

2.網絡類型

目前,Nova支持3種類型的網絡:Flat、Flat DHCP和VLAN。在一個雲系統中,這3種網絡可以同時存在。但用戶不能為給定的項目選擇網絡類型,因此在一個給定的compute部署中,只能配置一種網絡類型。

(1)Flat模式

Flat模式中,網絡管理員需要設定一個子網。VM的IP地址需要從該子網中抓取,同時在發佈實例時注入鏡像中。每個實例從可用的地址資源池中獲取一個fixed_ip。網絡管理員必須在托管網絡的網絡控制器和托管實例的雲控制器間配置Linux網橋(通常命名為br100)。系統的所有實例都要由管理員手動配置連接到該網橋上。compute在創建虛擬機過程中,會向nova-network發指令,索要IP地址,nova-compute收到nova-network返回的IP地址後,在虛擬機創建時注入該IP地址。

注意 配置注入目前僅支持Linux-style的系統,網絡配置信息記錄在/etc/network/interfaces中。

FlatManager是Flat網絡的管理類,它不負責網橋和VLAN的創建工作。用戶在創建網絡時負責通過nova-manage來創建指定的網橋。需要在所有的compute host節點上創建網橋。為主機創建單個網絡的命令如下:

nova-manage network create 192.168.0.0/24 1 256

目前Nova不支持由一個管理器創建多個網絡,但可通過修改allocate_fixed_ip和get_network來獲得新的網絡邏輯。管理員可手動修改fixed_ip資源池包含的IP地址列表。

當flat_injected=True時,compute host將注入網絡配置給VM。它通過修改/etc/network/interfaces實現,目前只支持基於Debian的系統。

該模式下,metadata轉發由網關處理,發送給169.254.169.254:80的請求會被轉發給API服務器。

FlatManager實現的函數有def_setup_network_on_host(self,context,network):

"""Sets up network on this host,設置內網的虛擬網絡."""network['dhcp_server'] = self._get_dhcp_ip(context, network)self.l3driver.initialize_gateway(network)if not FLAGS.fake_network: dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network) if(FLAGS.use_ipv6):self.driver.update_ra(context, dev, network)gateway = utils.get_my_linklocal(dev)self.db.network_update(context, network['id'], {'gateway_v6': gateway})

Flat Networking使用一台網絡適配器作為網橋,傳輸多節點間的網絡通信。該設置可在主機的單個適配器或多個適配器上實現。該模式不需要具有打VLAN標籤功能的交換機,通常用於概念證明。如果選擇使用Flat networking模式,Nova其實是不管理網絡的。相反,IP地址通過文件系統(或客戶端代理)注入實例中。如果需要Metadata轉發機制,則必須在網關上手動配置。nova.conf中的配置選項如下:

network_manager=nova.network.manager.FlatManager

注意 在Flat networking模式下,失敗的flat_injection將使VM在啟動時不能收到其IP信息。

Compute默認定義了一個名為br100的網橋設備(存儲在Nova數據庫中),網橋的名稱是可以更改的。

在任意Flat Networking(Flat|FlatDHCP)模式下,nova-network主機負責轉發私有網絡中的通信。網絡主機需要配置br100來與其他托管VM的節點進行會話。兩種Flat模式中,VM的默認網關都是運行Nova-network的主機。

設置compute節點的外部IP地址到網橋上,並添加eth1到網橋的網絡接口配置文件如下:

sudo brctl addbr br100#創建網橋br100sudo brctl addif br100 eth1 #添加設備到網橋br100sudo ip addr add 10.0.0.1/24 brd 10.0.0.255 dev br100 #設置br100管理的子網

下一步是重啟網絡,使用命令sudo/etc/init.d/networking重啟。圖2-9給出all-in-one的網絡環境。

圖2-9 Flat網絡,all-in-one服務器配置

對存在多個compute節點,而僅有一個網絡適配器的部署環境,可在做「冒煙測試」或概念證明時使用,圖2-10表示此種環境的網絡設置情況。

圖2-10 Flat網絡,一個接口,多個服務器

對存在多個compute節點,而有多個網絡適配器的部署環境,能隔離admin和數據通信,圖2-11表示此種環境的網絡設置情況。

圖2-11 Flat網絡,多個接口,多個服務器

(2)Flat DHCP模式

虛擬機通過DHCP方式獲取fixed_ip地址,虛擬機在啟動時通過dhcpdiscover向DHCP服務器發起獲取IP地址的請求。一個DHCP服務器偵聽網橋br100(由管理員手動配置),收到DHCP請求後,分配指定子網中的一個fixed_ip響應給虛擬機。這種模式最為簡單。FlatDHCPManager不會注入網絡設置給guest,但管理網橋。

類似於Flat模式,所有instance掛接到一個單獨的compute節點上。該模式下compute需要橋接到一個以太網設備上(默認是eth0),同時需要運行dnsmasq服務作為DHCP服務器來偵聽網橋。實例通過dhcpdiscover獲取其fixed_ip。

在兩種Flat模式下,compute為每個項目&實例創建iptables/ebtables目錄來隔離IP、MAC地址欺詐或ARP中毒。

實現的函數如下:

1)def init_host(self)

"""Do any initialization that needs to be run if this is astandalone service."""#將linux_net作為後端的3層驅動器self.l3driver.initializesuper(FlatDHCPManager, self).init_hostself.init_host_floating_ips

2)def_setup_network_on_host(self,context,network)

"""Sets up network on this host."""network['dhcp_server'] = self._get_dhcp_ip(context, network)self.l3driver.initialize_gateway(network)if not FLAGS.fake_network: dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network) if(FLAGS.use_ipv6): self.driver.update_ra(context, dev, network) gateway = utils.get_my_linklocal(dev) self.db.network_update(context, network['id'], {'gateway_v6': gateway})

3)def_teardown_network_on_host(self,context,network)

if not FLAGS.fake_network: network['dhcp_server'] = self._get_dhcp_ip(context, network) dev = self.driver.get_dev(network) self.driver.update_dhcp(context, dev, network)

4)def_get_network_by_id(self,context,network_id)

return NetworkManager._get_network_by_id(self, context.elevated, network_id)

5)def_get_network_dict(self,network)

"""Returns the dict representing necessary and meta network fields"""# get generic network fieldsnetwork_dict = super(FlatDHCPManager, self)._get_network_dict(network)# get flat dhcp specific fieldsif self.SHOULD_CREATE_BRIDGE:network_dict['should_create_bridge'] = self.SHOULD_CREATE_BRIDGEif network.get('bridge_interface'): network_dict['bridge_interface'] = network['bridge_interface']if network.get('multi_host'): network_dict['multi_host'] = network['multi_host']return network_dict

在Flat DHCP模式下,運行nova-network的host作為虛擬節點的網關。每個集群需要運行一個nova-network。在nova-compute節點的conf文件中設置network-host,告訴nova-compute host nova-network在哪運行,以完成nova-compute與nova-network間的通信。nova-network將對數據庫進行跟蹤,通過DHCP正確配置的VM實例。通過設置iptables規則允許VM與外網進行通信,同時連接一個指定的metadata服務器來檢索雲中的信息。

Flat DHCP模式下,nova-compute主機不需要得到VM網絡的IP地址便能啟動VM,因為網橋將VM和network host放置在同一個邏輯網絡中。在啟動一個VM時,VM發送一個DHCP包,在network host的DHCP服務器上響應並為其分配一個IP地址。

使用libvirt驅動器時,環境設置如圖2-12所示。

圖2-12 使用libvirt驅動器的Flat DHCP網絡

在設置flat_interface時需特別小心。如果指定一個有IP地址的接口,將出錯;如果該接口是SSH連接使用的接口,將不能解決該問題,除非有ipmi/console權限。在Flat DHCP模式下,--network_size等於整個固定IP的數量。如果網絡過大,在初始化時將花費較長時間(需在數據庫中創建所有IP記錄)。

如果在你的主機上有一個沒有IP的未使用的接口,則可告訴Flat DHCP橋接到該接口(在配置文件中設定falt_interface=?)。nova-network主機會自動為網橋添加網關IP。也可手動添加interface到br100上,配置如下:

dhcpbridge_flagfile=/etc/nova/nova.confdhcpbridge=/usr/bin/nova-dhcpbridgenetwork_manager=nova.network.manager.FlatDHCPManagerfixed_range=10.0.0.0/8flat_network_dhcp_start=10.0.0.2flat_network_bridge=br100flat_interface=eth2flat_injected=Falsepublic_interface=eth0

對於任意Flat網絡(Flat、Flat DHCP),運行nova-network的主機負責轉發私有網絡的通信,作為VM的默認網關。該主機需要有一個橋接口,用於與其他托管VM的主機進行會話。

當VM發送通信給互聯網時,首先發送到默認網關(運行nova-network的主機),如圖2-13所示。

圖2-13 單適配器主機,第一次路由

下一步,運行nova-network的主機轉發通信到互聯網,如圖2-14所示。

注意 如果使用單個接口,則接口需要設置為混雜模式才能正確轉發通信。該情況在具有兩個接口的物理主機上是不會發生的。

圖2-14 單適配器主機,第二次路由

(3)VLAN模式

VLAN是nova-network默認的網絡模式,此模式中,Nova為每個項目創建一個VLAN和網橋。對於多節點部署,VLAN網絡模式要求支持打VLAN標籤(IEEE802.1Q)的交換機。項目有一個私有IP的範圍,這些私有IP僅可從VLAN內部訪問。在該模式下,每個項目有獨立的VLAN、Linux網橋和子網。Vlan中子網的網絡創建命令如下:

nova-manage network create 10.0.0.0/8 3 16#創建3個網絡,範圍從10.0.0.0開始

VlanManager試圖解決Flat管理器存在的兩個缺陷:

1)缺乏可擴展性(在整個OpenStack集群中,Flat管理器依賴於單一的L2廣播域)。

2)缺少正確的租戶隔離機制(所有租戶共享單一的IP池)。

該方式比較複雜,但是虛擬機之間的隔離也最好。使用方式簡述如下。一個項目配置一個VLAN,啟動一個DHCP服務器,屬於該項目的虛擬機啟動時在DHCP服務器處分配一個帶有VLAN標籤的fixed_ip。這樣,這些具有相同VLAN標籤的fixed_ip之間可以互相連通,不同VLAN標籤的fixed_ip之間相互隔離。為了能夠在外圍訪問VLAN虛擬機,在Nova環境中需要單獨設置一個VPN虛擬機(cloudpipe),並為用戶生成一個訪問該VPN的證書和密鑰。該虛擬機提供VPN服務,外網用戶先用VPN登錄,才能訪問VLAN中其他虛擬機。

子網由網絡管理員指定,並在項目請求時分配。DHCP服務器為每個VLAN中的VM實例分發指定子網中的IP地址。屬於同一項目的所有實例被橋接到相同的VLAN上。Nova通過用戶請求創建Linux網橋和VLAN。

注意 在默認的compute環境中,一旦銷毀一個VM,需要花費一段時間將IP地址從被銷毀的VM上撤離下來,以便之後分配給其他新instance。

如果設置force_dhcp_release=True,則在銷毀一個VM時,Compute服務會發送一個DHCP release包,則分配給VM的IP地址立即被釋放。該配置項用於Flat DHCP和VLAN模式。運用此選項需要運行dhcp_release服務,這需確保在所有nova-compute的主機上都運行了該服務。服務路徑是/usr/bin/dhcp_release。

vlanManager中比較重要的函數如下:

def create_networks(self,context,**kwargs):

"""基於參數創建網絡"""# 校驗num_networks + vlan_start is not > 4094, fixes lp708025if kwargs['num_networks'] + kwargs['vlan_start'] > 4094: raise ValueError(_('The sum between the number of networks and' ' the vlan start cannot be greater' ' than 4094'))# 校驗 num networks and network size fits in fixed_netfixed_net = netaddr.IPNetwork(kwargs['cidr'])if len(fixed_net) < kwargs['num_networks'] * kwargs['network_size']: raise ValueError(_('The network range is not big enough to fit ' '%(num_networks)s. Network size is %(network_size)s') % kwargs)#調用NetworkManager中的create_networks實現網絡的創建工作return NetworkManager.create_networks(self, context, vpn=True, **kwargs)

Nova可將不同項目的VM設置在不同的子網中,每個子網具有不同的VLAN標籤,當用戶具有很大的IP空間時是非常有用的(大空間被劃分為很多小的子網)。劃分子網的目的是控制廣播的範圍。對多租戶環境下劃分附加的隔離層也是非常有用的。

注意 在VLAN模式中,網絡和子網常常交換使用。一般情況下,提及的IP地址範圍指的都是子網。

運行VLAN模式比其他兩種模式都要複雜,特別之處如下:

·必須啟用IP轉發。

·運行nova-network和nova-compute的主機必須加載8021q內核模塊。

·網絡交換機必須支持打VLAN標籤功能。

·在compute環境中必須指明特定的VLAN標籤用於打VLAN標籤。

·需要從網絡管理員處獲得一些必要的信息,用於正確配置Nova(如:netmask、broadcast、gateway、ethernet設備、VLAN ID)。

·該模式是Nova默認的網絡模式,也可使用network_manager=nova.network.manager.VlanManager指明。

由網絡管理員創建的網橋必須掛接vlan_interface指明的接口,默認使用eth0。fixed_range是用於描述整個IP空間的CIDR(無類型域間選路,Classless Inter-Domain Routing)塊,該IP地址空間會被劃分為多個子網。

network_size指明每個網絡中默認的IP地址數量,該選項在網絡創建時能被重寫。使用nova-manage network create命令創建網絡。下面是一個創建網絡的示例:

nova-manage network create --label=example-net --fixed_range_v4=172.16.169.0/24 --vlan=169 --bridge=br169 --project_id=a421ae28356b4cc3a25e1429a0b02e98

創建的網絡example-net被分配給租戶a421ae28356b4cc3a25e1429a0b02e98。子網172.16.169.0/24的VLAN tag是169(可以任意指定,最好與地址的第三位相同)。該命令還會在運行nova-network服務的主機上創建一個網橋接口設備,名為br169,該設備會出現在ifconfig命令的輸出內容中。

每個網絡都與一個租戶相關聯。可在網絡創建時指定該關聯關係(使用-project_id)。使用Keystone tenant-list命令獲取已創建的租戶列表及相應的ID號。

代替手動指定VLAN、橋和項目ID,用戶可一次創建多個網絡,同時將Compute服務自動與租戶的網絡相關聯,同時自動生成VLAN ID和橋接口名。下面的命令即為創建100個網絡(從172.16.100.0/24到172.16.199.0/24):

nova-manage network create --num_networks=100 --fixed_range_v4=172.16.100.0/24

nova-manage network create命令支持很多配置選項,下面是該命令的-help信息:

Usage: nova-manage network create <args> [options]Options: -h, --help #顯示幫助信息 --label=<label> Label for network (ex: public) --fixed_range_v4=<x.x.x.x/yy>IPv4 subnet (ex: 10.0.0.0/8) --num_networks=<number> Number of networks to create --network_size=<number> Number of IPs per network --vlan=<vlan id>vlan id --vpn=VPN_START vpn start --fixed_range_v6=FIXED_RANGE_V6 IPv6 subnet (ex: fe80::/64 --gateway_v6=GATEWAY_V6 ipv6 gateway --bridge=<bridge> VIFs on this network are connected to this bridge --bridge_interface=<bridge interface> the bridge is connected to this interface --multi_host=<'T'|'F'> Multi host --dns1=<DNS Address> First DNS --dns2=<DNS Address> Second DNS --uuid=<network uuid> Network UUID --project_id=<project id> Project id --priority=<number> Network interface priority

nova-mange network create命令中的flag能用來重寫nova.conf中的環境設置:

--network_size#重寫網絡大小--bridge_interface #vlan_interface 配置項

Root用戶可查看已創建的網絡的列表:

nova-manage network list

其他網絡命令如下:

·nova-manage network modify

·nova-manage network delete

在網絡被刪除之前必須將其從項目上撤離下來。創建網絡時,會自動觸發數據庫,更新可用的固定IP地址表。可通過如下命令查看固定IP地址與實際VM的關聯情況:

nova-manage fix list

如果用戶想通過VPN訪問實例,則需要創建一個特定的VPN(命名為cloudpipe)實例,該實例後面會詳細闡述。

為使節點支持打VLAN標籤功能,root用戶需安裝VLAN包,並裝載8021q內核模塊。

# apt-get install vlan# modprobe 8021q #該模塊位於/lib/modules/2.6.31-28-server/kernel/net目錄下 #為使該模塊在啟動時被加載,需在/etc/modules下添加一行:8021q

下面給出一個在VLAN模式運行nova-network的nova.conf的例子:

network_manager=nova.network.manager.VlanManagervlan_interface=eth0fixed_range=172.16.0.0/12network_size=256

一些情況下,Network Manager在停止時並不能正確地拆卸bridges和VLAN。此時如果重啟Network Manager將會出錯,檢查錯誤日誌文件會發現bridge設備已近存在。如果出現這種情況,用戶需要手動拆卸bridge和VLAN設備,也可手動終止所有dnsmasq進程,命令如下:

# stop nova-network# vconfig rem vlan169#移出Vlan169# ip link set br169 down #關閉網橋br169# brctl delbr br169 #刪除網橋br100# killall dnsmasq# start nova-network

3.各種網絡類型間的區別

在Flat Managers模式下,管理員操作network的工作流程如下:

1)創建一個具有很多固定IP的網絡(典型的是16-bitnetmask或更少),由所有租戶共享。

Nova-manager network create –fixed_range_v4=10.0.0.0/16 –label=public

2)創建租戶。

3)一旦租戶啟動實例,就會從共享的IP資源池主攻獲取一個空閒的IP地址。

因此,典型的IP分配給實例的模式如下。

租戶1:

租戶2:

從圖中可以看出,租戶1和租戶2位於相同的網絡(10.0.0.0)中。

在VLAN Manager模式下,管理員的工作流程如下:

1)創建一個新的租戶,並注意其ID號。

2)為新租戶創建一個專用的固定IP網絡。

nova-manager network create –fixed_range_v4=10.0.0.0/24 –vlan=101-–project_id=tenantID

3)在實例產生之前,會自動從租戶的私有IP池中分配一個IP地址。

對比FlatDHCPManager,VLAN為網絡定義了兩點:

·將一個網絡與指定的租戶關聯(--project_id=<tenanted>)。這使得沒有其他租戶可以訪問到該IP池。

·為該網絡設置一個獨立的VLAN(--vlan=102)。

一旦一個租戶SPAWN一個新的VM,它會自動從該專用池中獲取一個地址。也會被放置到一個專用的VLAN中,該VLAN由OpenStack自動創建和維護。因此VLAN模式下,是為不同的租戶創建不同的VLAN。

租戶1:

租戶2:

由上可以看出不同租戶的實例位於不同的IP池中。

4.使用nova-network管理網絡

(1)nova-network工作實現

首先是nova-network的服務啟動流程,如圖2-15所示。

在Flat DHCP網絡模式下,啟動虛擬機後的網絡請求流程如下:

1)請求MAC地址和fixed_ip地址,fixed_ip是直接讀取db獲得的。

nova.compute.manager.run_instancenova.compute.manager._run_instance(...)nova.compute.manager._allocate_networknetwork_info=nova.compute.manager.network_api.allocate_for_instance:註:#network_api=network.API=nova.network.api.APInw_info = rpc.call(..allocate_for_instance…)#處理為實例分配網絡資源的方法nova.network.manager.allocate_for_instance:networks = self._get_networks_for_instanceself._allocate_mac_addresses self.add_virtual_interface self._add_virtual_interface utils.generate_mac_address self._allocate_fixed_ips self.allocate_fixed_ip address = self.db.fixed_ip_associate 或address = self.db.fixed_ip_associate_pool

圖2-15 nova-network的服務啟動流程

2)nova-network中DHCP服務器維護IP地址與MAC地址的映射,並返回網絡信息。

·lease_fixed_ip(self,context,address)當IP被租用時,由dhcp-bridge調用,該函數主要是更新數據庫的操作。

·add_lease(mac,ip_address)使用DHCP服務器實現IP地址與MAC地址的關聯。

·DHCP服務器發送一個cast消息。

·DHCP服務器創建一個新的連接,連接到VM。

·nova-network打包網絡信息,並發送rpc消息返回給nova-compute。

3)網絡連接好以後,DHCP服務器會週期性地調用odd_lease(mac,ip_address)方法維護映射關係。

4)創建floating_ip,網絡首先解析收到的rpc消息,然後依次調用以下函數來分配一個動態IP。

nova.network.api.allocate_floating_ipnova.network.manager.allocate_floating_ip floating_ip = self.db.floating_ip_allocate_addressnova.db.api.floating_ip_allocate_addressIMPL.floating_ip_allocate_address=nova.db.sqlalchemy.api.floating_ip_allocate_address

5)為實例關聯一個動態IP。

Nova-network收到一個get_instance_nw_info的rpc消息,對其進行解析,從解析出來的信息中為_get_dhcp_ip抓取信息量,nova-network解析associate_floating_ip的rpc消息。

在nova-network上執行以下命令:

sudo ip addr add 10.46.169.213 dev eth0#為nova.network.linux_net.apply方法抓取信息量iptables#為nova.network.linux_net.apply方法抓取文件lock "iptables"sudo iptables-save -t filtersudo iptables-restoresudo iptables-save -t natsudo iptables-restore

(2)使能ping和SSH

用戶使用euca-authorize或nova-secgroup-add-rule來使能對VM的訪問。在此之前需要開通VM的ping和SSH能力。

注意 如果與nova-api交互的憑據被放置在/root/.bashrc,則只有Root用戶可以執行該操作。相應地,如果憑據被放置在某個用戶的.bashrc,則必須是該用戶運行此命令。

使用Nova命令行工具:

$ nova secgroup-add-rule default icmp -1 -1 -s 0.0.0.0/0$ nova secgroup-add-rule default tcp 21-21--s 0.0.0.0/0

使用euca2ools:

$ euca-authorize -P icmp -t -1:-1 -s 0.0.0.0/0 default$ euca-authorize -P tcp -p 21--s 0.0.0.0/0 default

如果在使用nova-secgroup-add-rule命令後,仍不能ping活SSH到VM,則查看nova-network節點啟動的dnsmasq的數量,運行一個實例對應兩個dnsmasg進程。如果不是該情況,則指定以下命令:

# killall dnsmasq# service nova-network restart

(3)配置公有(動態)IP地址

1)私有和公有IP地址。

每個虛擬實例會被自動分配一個私有IP地址,而公有IP對實例是可選的。OpenStack使用動態IP來表示可動態分配給虛擬實例的公有IP。Nova使用NAT(Network Address Translation)來為虛擬實例指派動態IP。

如果計劃使用此功能,則需在nova.conf中增加以下數據,用來指定nova-network服務綁定公有IP到那個接口。

public_interface=vlan100

如果改變了nova.conf文件,需要重啟nova-network服務。

2)創建一個可用的動態IP地址列表。

Nova維護一個動態IP地址列表,用來為實例分配動態IP。Root用戶使用nova-manage floating create命令添加地址給該列表。例如:

# nova-manage floating create 10.46.169.224/29

下面是應用與動態IP的nova-manage命令:

nova-manage floating list #列出池中的所有floating IP addressesnova-manage floating create [cidr] #創建一個特定的floating IPs(一個單獨的地址或一個子網)nova-manage floating delete [cidr] #使用與創建命令相同的參數刪除floating IP地址

3)為實例關聯動態IP。

為實例關聯一個動態IP需要以下兩步:

·nova floating-ip-create:在產品那個可用的地址列表中分配一個動態IP地址。

·nova add-floating-ip:給一個運行中實例添加一個被分配的動態IP地址。

下面給出一個動態IP(68.99.26.170)的操作示例。

$ nova floating-ip-create+-----------------+-------------+----------+------+|Ip | Instance Id | Fixed Ip | Pool |+-----------------+-------------+----------+------+| 68.99.26.170 | None| None ||+-----------------+-------------+----------+------+$ nova add-floating-ip 11-68.99.26.170

如果實例不再需要某個公有IP地址,則從實例上移出該動態IP地址,並釋放該地址。

$ nova remove-floating-ip 11-68.99.26.170$ nova floating-ip-delete 68.99.26.170

4)自動添加動態IP。

nova-Network可以在實例啟動時自動為其分配和關聯動態IP地址,管理員僅需增加下面一行到nova.conf中,並重啟nova-network即可。

auto_assign_floating_ip=True

注意 如果設置了該選項,則在所有動態IP被使用完後,再執行Nova boot命令會失敗。

(4)移出項目的網絡

通過簡單的刪除網絡操作,是不能移出一個已分配給項目的網絡的。管理員需要使用一個scrub命令將項目從網絡中釋放。

$ nova-manage project scrub projectname

(5)實例使用multinic

Multi-nic特徵允許用戶為實例增加多個接口,使以下應用場景可用成為可能:

·SSL配置

·服務容錯/HA

·帶寬分配

·實例接入

3種網絡模式中multinic的用法如圖2-16~圖2-18所示。

圖2-16 multinic扁平網絡管理器

圖2-17 multinic扁平網絡DHCP管理器

每個VIF數據有單獨的網絡,每個網絡模型針對multinic用法都有自己的改變。

首先創建一個新網絡,並將其與項目關聯。

$ nova-manage network create --fixed_range_v4=20.20.0.0/24 --num_networks=1 --network_size=256 --label=test --project=$your-project

圖2-18 multinic VLAN管理器

用戶每次產生一個新實例時,將會從各自的DHCP服務器獲得兩個IP地址。

$ nova list+-----+------------+--------+----------------------------------------+| ID | Name | Status |Networks|+-----+------------+--------+----------------------------------------+| 124 | Server 124 | ACTIVE | network2=20.20.0.3; private=20.10.0.14 |+-----+------------+--------+----------------------------------------+

注意 需要保證實例上的第二個接口上電,否則實例的第二個IP地址將不可用。設置實例的接口的示例如下:

/etc/network/interfaces# The loopback network interfaceauto loiface lo inet loopbackauto eth0iface eth0 inet dhcpauto eth1iface eth1 inet dhcp

5.網絡的故障診斷

(1)不能連接到動態IP

如果使用動態IP地址不能連接到實例,首先要確認默認安全組允許ICMP(ping)和SSH(端口22),這樣才能連接到虛擬機。

$ nova secgroup-list-rules default#或euca-describe-groups+-------------+-----------+---------+-----------+--------------+| IP Protocol | From Port | To Port | IP Range | Source Group |+-------------+-----------+---------+-----------+--------------+| icmp| -1| -1| 0.0.0.0/0 ||| tcp | 21- | 21- | 0.0.0.0/0 ||+-------------+-----------+---------+-----------+--------------+

確保NAT規則已經被添加到了nova-network主機的iptables中,Root用戶運行以下命令:

# iptables -L -nv -A nova-network-OUTPUT -d 68.99.26.170/31--j DNAT --to-destination 10.0.0.3# iptables -L -nv -t nat-A nova-network-PREROUTING -d 68.99.26.170/31--j DNAT --to-destination10.0.0.3-A nova-network-floating-snat -s 10.0.0.3/31--j SNAT --to-source 68.99.26.170

核對公有地址(例子中是68.99.26.170)是否已經被成功地添加到了公有接口,使用如下命令查看:

$ ip addr2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000link/ether xx:xx:xx:17:4b:c1-brd ff:ff:ff:ff:ff:ffinet 13.22.194.80/24 brd 13.22.194.255 scope global eth0inet 68.99.26.170/31-scope global eth0inet6 fe80::82b:2bf:fe1:4b2/64 scope linkvalid_lft forever preferred_lft forever

值得注意的是:VM使用SSH通過公有IP連接自己時,是連不通的,因為路由配置不允許這樣操作。

用戶可使用tcpdump來確認包是否被路由到compute主機上的入站接口上。如果報被傳送到了compute主機但是連接失敗的話,問題可能是包被反向路徑過濾器丟棄。需要關閉入站接口的反向路徑過濾器,如果入站接口是eth2,Root用戶可進行如下操作:

# sysctl -w net.ipv4.conf.eth2.rp_filter=0

如果該方法解決了你的問題,這在/etc/sysctl.conf中增加下面一行,這樣反向路徑過濾器在下次重啟compute主機時就不會被啟用。

net.ipv4.conf.rp_filter=0

(2)防火牆不工作

為了幫助調試VM的網絡問題,在/etc/nova/nova.conf中進行如下設置,不啟用防火牆。

firewall_driver=nova.virt.firewall.NoopFirewallDriver

一旦網絡問題被解決,就應該重新啟用防火牆。