允许更新计算端口的mac_address

https://blueprints.launchpad.net/neutron/+spec/allow-mac-to-be-updated

Ironic服务器可能会出现网卡故障,需要更换网卡。更换后的网卡可能具有新的mac地址。目前,没有办法处理这种情况,而不会有丢失IP地址的风险。

另请参阅bug [2]。

问题描述

由于端口的‘mac_address’属性不可更新,因此今天更换ironic服务器上的网卡需要删除关联的neutron端口并创建一个具有正确mac地址的新端口。这可能导致服务器丢失其IP地址,因为同一时间可能创建了另一个端口。

本规范不寻求在mac地址更改时保留相同的IPv6 SLAAC地址。预计此类地址会发生变化。

提议的变更

更改服务器代码以允许更新端口资源的mac_address属性。具体而言,为ml2插件启用此功能。对其他插件的任何工作将在其他规范中解决。

在基础插件中,将mac_address更新限制为仅计算端口(非计算端口需要更多更改,并且不在此处处理的使用情况范围内)。使用情况不需要活动的端口,因此在ml2插件中,我们要求端口不为‘已连接’:vif_type必须为BINDING_FAILED或UNBOUND。请注意,对于ironic服务器,vif_type始终为BINDING_FAILED,因此可以随时更改这些端口的mac_address。但是,这在某些时候可能会被视为一个bug,因此对该bug的任何修复都需要考虑此功能。对于“正常”虚拟机,绑定:vif_type的生命周期取决于后端。l2pop mech驱动程序已更新,以适当地更改fdb表条目。

在OVS L2代理中,检测到mac_address更改时发送一个gratuitous arp。

allowed_address_pairs扩展允许任何配对的mac_address默认为port.mac_address。这意味着在某些情况下,更新端口的mac_address也应更新allowed_address_pair mac_address。

数据模型影响

无。

REST API 影响

将RESOURCE_ATTRIBUTE_MAP中‘ports’条目中‘mac_address’属性的‘allow_put’属性从False修改为True。修改policy.json文件以添加“update_port:mac_address”规则 - 与“create_port:mac_address”规则相同,除了不允许网络所有者。

安全影响

为了目前保持保守,此功能默认将限制为以下内容。

  • admin角色

  • advsvc角色

用户可以根据需要随时调整policy.json。

通知影响

引入了一种新的情况,在这种情况下会发出通知,但不会添加新的通知,也不会修改或删除任何现有的通知。

其他最终用户影响

无。

性能影响

以下列表中描述了在端口更新期间更改mac_address时的性能影响。

  • 影响应与更改ip地址相同。

  • 对于dvr环境,增加了网络上所有路由器VM arp表更新的开销。

IPv6 影响

预计没有IPv6特定的问题。当mac地址更改时,如果存在SLAAC地址,它也会更改,但由于此类地址是动态的,因此应该没问题。域名服务器需要开始提供新的地址,并且当前代码应处理将AAAA记录更新到OpenStack DHCP服务器。如果子网的DHCP未启用,则将新地址传播到外部DNS服务器超出范围。链路本地地址也会更改,但这也很好。

其他部署者影响

部署者现在可以更换ironic服务器中的网卡。

开发人员影响

非ml2插件开发人员需要决定是否允许或希望在他们的环境中更新mac_address。应进行正常的开发过程来处理neutron api和基础插件现在允许mac地址更新这一事实。

社区影响

与ironic很好地集成:除了网卡更换外,某些网卡具有可更改的mac地址,因此更改端口的mac_address的能力似乎很有用。

除了对实现的审查评论外,还没有进行太多的讨论。

备选方案

1. 如果fixed_ips是一个单独的资源(类似于floating_ips,并且在[4]中模糊地提到),那么租户可以在删除并使用新的mac地址重新创建端口时保留IP地址的所有权。这将需要对数据模型进行大量更改,这可能不值得本规范的要求。这也会将IP地址和mac地址之间的关系负担放在客户端上,以及在没有事务的情况下必须处理的各种故障场景。似乎做服务器中提出的相对较小的更改并从客户端中删除一些复杂性是一个更大的胜利。

2. 另一个想法是在dhcp协议中使用DHCP客户端id而不是mac地址。然后mac地址与ip地址查找无关,更换网卡将不会影响分配的IP地址。但是,根据与Ironic团队的快速讨论[3],迫切需要使端口mac_address与硬件的mac_address匹配。

实现

负责人

主要负责人

ChuckC (Chuck Carlino)

工作项

与neutron核心相关的任务项。

  1. 审查 [1]

  2. 用于覆盖网卡更换的baremetal场景测试

  3. allowed_address_pairs支持

  4. API测试

供应商插件任务项超出范围。

依赖项

无。

测试

Tempest 测试

添加tempest测试用例以覆盖mad地址更新。

  • VM mac地址更新验证连接性

  • baremetal网卡更换

功能测试

添加测试用例以更新端口的mac_address,并验证以下内容是否已适当地更新/通知。

  • DHCP代理

  • 安全组规则

  • allowed_address_pairs

API 测试

由于此功能涉及api更改,我们计划添加测试用例以验证端口的mac_address的更新。如果在实施时,neutron API测试包括负面测试用例和policy.json的测试,那么这些测试也将为此功能添加。

文档影响

需要记录现在允许更新未绑定或失败的VM端口的mac_address。

用户文档

以下文档和部分可能需要更新。

  • 云管理员指南

    • 核心网络API功能

  • Neutron/APIv2-specification (Port表)

开发人员文档

无。

参考资料

[1] https://review.openstack.org/112129

[2] https://bugs.launchpad.net/neutron/+bug/1341268

[3] http://lists.openstack.org/pipermail/openstack-dev/2014-November/050329.html

[4] https://blueprints.launchpad.net/neutron/+spec/neutron-ipam