跳到正文
Træfɪk

概述

_提供者_是基础设施组件,可以是编排器、容器引擎、云提供商或键值存储。 其原理是 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 服务发现的范围, 也就是禁止为部分容器创建路由, 可以使用以下两种方式:

  1. 对于 Consul Catalog、 Docker、 ECS、 Nomad 和 Swarm 提供者,可以将 exposedByDefault 设置为 false,并为需要暴露的容器添加 traefik.enable=true 标签。

  2. 使用基于标签选择器或约束的更精细机制。

以下提供者支持约束

以下提供者支持标签选择器

提供者优先顺序

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 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


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

文档由 HeadFile Studio 翻译。

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