跳到正文
Træfɪk

Traefik 与 Nomad 服务发现

配置示例

可以按照下面的方式启用 Nomad 提供者:

providers:
  nomad: {}
[providers.nomad]
--providers.nomad=true

为服务附加标签:

...
service {
  name = "myService"
  tags = [
    "traefik.http.routers.my-router.rule=Host(`example.com`)",
  ]
}
...

配置选项

字段 说明 默认值 必填
providers.providersThrottleDuration 配置重新加载后,在处理新的配置刷新事件之前至少等待的时间。
如果这段时间内发生多个事件,只处理最近的一个,其他事件全部丢弃。
此选项不能按提供者分别设置,但节流算法会独立应用于每个提供者。
2s 否
providers.nomad.namespaces 定义在哪些命名空间中发现 Nomad 服务。 "" 否
providers.nomad.refreshInterval 定义轮询间隔。启用 watch 选项时忽略此选项。 15s 否
providers.nomad.watch 启用监视模式,根据每个事件刷新配置。 false 否
providers.nomad.throttleDuration 定义提供者处理来自 Nomad 的服务事件的频率。此选项仅在启用 watch 选项时可用。 0s 否
providers.nomad.defaultRule 所有服务的默认 Host 规则。更多信息请参阅此处。 "Host(`{{ normalize .Name }}`)" 否
providers.nomad.constraints 定义一个表达式,Traefik 将用它匹配容器标签,以确定是否为该容器创建路由。更多信息请参阅此处。 "" 否
providers.nomad.exposedByDefault 默认在 Traefik 中暴露 Nomad 服务。如果设置为 false,最终路由配置会忽略没有 traefik.enable=true 标签的服务。更多信息请参阅此处。 true 否
providers.nomad.allowEmptyServices 指示提供者为 Nomad 服务创建所有已定义的服务器负载均衡器,即使这些服务的实例数缩减为零。 false 否
providers.nomad.prefix 定义用于声明 Traefik 标签的 Nomad 服务标签前缀。 traefik 否
providers.nomad.stale 指示 Traefik 对 Nomad 服务 API 的读取使用弱一致性。更多信息请参阅此处。 false 否
providers.nomad.endpoint.address 定义 Nomad 服务器的地址。 http://127.0.0.1:4646 否
providers.nomad.endpoint.region 定义使用的 Nomad 区域。如果未提供,则使用本地代理的区域。 "" 否
providers.nomad.endpoint.token 如果启用了 Nomad ACL,定义每个请求使用的 ACL 令牌。更多信息请参阅此处。 "" 否
providers.nomad.endpoint.endpointWaitTime 定义 watch 可以阻塞的持续时间。如果未提供,将使用代理的默认值。 "" 否
providers.nomad.endpoint.tls 定义与 Nomad API 安全连接时使用的 TLS 配置。 - 否
providers.nomad.endpoint.tls.ca 定义与 Nomad API 安全连接时使用的证书颁发机构证书路径,默认使用系统证书包。 "" 否
providers.nomad.endpoint.tls.cert 定义与 Nomad API 安全连接时使用的公钥证书路径。使用此选项时,必须设置 key 选项。 '" 是
providers.nomad.endpoint.tls.key 定义与 Nomad API 安全连接时使用的私钥路径。使用此选项时,必须设置 cert 选项。 "" 是
providers.nomad.endpoint.tls.insecureSkipVerify 指示提供者在建立 TLS 连接时接受 Nomad 提供的任何证书,而不考虑证书所涵盖的主机名。 false 否

namespaces

namespaces 选项定义在哪些命名空间中发现 Nomad 服务。 使用 namespaces 选项时,发现的对象名称会添加如下后缀:

<resource-name>@nomad-<namespace>

警告

namespaces 选项与 namespace 选项只能选择其中一个进行定义。

providers:
  nomad:
    namespaces:
      - "ns1"
      - "ns2"
    # ...
[providers.nomad]
  namespaces = ["ns1", "ns2"]
  # ...
--providers.nomad.namespaces=ns1,ns2
# ...

stale

对 Nomad 服务 API 的读取使用弱一致性。

这能使读取非常快速且易于扩展,代价是更有可能读取到过期的值。

更多信息请参阅 Nomad 的一致性文档。

providers:
  nomad:
    stale: true
    # ...
[providers.nomad]
  stale = true
  # ...
--providers.nomad.stale=true
# ...

token

如果启用了 Nomad ACL,Token 用于为每个请求提供 ACL 令牌。 此令牌适合使用的 ACL 权限是 'read-job',具体说明见 Nomad ACL 文档。

providers:
  nomad:
    endpoint:
      token: test
    # ...
[providers.nomad]
  [providers.nomad.endpoint]
    token = "test"
    # ...
--providers.nomad.endpoint.token=test
# ...

defaultRule

所有服务的默认主机规则。

对于某个服务,如果没有通过标签定义路由规则,就使用此 defaultRule 定义规则。 defaultRule 必须设置为有效的 Go 模板, 并且可以包含 sprig 模板函数。 可以通过 Name 标识符访问服务名称, 模板还可以访问此服务上定义的所有标签(即以 prefix 开头的标签)。

可以使用 traefik.http.routers.{name-of-your-choice}.rule 标签为单个实例覆盖此选项。

providers:
  nomad:
    defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
    # ...
[providers.nomad]
  defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
  # ...
--providers.nomad.defaultRule='Host(`{{ .Name }}.{{ index .Labels "customLabel"}}`)'
# ...
默认规则与 Traefik 服务

暴露 Traefik 容器时,如果同时使用默认规则机制, 可能会创建一个指向自身的路由器,形成循环。 在这种情况下,为防止无限循环, Traefik 会添加一个内部中间件,拒绝来自同一路由器的请求。

constraints

constraints 选项可以设置为一个表达式,Traefik 将用它匹配服务标签, 以确定是否为该服务创建路由。如果没有任何服务标签匹配该表达式, 就不会为该服务创建路由。如果表达式为空,则包含所有发现的服务。

表达式语法基于 Tag(`tag`) 和 TagRegex(`tag`) 函数, 并支持常规布尔逻辑,如下例所示。

约束键的限制

请注意,traefik.* 是保留给配置使用的标签命名空间,不能用作自定义约束的键。

约束表达式示例
# Includes only services having the tag `a.tag.name=foo`
constraints = "Tag(`a.tag.name=foo`)"
# Excludes services having any tag `a.tag.name=foo`
constraints = "!Tag(`a.tag.name=foo`)"
# With logical AND.
constraints = "Tag(`a.tag.name`) && Tag(`another.tag.name`)"
# With logical OR.
constraints = "Tag(`a.tag.name`) || Tag(`another.tag.name`)"
# With logical AND and OR, with precedence set by parentheses.
constraints = "Tag(`a.tag.name`) && (Tag(`another.tag.name`) || Tag(`yet.another.tag.name`))"
# Includes only services having a tag matching the `a\.tag\.t.+` regular expression.
constraints = "TagRegex(`a\.tag\.t.+`)"
providers:
  nomad:
    constraints: "Tag(`a.tag.name`)"
    # ...
[providers.nomad]
  constraints = "Tag(`a.tag.name`)"
  # ...
--providers.nomad.constraints="Tag(`a.tag.name`)"
# ...

更多信息请参阅限制服务发现的范围。

路由配置

请参阅路由中的专门章节。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证