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

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