Traefik 与 Consul Catalog¶
配置示例¶
可以按照下面的方式启用 Consul Catalog 提供者:
providers:
consulCatalog: {}[providers.consulCatalog]--providers.consulcatalog=true为服务附加标签:
- traefik.http.routers.my-router.rule=Host(`example.com`)
配置选项¶
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
providers.providersThrottleDuration |
配置重新加载后,在处理新的配置刷新事件之前至少等待的时间。 如果这段时间内发生多个事件,只处理最近的一个,其他事件全部丢弃。 此选项不能按提供者分别设置,但节流算法会独立应用于每个提供者。 |
2s | 否 |
providers.consulCatalog.refreshInterval |
定义轮询间隔。 | 15s | 否 |
providers.consulCatalog.prefix |
定义用于声明 Traefik 标签的 Consul Catalog 标签前缀。 | traefik | 否 |
providers.consulCatalog.requireConsistent |
强制读取保持完全一致。更多信息请参阅此处。 | false | 否 |
providers.consulCatalog.exposedByDefault |
默认通过 Traefik 暴露 Consul Catalog 服务。如果设置为 false,最终路由配置会忽略没有 traefik.enable=true 标签的服务。更多信息请参阅此处。 |
true | 否 |
providers.consulCatalog.defaultRule |
所有服务的默认 Host 规则。更多信息请参阅此处。 | "Host(`{{ normalize .Name }}`)" |
否 |
providers.consulCatalog.connectAware |
启用 Consul Connect 支持。如果设置为 true,Traefik 将能够与 Connect 服务通信。 |
false | 否 |
providers.consulCatalog.connectByDefault |
默认认为每个服务都支持 Connect。如果设置为 true,Traefik 默认会将每个 Consul Catalog 服务视为支持 Connect 的服务。可以通过 traefik.consulcatalog.connect 标签为单个实例覆盖此选项。 | false | 否 |
providers.consulCatalog.serviceName |
定义 Traefik 服务在 Consul Catalog 中的名称。 | "traefik" | 否 |
providers.consulCatalog.constraints |
定义一个表达式,Traefik 将用它匹配容器标签,以确定是否为该容器创建路由。更多信息请参阅此处。 | "" | 否 |
providers.consulCatalog.namespaces |
定义要查询的命名空间。更多信息请参阅此处。 | "" | 否 |
providers.consulCatalog.stale |
指示 Traefik 对目录的读取使用弱一致性。 | false | 否 |
providers.consulCatalog.cache |
指示 Traefik 对目录的读取使用本地代理缓存。 | false | 否 |
providers.consulCatalog.endpoint |
定义 Consul 服务器端点。 | - | 否 |
providers.consulCatalog.endpoint.address |
定义 Consul 服务器的地址。 | 127.0.0.1:8500 | 否 |
providers.consulCatalog.endpoint.scheme |
定义 Consul 服务器的 URI 协议方案。 | "" | 否 |
providers.consulCatalog.endpoint.datacenter |
定义要使用的数据中心。如果未在 Traefik 中提供,Consul 将使用代理的默认数据中心。 | "" | 否 |
providers.consulCatalog.endpoint.token |
定义每个请求使用的 ACL 令牌,它会覆盖代理的默认令牌。 | "" | 否 |
providers.consulCatalog.endpoint.endpointWaitTime |
定义 watch 可以阻塞的持续时间。如果未提供,将使用代理的默认值。 |
"" | 否 |
providers.consulCatalog.endpoint.httpAuth |
定义 HTTP 客户端使用 HTTP 基本认证时的认证设置。 | N/A | 否 |
providers.consulCatalog.endpoint.httpAuth.username |
定义 HTTP 基本认证使用的用户名。 | "" | 否 |
providers.consulCatalog.endpoint.httpAuth.password |
定义 HTTP 基本认证使用的密码。 | "" | 否 |
providers.consulCatalog.strictChecks |
定义允许接收流量的 Consul 服务健康检查状态。 | ["passing", "warning"] | 否 |
providers.consulCatalog.endpoint.tls.ca |
定义与 Consul Catalog 安全连接时使用的证书颁发机构证书路径,默认使用系统证书包。 | "" | 否 |
providers.consulCatalog.endpoint.tls.cert |
定义与 Consul Catalog 安全连接时使用的公钥证书路径。使用此选项时,必须设置 key 选项。 |
"" | 是 |
providers.consulCatalog.endpoint.tls.key |
定义与 Consul Catalog 安全连接时使用的私钥路径。使用此选项时,必须设置 cert 选项。 |
"" | 是 |
providers.consulCatalog.endpoint.tls.insecureSkipVerify |
指示提供者在建立 TLS 连接时接受 Consul Catalog 提供的任何证书,而不考虑证书所涵盖的主机名。 | false | 否 |
providers.consulCatalog.watch |
设置为 true 时,监视 Consul 的变化(Consul 监视检查)。 |
false | 否 |
requireConsistent¶
强制读取保持完全一致。设置此选项需要额外的往返通信,开销可能较高,但可以确保不会读取过期数据。
更多信息请参阅 Consul 的一致性文档。
defaultRule¶
所有服务的默认主机规则。
对于某个服务,如果没有通过标签定义路由规则,就使用此 defaultRule 定义规则。
defaultRule 必须设置为有效的 Go 模板,
并且可以包含 sprig 模板函数。
可以通过 Name 标识符访问服务名称,
模板还可以访问此服务上定义的所有标签(即以 prefix 开头的标签)。
可以使用 traefik.http.routers.{name-of-your-choice}.rule 标签为单个实例覆盖此选项。
providers:
consulCatalog:
defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
# ...[providers.consulCatalog]
defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
# ...--providers.consulcatalog.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:
consulCatalog:
constraints: "Tag(`a.tag.name`)"
# ...[providers.consulCatalog]
constraints = "Tag(`a.tag.name`)"
# ...--providers.consulcatalog.constraints="Tag(`a.tag.name`)"
# ...更多信息请参阅限制服务发现的范围。
namespaces¶
namespaces 选项定义在哪些命名空间中发现 Consul Catalog 服务。
使用 namespaces 选项时,发现的配置对象名称会添加如下后缀:
<resource-name>@consulcatalog-<namespace>
警告
-
namespaces 选项仅适用于 Consul Enterprise, 后者提供 Namespaces 功能。
-
namespaces选项与namespace选项只能选择其中一个进行定义。
providers:
consulCatalog:
namespaces:
- "ns1"
- "ns2"
# ...[providers.consulCatalog]
namespaces = ["ns1", "ns2"]
# ...--providers.consulcatalog.namespaces=ns1,ns2
# ...路由配置¶
请参阅路由中的专门章节。