neutron availability zones

没有 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章