在 traefik.toml 与容器 arg 中定义 traefik labelselector 的问题

Issue defining traefik labelselector in traefik.toml vs. container arg

我有一个 traefik.toml 文件定义为我的 traefik configmap 的一部分。下面的代码片段是定义了标签选择器的 kubernetes 端点配置:

[kubernetes]
  labelselector = "expose=internal"

当我检查此配置中的 traefik 状态页面时,我看到列出了所有入口,而不仅仅是标签为 "expose: internal" 已定义的入口。

如果我将 kubernetes.labelselector 设置为我的部署的容器参数,但是,只有具有匹配标签的入口会按预期显示在 traefik 状态页面上:

- --kubernetes.labelselector=expose=internal

根据 Kubernetes Ingress Backend documentation, any label selector format valid in the label selector section of the Labels and Selectors 应该在 traefik.toml 文件中有效。我已经尝试了相等 baed(如上所示)和基于集合(以确定 "expose" 标签是否存在,仅),两者都没有在 toml 中工作。基于集合的方法似乎在容器参数中不起作用,但等式语句可以。

我假设存在一些与我在 traefik.toml 文件中格式化 kubernetes 端点有关的问题。在向 github 报告此问题之前,我希望有人可以澄清文档 and/or 更正我在 toml 文件格式中犯的任何错误。

问题似乎是命令行参数和 toml 选项的混合和匹配。

在阅读了一些错误报告和一些其他杂项之后。文档我意识到我们已经启用了 kubernetes 后端,将 --kubernetes 参数传递给 traefik 容器。我意识到在 toml 中定义 [kubernetes] 也启用了 kubernetes 后端。凭直觉我删除了命令行参数并将完整的 kubernetes 后端配置放在 toml 中,一切都按预期工作。

我不确定这是否是预期的行为,但这种行为似乎表明它的设计方式是在提供重复选项时命令行参数优先于 toml 配置选项。

确实,标志优先于 toml 配置。它记录在这里 http://docs.traefik.io/basics/#static-trfik-configuration :)

正如您已经发现的那样,不通过 --kubernetes 让事情对您有用。原因是这个参数不仅启用了 Kubernetes 提供者,还设置了所有默认值。 As documented,命令行参数优先于配置文件;因此,TOML 文件中指定的任何非默认 Kubernetes 参数都将被 --kubernetes 隐含的默认值覆盖。这是预期的(尽管没有理想记录)行为。

您仍然可以通过省略 --kubernetes 来混合和匹配 Kubernetes(或任何其他提供程序)的命令行和 TOML 配置参数。例如,您可以拥有示例 TOML 文件

[kubernetes]
  labelselector = "expose=internal"

然后像

一样调用 Traefik
./traefik --configfile=config.yaml --kubernetes.namespaces=other

这将导致 Traefik 使用自定义标签选择器 expose=internal 并观察命名空间 other.

submitted a PR 阐明命令行提供程序启用参数与提供程序默认值相关的行为。