概述¶
_提供者_是基础设施组件,可以是编排器、容器引擎、云提供商或键值存储。 其原理是 Traefik 查询提供者的 API,找出与路由有关的信息, 一旦检测到变化,就动态更新路由。
提供者类别¶
虽然各个提供者有所不同,但可以将它们归入以下四类:
- 基于标签:每个部署的容器都附带一组标签
- 基于键值:每个部署的容器将相关信息写入键值存储
- 基于注解:由一个带注解的独立对象定义容器的特征
- 基于文件:使用文件定义配置
提供者命名空间¶
在 Traefik 动态配置中声明的某些对象, 例如中间件、服务、TLS 选项或服务器传输配置,都会归属于其提供者的命名空间。 例如,使用 Docker 标签声明的中间件,就位于 Docker 提供者命名空间中。
如果使用多个提供者,并且希望引用在其他提供者中声明的对象
(例如跨提供者引用中间件),则需要在对象名后加上 @
分隔符和提供者名称。
提供者名称列表请参阅下方的支持的提供者表。
<resource-name>@<provider-name>
Kubernetes 命名空间与 Traefik 命名空间
Kubernetes 也有自己的命名空间概念, 因此,跨提供者使用资源时,不要混淆_提供者命名空间_与资源的 Kubernetes 命名空间。
在这种情况下,Traefik 动态配置对象并非定义在 Kubernetes 中, 因而在引用该资源时指定 Kubernetes 命名空间没有意义。
另一方面,如果在 Kubernetes 中将中间件声明为自定义资源,并使用非 CRD 的 Ingress 对象,
则必须在注解中加上中间件所属的 Kubernetes 命名空间,格式为 <middleware-namespace>-<middleware-name>@kubernetescrd。
启用 safeNaming 后,此值变为 <middleware-namespace>_<middleware-name>@kubernetescrd,使用与该提供者生成的其他名称相同的 _ 分隔符。
支持的提供者¶
以下列出了 Traefik 当前支持的提供者。
| 提供者 | 类型 | 配置类型 | 提供者名称 |
|---|---|---|---|
| Docker | 编排器 | 标签 | docker |
| Docker Swarm | 编排器 | 标签 | swarm |
| Kubernetes IngressRoute | 编排器 | 自定义资源 | kubernetescrd |
| Kubernetes Ingress | 编排器 | Ingress | kubernetes |
| Kubernetes Ingress NGINX | 编排器 | Ingress-NGINX | kubernetesIngressNGINX |
| Kubernetes Gateway API | 编排器 | Gateway API 资源 | kubernetesgateway |
| Consul Catalog | 编排器 | 标签 | consulcatalog |
| Nomad | 编排器 | 标签 | nomad |
| ECS | 编排器 | 标签 | ecs |
| File | 手动 | YAML/TOML 格式 | file |
| Consul | KV | KV | consul |
| Etcd | KV | KV | etcd |
| ZooKeeper | KV | KV | zookeeper |
| Redis | KV | KV | redis |
| HTTP | 手动 | JSON/YAML 格式 | http |
更多提供者
当前版本的 Traefik 尚未支持 Traefik v2.11 支持的全部提供者。 有关更多信息,请参阅先前版本(v2.11)。
从其他提供者引用 Traefik 动态配置对象¶
在文件提供者中声明 add-foo-prefix。
http:
middlewares:
add-foo-prefix:
addPrefix:
prefix: "/foo"[http.middlewares]
[http.middlewares.add-foo-prefix.addPrefix]
prefix = "/foo"从其他提供者使用 add-foo-prefix 中间件:
your-container:
image: your-docker-image
labels:
# Attach add-foo-prefix@file middleware (declared in file)
- "traefik.http.routers.my-container.middlewares=add-foo-prefix@file"apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: ingressroutestripprefix
spec:
entryPoints:
- web
routes:
- match: Host(`example.com`)
kind: Rule
services:
- name: whoami
port: 80
middlewares:
- name: add-foo-prefix@file
# namespace: bar
# A namespace specification such as above is ignored
# when the cross-provider syntax is used.apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
namespace: appspace
annotations:
"traefik.ingress.kubernetes.io/router.middlewares": add-foo-prefix@file
spec:限制服务发现的范围¶
默认情况下,Traefik 会为所有发现的容器创建路由。
如果希望限制 Traefik 服务发现的范围, 也就是禁止为部分容器创建路由, 可以使用以下两种方式:
-
对于 Consul Catalog、 Docker、 ECS、 Nomad 和 Swarm 提供者,可以将
exposedByDefault设置为false,并为需要暴露的容器添加traefik.enable=true标签。 -
使用基于标签选择器或约束的更精细机制。
以下提供者支持约束
以下提供者支持标签选择器
提供者优先顺序¶
providers.precedence¶
可选
当来自不同提供者的两个路由器定义了相同的规则,并且数值优先级也相等时,
precedence 选项决定优先采用哪个提供者的路由。
此列表按优先顺序从高到低排列:列在前面的提供者优先于列在后面的提供者。
providers:
precedence:
- kubernetescrd
- kubernetes
- file[providers]
precedence = ["kubernetescrd", "kubernetes", "file"]--providers.precedence=kubernetescrd,kubernetes,file默认优先顺序¶
如果未设置 precedence,Traefik 会使用以下默认顺序(优先顺序从高到低):
| 位置 | 提供者名称 |
|---|---|
| 1 | kubernetesgateway |
| 2 | kubernetescrd |
| 3 | kubernetes |
| 4 | kubernetesingressnginx |
| 5 | swarm |
| 6 | docker |
| 7 | file |
| 8 | redis |
| 9 | knative |
| 10 | consul |
| 11 | consulcatalog |
| 12 | nomad |
| 13 | etcd |
| 14 | ecs |
| 15 | http |
| 16 | zookeeper |
| 17 | rest |
说明
precedence仅作为优先级相等时的裁定规则:只有来自不同提供者的两条路由具有相同数值priority时才会应用它。显式设置的路由器优先级始终优先。- 未出现在
precedence中的提供者,其优先顺序低于列表中的任何提供者。 - 提供者名称不区分大小写。
在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。
为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。