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`)"
# ...更多信息请参阅限制服务发现的范围。
路由配置¶
请参阅路由中的专门章节。