【问题标题】:Prometheus IPv6 fails with "connect: invalid argument"Prometheus IPv6 因“连接:无效参数”而失败
【发布时间】:2019-08-19 09:07:35
【问题描述】:

我目前正在尝试设置必须使用 IPv6 的内部 Prometheus 监控系统。我的静态配置不起作用:

- targets: ['[fe80::3086:7bff:fed8:f402]:9100']

这会失败并出现错误

Get http://[fe80::3086:7bff:fed8:f402]:9100/metrics: dial tcp [fe80::3086:7bff:fed8:f402]:9100: connect: invalid argument


我尝试使用 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对prometheus不起作用,还是报错:

- 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

【问题讨论】:

    标签: ipv6 prometheus prometheus-node-exporter


    【解决方案1】:

    由于您使用的是 IPv6 链路本地寻址,因此您必须添加区域 ID(在您的情况下为 %ens17)以说明所指的接口。每个接口都将具有相同的 Link-Local 网络,因此您必须区分哪个接口,并且区域 ID 会为您做到这一点。

    这在几个 RFC 中有详细说明。你至少应该熟悉RFC 2732, Format for Literal IPv6 Addresses in URL'sRFC 4007, IPv6 Scoped Address ArchitectureRFC 6874, Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers


    不幸的是,似乎并非所有东西都跟上了这一点,% 经常被用作转义字符。您真正应该做的是为您的主机分配 ULA 寻址 (fc00::/7)。将 L 位设置为 1 (fd00::/8),然后选择一个随机的 40 位全局 ID (fdxx:xxxx:xxxx:xxxx::/64),并根据您派生的前缀为您的主机分配地址。如果您有多个网络,您可以使用相同的方法为每个网络获取一个前缀,并且您可以在自己的站点内路由 ULA 寻址(与 Link-Local 寻址不同)。

    RFC 4193, Unique Local IPv6 Unicast Addresses 解释 IPv6 ULA 寻址。

    【讨论】:

    • 嗯,谢谢。我可能需要一段时间来测试一下。这比我想的要复杂得多:/
    • 其实并没有那么复杂,只是思路与 IPv4 不同而已。使用 IPv4,您真的不会尝试使用链路本地寻址,您可能会使用私有寻址。私有寻址的一个问题是它在多个网络上使用,因此它使公司之间的连接或合并变得非常复杂。 IPv6 ULA 通过使用 40 位随机全局 ID 使您自己的地址很有可能是唯一的,从而解决了这个问题。
    猜你喜欢
    • 2021-09-22
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多