沒有 Availability Zone 的 Neutron
首先看一下沒有 AZ 時,Neutron 是怎麼管理一個多機房的虛擬網絡環境。
可以說是沒有任何基於多機房的考慮,各個作爲網絡節點的主機,都有着相同的地位,網絡服務(DHCP,L3)隨機的由 Neutron分發至各個網絡節點。這就可能出現,一個 Neutron Network 下的虛機被部署在一個機房裏,而這個 Neutron Network 的 DHCP 服務被部署在另一個機房。如果這兩個機場的數據網絡不通,那麼將導致 Neutron Network 的 DHCP 服務不可用,最直觀的結果就是被部署的虛機不能獲得 IP 地址分配。
Availability Zone 爲 Neutron 提供的功能
有了 AZ 之後,Neutron 可以管理一個多機房的虛擬網絡環境。首先可以將每個機房中看成一個 AZ,而將機房中的網絡節點都配置成對應的 AZ。在創建 Neutron Network 和 Neutron Router 的時候,根據需要指定相應的 AZ。最後 Neutron 會把相應的DHCP 服務和 Neutron Router 分發到所指定的AZ 對應的機房中的網絡節點上。這樣,不需要額外的操作,就能確保 DHCP 服務和 Neutron L3 服務出現在所期望的網絡節點上。
AZ的使用
N版neutron只支持network和router的az。
使用如下命令查詢az支持的網絡功能,可以看出test域支持router和Network功能。
$ neutronavailability-zone-list
+------+----------+-----------+
| name |resource | state |
+------+----------+-----------+
| test |router | available |
| test |network | available |
+------+----------+-----------+
Agent 在 OpenStack Neutron 中有相應的數據類型,即在 Database 中有對應的表,用來表示當前 Agent 的基本信息和狀態。在 Neutron 引入AZ 之後,每個 Agent 中會新增一個屬性 availability_zone,但是由於 AZ 只對 Neutron Network 和 Neutron Router 進行支持,所以只有 neutron-dhcp-agent 和 neutron-l3-agent 中這個屬性纔會有值。通過修改/etc/neutron/dhcp_agent.ini或/etc/neutron/l3_agent.ini,可以指定agent所屬的域。
[AGENT]
availability_zone = zone_name
可以使用如下指令指定網絡所屬的域,網絡創建後,會有屬於zone1或zone2的dhcp-agent爲網絡中的虛機提供dhcp服務。
$ neutron net-create --availability-zone-hint zone1 \
--availability-zone-hint zone2 net1
Created a new network:
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| availability_zone_hints | zone-1 |
| | zone-2 |
| id | 0ef0597c-4aab-4235-8513-bf5d8304fe64 |
| mtu | 1450 |
| name | net1 |
| port_security_enabled | True |
| provider:network_type | vxlan |
| provider:physical_network | |
| provider:segmentation_id | 1054 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 32f5512c7b3f47fb8924588ff9ad603b |
+---------------------------+--------------------------------------+
這條命令相當於顯示的指出網絡所屬的AZ,如果沒有指定availability_zone_hints參數,系統會使用/etc/neutron/neutron.conf中default_availability_zones
的配置爲網絡指定AZ。
可以通過配置,可以改變啓動dhcp服務或路由服務時dhcp-agent和l3-agent的調度。
/etc/neutron/neutron.conf
network_scheduler_driver=neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
dhcp_load_type=networks
router_scheduler_driver=neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler
實現原理
以dhcp爲例。
Neutron az改變的只是創建網絡服務時,選擇agent的方式。在沒有az時,爲網絡提供dhcp服務的agent選擇時用過隨機選擇的方式。代碼如下:
neutron/neutron/scheduler/dhcp_agent_scheduler.py AutoScheduler. auto_schedule_networks
query =query.filter(agents_db.Agent.agent_type ==
constants.AGENT_TYPE_DHCP,
agents_db.Agent.host == host,
agents_db.Agent.admin_state_up == sql.true())
dhcp_agents = query.all()
for dhcp_agent in dhcp_agents:
if agents_db.AgentDbMixin.is_agent_down(
dhcp_agent.heartbeat_timestamp):
LOG.warn(_LW('DHCP agent %sis not active'), dhcp_agent.id)
continue
for net_id in net_ids:
agents =plugin.get_dhcp_agents_hosting_networks(
context, [net_id])
if len(agents) >=agents_per_network:
continue
if any(dhcp_agent.id ==agent.id for agent in agents):
continue
bindings_to_add.append((dhcp_agent, net_id))
可以看出,dhcp-agent集合是通過數據庫查詢得到的,neutron-server會根據返回結果的順序,選擇一定數量的dhcp-agent與所創建的網絡綁定,之後由這些agent爲該網絡提供dhcp服務。
加入了AZ後,代碼如下:
for dhcp_agent in dhcp_agents:
if agent_utils.is_agent_down(
dhcp_agent.heartbeat_timestamp):
LOG.warning(_LW('DHCP agent%s is not active'),
dhcp_agent.id)
continue
for net_id, is_routed_networkin net_ids.items():
agents =plugin.get_dhcp_agents_hosting_networks(
context, [net_id])
segments_on_network = net_segment_ids[net_id]
if is_routed_network:
iflen(segments_on_network & segments_on_host) == 0:
continue
else:
if len(agents) >=agents_per_network:
continue
if any(dhcp_agent.id ==agent.id for agent in agents):
continue
net =plugin.get_network(context, net_id)
az_hints = (net.get(az_ext.AZ_HINTS)or
cfg.CONF.default_availability_zones)
if (az_hints and
dhcp_agent['availability_zone'] not in az_hints):
continue
bindings_to_add.append((dhcp_agent, net_id))
新版neutron-server在選擇dhcp-agent時,需要根據網絡的az和dhcp-agent所處的az進行判斷,選擇具有共同az的agent來提供dhcp服務。
總結:
網絡az,是指定網絡服務實體應該創建在某個具體的服務器上,az的配置需要根據部署的實際需要進行指定。在複雜的資源池規劃中,網絡az具有一定的應用價值。
參考文獻:
[1] OpenStack Neutron Availability Zone 簡介
https://www.ibm.com/developerworks/cn/cloud/library/1607-openstack-neutron-availability-zone/
[2] Availability zones
http://docs.openstack.org/newton/networking-guide/config-az.html