OpenStack Neutron Availability Zone 简介

发布时间: 更新时间: 总字数:5585 阅读时间:12m 作者: 分享

OpenStack Neutron 是一种 SDN(Software Defined Network)。Availability Zone 提供了一种划分区域进行管理的机制。结合 Availability Zone,OpenStack Neutron 能够对内部的 Network,Router 按照区域进行划分管理。这在用 OpenStack 管理多机房或者复杂物理环境时,提供了一定的优化和帮助。

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 服务的命令

# Add a network to a DHCP agent.
neutron dhcp-agent-network-add
# Remove a network from a DHCP agent.
neutron dhcp-agent-network-remove

在 Mitaka 中 Neutron 社区也通过提交代码缓解了这个问题,可以查看 Make DHCP agent scheduler physical_network aware了解更多信息。但是这也只解决了 DHCP 的问题,对于 Neutron Router,其实存在同样的问题。并且没有 AZ 的概念,在 High Availability(之后简称为 HA)的场景下,也会导致一些问题,在后面会介绍。

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

[fedora@fedora devstack]$ neutron availability-zone-list 
+------+----------+-----------+
| name | resource | state |
+------+----------+-----------+
| nova | router | available |
| nova | network | available |
+------+----------+-----------+

从清单 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

[fedora@fedora devstack]$ neutron agent-show <agent-id> 
| availability_zone | nova |

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 属性

[fedora@fedora devstack]$ neutron net-show private
| availability_zone_hints | |
| availability_zones | nova |

其中,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 的分配机制

Neutron 中的 AZ 实现就是对 scheduler 进行了增强,所以,所有 AZ 功能性的代码改动,都发生在 neutron.scheduler 中。

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 的配置项

default_availability_zones =
availability_zone = nova
network_scheduler_driver = \
 neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
router_scheduler_driver = \
neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler

下面分别对这些配置项加以说明:

  • 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

# 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 |

验证结果

首先来看 Network 只启用一个 DHCP 服务的情况,在/etc/neutron/neutron.conf 中配置 dhcp_agents_per_network 为 1,表示所有的 Network 只启用一个 DHCP 服务。

创建一个 Network,并指定一个 availability-zone-hint,对应的命令如清单 7 所示:

清单 7. 创建 Network 只属于一个 AZ

# neutron net-create net1 --availability-zone-hint nova1

之后再查看 Network 会在哪个 neutron-dhcp-agent 中启用 DHCP 服务,如清单 8 所示:

清单 8. 查看 Network 绑定的 DHCP agent

# neutron dhcp-agent-list-hosting-net net1
+--------------------------------------+-----------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-----------+----------------+-------+
| 4f2fcebf-8c9c-4b98-8698-16c3a9ef4a44 | hostname1 | True | :-) |
+--------------------------------------+-----------+----------------+-------+

结合清单 6 和清单 8,从 host 可以看出来,net1 的 DHCP 服务,启动在 nova1 对应的 DHCP agent 上。

创建 Network 属于多个 AZ,对应的命令如清单 9 所示:

清单 9. 创建 Network 属于多个 AZ

# neutron net-create net2 --availability-zone-hint nova1 \
--availability-zone-hint nova2

通过清单 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

# 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 | :-) |
+--------------------------------------+-----------+----------------+-------+

结合清单 6 和清单 10,从 host 可以看出来,新创建的 net1 的 DHCP 服务,启动在 nova3 对应的 DHCP agent 上。

用清单 9 对应的命令创建属于多个 AZ 的 Network,可以发现,新创建的 net2 的 DHCP 服务启动在 nova1 和 nova2 上,可以通过清单 11 查看:

清单 11. 查看 Network 绑定的 DHCP agent

# neutron dhcp-agent-list-hosting-net net2
+--------------------------------------+-----------+----------------+-------+
| id | host | admin_state_up | alive |
+--------------------------------------+-----------+----------------+-------+
| 4f2fcebf-8c9c-4b98-8698-16c3a9ef4a44 | hostname1 | True | :-) |
+--------------------------------------+-----------+----------------+-------+
| c1bcf74d-13fd-443b-9230-08eb2c42db37 | hostname2 | True | :-) |
+--------------------------------------+-----------+----------------+-------+

当有多个 AZ 可选时,Neutron 首先会平均的在各个 AZ 中分配,而在同一个 AZ 中,会优先选取负载最小的 agent 来提供服务。

总结

对于简单的部署,即只有一个网络节点的环境,AZ 可以说是没有必要被启用。但是对于复杂的部署,存在复杂的网络环境,有多个网络节点,AZ 可以有以下两点作用:

  • 可以按照网络划分 AZ,即独立的网络作为一个 AZ,这样在创建 Network 和 Router 时,可以通过指定相应的 AZ,使 Network 和 Router 的服务运行在期望的网络中。
  • HA 环境中,一个 AZ 通常代表一个相对独立的环境,可以通过 AZ 功能将灾备服务分布在多个 AZ 中,这样可以避免局部故障带来的整体服务不可用。

OpenStack 正在成为私有云领域的事实标准,而 Neutron 作为 OpenStack 的网络模块,也在尝试提供一些复杂环境下需要的功能,例如 AZ。相信随着 OpenStack 的发展,Neutron 将会提供更多对于大规模、复杂网络环境的支持。

转载:https://www.ibm.com/developerworks/cn/cloud/library/1607-openstack-neutron-availability-zone/

完毕。

Home Archives Categories Tags Docs