问题导读:
1.什么是Availability Zone? 2.AZ 为 Neutron提供哪些功能? 3.AZ有哪些作用?
Availability Zone 简介
Availability Zone 最开始是亚马逊 AWS(Amazon Web Service)的概念。整个 AWS 被按照地域划分成了若干 Region,而每个 Region 中可以有多个 Availability Zone。在 AWS 中,每个 Availability Zone 是网络独立的,但是同一个 Region 内部的 Availability Zone 一般会通过一些其他的网络设备相连接,可以查看 亚马逊的官方文档了解更多有关 Region 和 Availability Zone 的概念。为了表达方便,本文之后将 Availability Zone 简称为 AZ。
AZ 简单来看可以理解成一些主机(host)的集合。在 OpenStack 中,Nova 和 Cinder 模块在 Mitaka 版本之前已经集成了 AZ 的功能。在 Nova 模块中,用户创建虚机时可以指定一个 AZ,这样虚机就会在这个 AZ 所包含的主机上生成。在 Cinder 模块中,用户可以在创建卷时指定 AZ,这样卷会在指定的 AZ 所包含的主机中获得存储分配。
一个 AZ 可以理解成一个或多个主机的集合,但是这种集合不应该是随意的。究竟哪些主机可以划分在一个 AZ 中呢?在同一个 AZ 中的主机应该至少具有网络连通性,并且之间最好是有较短的网络路径,例如在同一个交换机下的主机。同时,这些主机应该是共享同一套电源设备,同一套制冷设备等等。划分的原则是让可能同时出错的主机都尽量划分在一个 AZ 中。在现实环境中,同一个机房中同一个交换机下连接的主机(host)可以划分为一个 AZ。
Availability Zone 在 Neutron 中的应用需求
为了描述简单,我们假定一个机房中只有一个交换机连接所有的主机(host),那么一个机房可以看成一个 AZ。OpenStack Neutron 在 Mitaka 版本集成了 Availability Zone 的功能。首先看一下 AZ 给 OpenStack Neutron 带来的新功能。
没有 Availability Zone 的 Neutron
首先看一下没有 AZ 时,Neutron 是怎么管理一个多机房的虚拟网络环境。
可以说是没有任何基于多机房的考虑,各个作为网络节点的主机,都有着相同的地位,网络服务(DHCP,L3)随机的由 Neutron 分发至各个网络节点。这就可能出现,一个 Neutron Network 下的虚机被部署在一个机房里,而这个 Neutron Network 的 DHCP 服务被部署在另一个机房。如果这两个机场的数据网络不通,那么将导致 Neutron Network 的 DHCP 服务不可用,最直观的结果就是被部署的虚机不能获得 IP 地址分配。当然,在发现问题后,管理员可以通过相应的命令将 DHCP 服务迁移到可用的主机上,如清单 1 所示。但这显然不符合使用习惯,并且在大规模环境下,也会大大增加管理员的负担。
清单 1. 手动迁移 DHCP 服务的命令[mw_shl_code=shell,true]# Add a network to a DHCP agent.
neutron dhcp-agent-network-add
# Remove a network from a DHCP agent.
neutron dhcp-agent-network-remove[/mw_shl_code]
Availability Zone 为 Neutron 提供的功能
AZ 在 Neutron 中的实现,实际上从 Liberty 版本就已经开始,直到 Mitaka 版本才在 Neutron 中最终实现。有了 AZ 之后,Neutron 可以这么管理一个多机房的虚拟网络环境。首先可以将每个机房中看成一个 AZ,而将机房中的网络节点都配置成对应的 AZ。在创建 Neutron Network 和 Neutron Router 的时候,根据需要指定相应的 AZ。最后 Neutron 会把相应的 DHCP 服务和 Neutron Router 分发到所指定的 AZ 对应的机房中的网络节点上。这样,不需要额外的操作,就能确保 DHCP 服务和 Neutron L3 服务出现在所期望的网络节点上。
Availability Zone 对 High Availability 的增强
HA(High Availability)场景通常需要部署冗余的服务,即对一个服务部署多个实例,这样当服务的某一个实例由于意外停止工作的时候,冗余的实例能继续工作。在 Neutron 中,一个 HA 的环境里通常有多个网络节点。这样其中一个网络节点由于故障不能工作,剩余的网络节点能继续提供服务。
以 DHCP 服务为例,假设对于一个 Neutron Network 需要 2 个 DHCP 服务来提供 HA。由于没有 AZ 的时候,Neutron 是随机分发 DHCP 服务的,那么有可能 2 个 DHCP 服务都被分配到一个机房里的网络节点上。那么当这个机房断电,会导致 Neutron Network 的 DHCP 服务整体不可用。这实际上是违背了 HA 的初衷的,HA 就是为了最大可能的消除某些意外情况的影响。
有了 AZ 功能,可以在创建 Neutron Network 和 Neutron Router 时指定多个 AZ。这样 Neutron 会尽量平均的在各个 AZ 中去部署相应的 DHCP 服务和 Neutron Router。就算某个机房突然断电,其他 AZ(机房)中的网络节点能够继续提供服务,不会导致整个网络服务不可用。
如何使用 Neutron Availability Zone 的功能将在后面详细介绍,首先来看一下 AZ 对 Neutron 中现有数据类型的影响和其实现原理。
Availability Zone 对 Neutron 中数据类型的影响环境准备
本文之后的所有内容都将基于 OpenStack Mitaka 版本来说明。
Availability Zone
AZ 在 OpenStack Neutron 中并没有一个数据类型。也就是说在 OpenStack Neutron 的 Database 中没有 AZ 的表。但是 OpenStack Neutron 提供一个命令来查看当前的 AZ,如清单 2 所示。
清单 2. 查看 OpenStack Neutron 中的 AZ
[mw_shl_code=shell,true][fedora@fedora devstack]$ neutron availability-zone-list
+------+----------+-----------+
| name | resource | state |
+------+----------+-----------+
| nova | router | available |
| nova | network | available |
+------+----------+-----------+[/mw_shl_code]
从清单 2 可以看出,在 Neutron 中,AZ 是分别对 Neutron network 和 Neutron router 进行支持的。
Agent
Agent 是指运行在网络节点上的各个服务,常见的 agent 有:
- neutron-dhcp-agent,管理 DHCP 服务
- neutron-l3-agent,管理 L3 服务
- neutron-openvswitch-agent,管理基于 OpenVSwitch 的 L2 服务
- neutron-metadata-agent,管理 Neutron metadata 服务
Agent 在 OpenStack Neutron 中有相应的数据类型,即在 Database 中有对应的表,用来表示当前 Agent 的基本信息和状态。在 Neutron 中引入了 AZ 之后,每个 Agent 中会新增一个属性 availability_zone,但是由于 AZ 只对 Neutron Network 和 Neutron Router 进行支持,所以只有 neutron-dhcp-agent 和 neutron-l3-agent 中这个属性才会有值。前面说过 AZ 在 OpenStack Neutron 中并没有对应的数据模型,OpenStack Neutron 也不支持更新 Agent 的 availability_zone,那么管理员该如何管理 agent 的这个属性?
在/etc/neutron/neutron.conf 中有一个配置项 availability_zone,这个配置项的值将会是配置文件所在的主机上运行的 neutron-dhcp-agent 和 neutron-l3-agent 对应的 AZ。Agent 在启动的时候会读取这个配置项,并将之汇报给 Neutron server,Neutron server 收到了之后会更新本地的 agent 记录。并且清单 2 中查看 AZ 的命令也是通过查看 agent 的 availability_zone 有哪些值,再将这些值列出来。
availability_zone 的值默认是 nova,是为了跟 OpenStack Nova 项目保持一致。可以通过清单 3 所示的命令查看 agent 对应的 AZ。 清单 3. 查看 Agent 对应的 AZ
[mw_shl_code=shell,true][fedora@fedora devstack]$ neutron agent-show <agent-id>
| availability_zone | nova |[/mw_shl_code]
Network
Network 是 Neutron 中的虚拟网络。默认情况下,Neutron 会给 Network 分配一个或多个 DHCP 服务。这些 DHCP 服务由 neutron-dhcp-agent 管理。对于 Network 来说,AZ 实际上就是管理 DHCP 服务向哪些 neutron-dhcp-agent 分发。在加入了 AZ 之后,创建 Network 时,可以指定参数 availability-zone-hint,这个参数可以重复设定,如清单 9 所示。这个参数表明 Network 的 DHCP 服务可以在哪些 AZ 中的 neutron-dhcp-agent 上被部署。当不指定这个参数的时候,Network 的 DHCP 服务将不考虑 agent 的 AZ 属性。对应的,在 Network 中,将会新增两个属性,如清单 4 所示:
清单 4. 查看 Network 中的 AZ 属性
[mw_shl_code=shell,true][fedora@fedora devstack]$ neutron net-show private
| availability_zone_hints | |
| availability_zones | nova |[/mw_shl_code]
其中,availability-zone-hints 就是在创建 Network 时指定的 AZ,而 availability_zones 是 Network 的 DHCP 服务实际运行在哪些 AZ 中。清单 4 中的 Network 的 DHCP 服务就运行在名为‘nova’的 AZ 中。
Router
Router 是 Neutron 中的虚拟路由器。对于非 HA Router,Neutron 只会给其分配一个 neutron-l3-agent 用来部署其实例。对于 HA Router,Neuron 会在至少 2 个 neutron-l3-agent 上部署 Router 的实例。有关 HA Router 的工作方式,可以从这篇文章 OpenStack Neutron 之 L3 HA找到更多信息。对于 Router 来说,AZ 实际上就是管理在哪些 neutron-l3-agent 上部署 Router 实例。与 Network 类似,在加入 AZ 之后,创建 Router 的时候,可以指定参数 availability-zone-hint,这个参数可以重复设定,表明 Router 可以在哪些 AZ 中的 neutron-l3-agent 上部署实例。当不指定这个参数的时候,Neutron 在部署 Router 实例的时候将不考虑 Agent 的 AZ 属性。同样的,在 Router 中,会新增两个属性,与清单 4 中的属性类似。
DVR Router 会在每个 compute node 上部署一个 DVR local Router,但是 DVR edge Router 只会在一个 neutron-l3-agent 上部署。 Neutron Availability Zone 的实现原理
AZ 的实现原理比较简单,就是通过之前描述的在各个数据类型中新增的属性,在 schedule Network 和 Router 的时候,对 AZ 进行匹配,只对匹配符合的 agent 进行绑定。以 Network 为例,在没有 AZ 的时候,Network 是会在所有的 neutron-dhcp-agent 中按照一定的策略选择相应的 agent。如图 1 所示:
图 1. 没有 AZ 时 Network 的分配机制
而在加入了 AZ 之后,Network 只会在匹配其 availability-zone-hints 的 neutron-dhcp-agent 中按照一定的策略选择相应的 agent。如图 2 所示:
图 2. 有 AZ 时 Network 的分配机制
[size=14.9248px]Neutron 中的 AZ 实现就是对 scheduler 进行了增强,所以,所有 AZ 功能性的代码改动,都发生在 neutron.scheduler 中。
[size=14.9248px]
Neutron Availability Zone 的功能验证
本章节将介绍如何使用 Neutron Availability Zone 的功能。为了描述简洁,只以 Network 为例进行介绍,有关 Router 的配置和使用与 Network 基本一样。
配置
Neutron Availability Zone 的配置分布在/etc/neutron/neutron.conf, /etc/neutron/dhcp_agent.ini 和 /etc/neutron/l3_agent.ini 中。如清单 5 所示。
清单 5. Neutron AvailabilityZone 的配置项
[mw_shl_code=text,true]default_availability_zones =
availability_zone = nova
network_scheduler_driver = \
neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
router_scheduler_driver = \
neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler[/mw_shl_code]
下面分别对这些配置项加以说明。 - availability_zone,代表当前节点的 AZ 名字,前面说过,Neutron 会读取这个配置项并记录下来,并更新相应的 agent 的属性。
- default_availability_zones,相当于 availability-zone-hints 的默认值,如果用户在创建 Network 或者 Router 时没有指定 availability-zone-hints,那会从这个配置值中读取相关的内容当做相应的 availability-zone-hints。这个值默认为空。
- network_scheduler_driver,这并非是只针对 AZ 才有的配置。当配置成 neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler 时表示启用一种在各个 AZ 中平均分配 DHCP 服务的 Schdule 机制。从这个配置可以看出,AZ 的实现实际上就是对 Neutron scheduler 的增强。本文后面的步骤都将使用这个配置值。
- router_scheduler_driver 与 network_scheduler_driver 类似,就不再赘述。
目前,由于 OpenStack Neutron 代码的限制,对于 DHCP agent,所有的 Scheduler 都能识别 Network 的 availability-zone-hints,并按照图 2 方式进行分配。但是对于 L3 agent,仅当 Scheduler 被配置成 AZLeastRoutersScheduler 时,Router 的 availability-zone-hints 才能识别,并按照图 2 方式进行分配。目前,在 OpenStack Neutron,由这个 bug 记录并解决这个问题。
创建资源
AZ 的应用场景就是针对多个网络节点,所以首先部署多个 neutron-dhcp-agent,并把每个节点上的配置文件中的 availability_zone 设置成相应的值。本文对应的环境中创建了 4 个 neutron-dhcp-agent,对应的 AZ 分别是 nova1,nova2,nova3。可以通过清单 6 中的命令查看:
清单 6. 查看环境中的 DHCP agent
[mw_shl_code=shell,true]# neutron agent-list -F agent_type -F host -F availability_zone | grep DHCP
| DHCP agent | hostname1 | nova1 |
| DHCP agent | hostname2 | nova2 |
| DHCP agent | hostname3 | nova3 |
| DHCP agent | hostname4 | nova3 |[/mw_shl_code]
验证结果
首先来看 Network 只启用一个 DHCP 服务的情况,在/etc/neutron/neutron.conf 中配置 dhcp_agents_per_network 为 1,表示所有的 Network 只启用一个 DHCP 服务。
创建一个 Network,并指定一个 availability-zone-hint,对应的命令如清单 7 所示:
清单 7. 创建 Network 只属于一个 AZ
[mw_shl_code=shell,true]# neutron net-create net1 --availability-zone-hint nova1
[/mw_shl_code]
之后再查看 Network 会在哪个 neutron-dhcp-agent 中启用 DHCP 服务,如清单 8 所示:
清单 8. 查看 Network 绑定的 DHCP agent
[mw_shl_code=shell,true]# neutron dhcp-agent-list-hosting-net net1
+--------------------------------------+-----------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-----------+----------------+-------+
| 4f2fcebf-8c9c-4b98-8698-16c3a9ef4a44 | hostname1 | True | :-) |
+--------------------------------------+-----------+----------------+-------+[/mw_shl_code]
结合清单 6 和清单 8,从 host 可以看出来,net1 的 DHCP 服务,启动在 nova1 对应的 DHCP agent 上。
创建 Network 属于多个 AZ,对应的命令如清单 9 所示:
清单 9. 创建 Network 属于多个 AZ
[mw_shl_code=shell,true]# neutron net-create net2 --availability-zone-hint nova1 \
--availability-zone-hint nova2[/mw_shl_code]
通过清单 8 所示的命令查看,可以得到同样的结果。即 net2 的 DHCP 服务也启动在 nova1 对应的 DHCP agent 上。
如果再创建新的 Network,还是会将 DHCP 服务分配到 nova1 上。这样会导致 nova1 上的负载越来越大。这里期望的用户行为是从可选的 AZ 中找出负载最小的 neutron-dhcp-agent,并在这个 agent 上启动 DHCP 服务。但是 Neutron 现在有这样的问题,即当有多个可选的 AZ 时,会总是优先选择名字排序靠前的 AZ。对应的解决方案在 这里,这个问题已经在 OpenStack Newton 版本中解决。解决之后,net2 的 DHCP 服务会在可用的 AZ 负载最小的 DHCP agent 上被启用。需要注意的是,同样的问题在 Router 上不会发生,即 Router 会选择负载最小的 L3 agent 来生成 Router 实例。
接下来看 Network 启用多个 DHCP 服务的情况,在/etc/neutron/neutron.conf 中配置 dhcp_agents_per_network 为 2,表示所有的 Network 将启用两个 DHCP 服务。
创建一个 Network,并指定一个 availability-zone-hint,对应的命令如清单 7 所示,只是将 nova1 改成 nova3,因为 AZ nova3 中有 2 个 DHCP agent。之后查看 Network 会在哪些 neutron-dhcp-agent 中启用 DHCP 服务,如清单 10 所示:
清单 10. 查看 Network 绑定的 DHCP agent
[mw_shl_code=shell,true]# neutron dhcp-agent-list-hosting-net net1
+--------------------------------------+-----------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-----------+----------------+-------+
| 3574a58d-a454-4e64-b8e7-a58f3d068d7e | hostname3 | True | :-) |
+--------------------------------------+-----------+----------------+-------+
| 1a873ed7-8e33-4636-8a39-4af8bd46087b | hostname4 | True | :-) |
+--------------------------------------+-----------+----------------+-------+
[/mw_shl_code]
结合清单 6 和清单 10,从 host 可以看出来,新创建的 net1 的 DHCP 服务,启动在 nova3 对应的 DHCP agent 上。
用清单 9 对应的命令创建属于多个 AZ 的 Network,可以发现,新创建的 net2 的 DHCP 服务启动在 nova1 和 nova2 上,可以通过清单 11 查看:
清单 11. 查看 Network 绑定的 DHCP agent
[mw_shl_code=shell,true]# neutron dhcp-agent-list-hosting-net net
+--------------------------------------+-----------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-----------+----------------+-------+
| 4f2fcebf-8c9c-4b98-8698-16c3a9ef4a44 | hostname1 | True | :-) |
+--------------------------------------+-----------+----------------+-------+
| c1bcf74d-13fd-443b-9230-08eb2c42db37 | hostname2 | True | :-) |
+--------------------------------------+-----------+----------------+-------+[/mw_shl_code]
当有多个 AZ 可选时,Neutron 首先会平均的在各个 AZ 中分配,而在同一个 AZ 中,会优先选取负载最小的 agent 来提供服务。
总结
对于简单的部署,即只有一个网络节点的环境,AZ 可以说是没有必要被启用。但是对于复杂的部署,存在复杂的网络环境,有多个网络节点,AZ 可以有以下两点作用:
- 可以按照网络划分 AZ,即独立的网络作为一个 AZ,这样在创建 Network 和 Router 时,可以通过指定相应的 AZ,使 Network 和 Router 的服务运行在期望的网络中。
- HA 环境中,一个 AZ 通常代表一个相对独立的环境,可以通过 AZ 功能将灾备服务分布在多个 AZ 中,这样可以避免局部故障带来的整体服务不可用。
OpenStack 正在成为私有云领域的事实标准,而 Neutron 作为 OpenStack 的网络模块,也在尝试提供一些复杂环境下需要的功能,例如 AZ。相信随着 OpenStack 的发展,Neutron 将会提供更多对于大规模、复杂网络环境的支持。
|