我当前正在尝试设置必须使用IPv6的内部Prometheus监视系统。我的静态配置却无法正常工作:
- targets: ['[fe80::3086:7bff:fed8:f402]:9100']
这失败,并显示错误
获取http://[fe80::3086:7bff:fed8:f402]:9100/metrics:拨打tcp [fe80 :: 3086:7bff:fed8:f402]:9100:connect:无效参数
我尝试使用CURL来查看是否可以连接到运行node-exporter的远程服务器。
这不起作用:curl -g -6 'http://[fe80::3086:7bff:fed8:f402]:9100/metrics'
但这确实可行:curl -g -6 'http://[fe80::3086:7bff:fed8:f402%ens17]:9100/metrics'
这表明我实际上可以连接到服务器,但必须添加将IPv6网络顶部连接到URL的网络接口。老实说,我不知道为什么。
但是现在,相同的URL不能用于普罗米修斯,但仍然存在错误:
- targets: ['[fe80::3086:7bff:fed8:f402%ens17]:9100']
Get http://[fe80::3086:7bff:fed8:f402%25ens17]:9100/metrics: dial tcp [fe80::3086:7bff:fed8:f402%ens17]:9100: connect: invalid argument
答案 0 :(得分:1)
由于使用的是IPv6本地链接地址,因此必须添加区域ID(在您的情况下为%ens17
),以说明接口的含义。每个接口都将具有相同的本地链路网络,因此您必须区分哪个接口,而区域ID会为您做到这一点。
这在几个RFC中都有详细说明。您至少应该熟悉RFC 2732, Format for Literal IPv6 Addresses in URL's,RFC 4007, IPv6 Scoped Address Architecture和RFC 6874, Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers。
不幸的是,似乎并非一切都赶上了这一步,%
通常被用作转义字符。您真正应该做的就是为您的主机分配ULA寻址(fc00::/7
)。将L
的位设置为一个(fd00::/8
,然后选择一个随机的40位全局ID(fdxx:xxxx:xxxx:xxxx::/64
),然后从派生的前缀中为主机分配地址。如果您有多个网络,则可以使用相同的方法为每个网络获取前缀,并且可以在自己的站点内路由ULA寻址(与Link-Local寻址不同)。
RFC 4193, Unique Local IPv6 Unicast Addresses解释了IPv6 ULA寻址。