首先看一下没有 AZ 时,Neutron 是怎么管理一个多机房的虚拟网络环境。
可以说是没有任何基于多机房的考虑,各个作为网络节点的主机,都有着相同的地位,网络服务(DHCP,L3)随机的由 Neutron分发至各个网络节点。这就可能出现,一个 Neutron Network 下的虚机被部署在一个机房里,而这个 Neutron Network 的 DHCP 服务被部署在另一个机房。如果这两个机场的数据网络不通,那么将导致 Neutron Network 的 DHCP 服务不可用,最直观的结果就是被部署的虚机不能获得 IP 地址分配。
有了 AZ 之后,Neutron 可以管理一个多机房的虚拟网络环境。首先可以将每个机房中看成一个 AZ,而将机房中的网络节点都配置成对应的 AZ。在创建 Neutron Network 和 Neutron Router 的时候,根据需要指定相应的 AZ。最后 Neutron 会把相应的DHCP 服务和 Neutron Router 分发到所指定的AZ 对应的机房中的网络节点上。这样,不需要额外的操作,就能确保 DHCP 服务和 Neutron L3 服务出现在所期望的网络节点上。
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