02 配置发现

images

Traefik 的配置发现是通过提供者实现的。

提供者是现有的基础设施组件,无论是协调器、容器引擎、云供应商还是键值存储。 整体思路是 Traefik 将查询提供者的 API,以找到有关路由的相关信息,每次 Traefik 检测到一个变化,它动态更新路由。

部署然后忘记是 Traefik 的信条。

0.1. 协调器

即使每个提供者是不同的,也可以将它们分为四组:

  1. 基于标签(每个部署的容器都有一组标签附加到它上面)
  2. 基于键值(每个部署的容器用相关信息更新一个键值存储)
  3. 基于注释(一个单独的对象,带有注释,定义容器的特征)
  4. 基于文件(一个很好的旧的配置文件)

0.2. 支持的提供者

以下是 Traefik 目前支持的提供者名单。

ProviderTypeConfiguration Type
DockerOrchestratorLable
KubernetesOrchestratorCustom Resource
MarathonOrchestratorLabel
RancherOrchestratorlabel
FileManualTOML/YAML format

当前版本的 Traefik 并不支持所有的提供者。 有关更多提供者,请参阅以前的版本(v1.7)。

0.2.1. 配置重载频率

在某些情况下,一些提供者可能会突然发生大量的更改,这将产生大量的配置更改事件。 如果 Traefik 将它们都考虑在内,那么将触发更多的配置重载,而不是必需的,甚至不是有用的。

为了减轻这种情况,可以设置 providers.providersThrottleDuration 选项。 这是 Traefik 在重新加载配置之后,在考虑任何新的配置刷新事件之前等待的持续时间。 如果任何事件在此期间到达,则只考虑最近的事件,并删除所有以前的事件。

不能为每个提供者设置此选项,但节流算法独立应用于每个提供者。 默认为2秒。

providers:
  providersThrottleDuration: 10s

0.3. 限制服务发现的范围

默认情况下,Traefik 将为所有检测到的容器创建路由。

如果你想限制 Traefik 的服务发现范围,比如不允许为某些容器创建路由,可以通过两种不同的方式来实现:

  1. 要么使用通用配置选项 exposedByDefault
  2. 要么使用基于约束的更细粒度机制

0.3.1. exposedByDefault 和 traefik.enable

支持此特性的提供者:

  • Docker
  • Rancher
  • Marathon

0.3.2. 约束条件

支持此特性的提供者:

  • Docker
  • Rancher
  • Marathon
  • Kubernetes CRD
  • Kubernetes Ingress

0.4. Kubernetes IngressRoute

Traefik 过去只通过 Kubernetes Ingress 提供者支持 Kubernetes,严格意义上就是 Kubernetes Ingress 控制器。

然而,由于社区表示需要从 Traefik 特性中获益,而不需要求助于(大量)注释,我们最终为 IngressRoute 类型编写了一个自定义资源定义(下文中的别名 CRD) ,以便提供更好的方式来配置对 Kubernetes 集群的访问。

0.4.1. 资源配置

请参阅路由中的专用部分。

0.4.2. 提供者配置

0.4.2.1. endpoint

可选,默认为empty

providers:
  kubernetesCRD:
    endpoint = "http://localhost:8080"
    # ...

Kubernetes服务的端点作为 URL。

部署到 Kubernetes 后,Traefik 将读取环境变量 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORTKUBECONFIG 来构造端点。

访问令牌将在 /var/run/secrets/kubernetes.io/serviceaccount/token 中查找,SSL CA 证书将在 /var/run/secrets/kubernetes.io/serviceaccount/CA 中查找。在部署到kubernetes集群中时,两者都会自动挂载。

可以指定端点来重写群集内的环境变量值。

当找不到环境变量时,Traefik 将尝试使用集群外的客户端连接到 Kubernetes API 服务器。 在这种情况下,端点是必须的。 具体来说,可以将它设置为 kubectl proxy 使用的 URL,以使用授予的相关 kubeconfig 的身份验证和授权连接到 Kubernetes 集群。

0.4.2.2. token

可选,默认为empty

providers:
  kubernetesCRD:
    token = "mytoken"
    # ...

用于 Kubernetes 客户端配置的承载令牌。

0.4.2.3. certAuthFilePath

可选,默认为empty

providers:
  kubernetesCRD:
    certAuthFilePath: "/my/ca.crt"
    # ...

证书颁发机构文件的路径。用于 Kubernetes 客户端配置。

0.4.2.4. namespaces

可选,默认为all namespaces(一个空的数组)

providers:
  kubernetesCRD:
    namespaces:
    - "default"
    - "production"
    # ...

要监视的namespace数组。

0.4.2.5. labelselector

可选,默认为empty(处理所有的Ingresses)

providers:
  kubernetesCRD:
    labelselector: "A and not B"
    # ...

默认情况下,Traefik 处理已配置namespace中的所有Ingress对象。 可以定义一个标签选择器,以便只对特定的Ingress对象进行筛选。

0.4.2.6. ingressClass

可选,默认为empty

providers:
  kubernetesCRD:
    ingressClass: "traefik-internal"
    # ...

标识要处理的Ingress对象的 kubernetes.io/Ingress.class 注释值。

如果参数是非空的,则只处理包含具有相同值的注释的Ingress。 否则,将处理没有注释、具有空值或值为traefik的Ingress。

0.4.2.7. throttleDuration

可选,默认为0(不节流)

providers:
  kubernetesCRD:
    throttleDuration: "10s"
    # ...
上次修改: 13 April 2020