Metadata 服务中的 IPv6 支持¶
https://bugs.launchpad.net/neutron/+bug/1460177
为 Metadata 服务添加 IPv6 支持。
问题描述¶
Metadata 服务使用知名 IP 地址 169.254.169.254 作为其端点地址。这在 IPv6 专用环境中不起作用。
169.254.169.254 无法从 IPv6 专用虚拟机 (VM) 访问。可以将 169.254.0.0/16 添加到端口的 allowed_address_pairs 列表中,并使用 IPv6 链路本地地址进行接口配置,但如果不存在启用了 DHCP 的 IPv4 子网,metadata 代理甚至无法启动,并且 IPv6 链路本地地址对 Neutron 来说是未知的,无法用于实例标识。
提议的变更¶
当网络分配给 DHCP 代理或 L3 路由器时,metadata 代理会无条件启动。
metadata 代理监听双栈套接字 (::)。
在 IPv4 的情况下,metadata 代理使用 IP 地址 169.254.169.254,该地址属于 IPv4 链路本地子网 (169.254.0.0/16,根据 [1] 所示)。在 IPv6 的情况下,metadata 代理加入所有可用接口上的 anycast 组 fe80::a9fe:a9fe。fe80::a9fe:a9fe IP 地址是 IPv6 链路本地子网 fe80::/10 中 169.254.169.254 的等效地址,根据 [2] 所示。这样做是有效的,因为它是在路由器或 dhcp 命名空间内运行的。
L3 代理将添加一个防火墙规则,将发送到提议的 anycast IP (fe80::a9fe:a9fe) 的流量重定向到 metadata 代理端口。在 DHCP 代理的情况下,将配置一个新的 IP 地址 (fe80::a9fe:a9fe) 在属于 DHCP 代理的 tap 端口上,就像目前为 IPv4 地址 (169.254.169.254) 所做的那样。
VM 使用地址 fe80::a9fe:a9fe 访问 Metadata 服务。在 VM 内部使用的软件(如 cloud-init)必须意识到这个新的 IPv6 地址。因此,在 Openstack 云中使用的镜像也需要更新。
当 metadata 代理处理请求时,它会收集 VM 的 L2 地址和源接口,并将其传递给 metadata 服务。
Metadata 服务不使用 VM IP,而是使用“VM MAC”和“Gateway MAC”来标识实例。
文档影响¶
由于为 metadata 服务提出的这个新的 IPv6 地址目前尚未被任何其他云提供商使用,我们需要更新我们的文档,以清楚地说明 metadata 服务使用的 IPv6 地址是什么,以及如何在至少最流行的 metadata 消费者(即 cloud-init)中配置它。在 cloud-init 的情况下,可以使用 metadata_urls 配置选项 [3] 设置这个新的 IP 地址。
将来,我们可以更新 cloud-init 代码,使这个 IPv6 地址成为它用于 OpenStack 数据源的默认 IP 地址之一,或者提出一个新的数据源,例如 OpenStackIPv6。
参考资料¶
[1] https://tools.ietf.org/html/rfc3927 [2] https://tools.ietf.org/html/rfc4291 [3] https://github.com/canonical/cloud-init/blob/4f940bd1f76f50f947af533661ba6fafa3e60e59/doc/rtd/topics/datasources/openstack.rst