跳转至

概述

请求发生了什么?

让我们来放大下 Traefik 的架构,来分析下路由被创建的相关组件。

首先,当启动 Traefik 时,需要定义 entrypoints。然后,根据连接到这些 entrypoints 的 路由 来分析传入的请求,来查看他们是否与一组 规则 相匹配,如果匹配,则路由可能会将请求通过一系列 中间件 转换过后再转发到你的 服务 上去。

Architecture

明确责任

  • Providers 来发现基础设施上存在的服务(它们的 IP、运行状况等...)
  • Entrypoints 监听传入的流量(端口等...)
  • Routers 分析请求(host, path, headers, SSL, ...)
  • Services 将请求转发到你的服务(load balancing, ...)
  • Middlewares 中间件,用来修改请求或者根据请求来做出一些判断 (authentication, rate limiting, headers, ...)

File Provider 示例

下面是一个 file provider 的完整配置文件示例,该配置文件将 http://domain/whoami/ 的请求转发到一个可访问的服务 http://private/whoami-service/ 上。

在该过程中,Traefik 会使用中间件来对用户进行身份验证(使用 BasicAuth 中间件)。

静态配置如下:

[entryPoints]
  [entryPoints.web]
    # 在8081端口上监听传入的请求
    address = ":8081"

[providers]
  # 开启 file provider,可以在一个文件夹中来定义 路由/中间件/服务
  [providers.file]
    filename = "dynamic_conf.toml"
entryPoints:
  web:
    address: :8081

providers:
  file:
    filename: dynamic_conf.yml
--entryPoints.web.address=:8081

--providers.file.filename=dynamic_conf.toml

动态配置如下所示:

# http 路由部分
[http]
  [http.routers]
     # 定义请求和服务之间的连接
     [http.routers.to-whoami]
      rule = "Host(`domain`) && PathPrefix(`/whoami/`)"
      # 如果匹配上面的规则,则使用下面的中间件
      middlewares = ["test-user"]
      # 如果经过中间件过后仍然OK,则转发请求到下面定义的 whoami 服务。
      service = "whoami"

  [http.middlewares]
    # 定义一个认证机制=
    [http.middlewares.test-user.basicAuth]
      users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"]

  [http.services]
    # 定义在我们的环境中如何获得现有的服务
    [http.services.whoami.loadBalancer]
      [[http.services.whoami.loadBalancer.servers]]
        url = "http://private/whoami-service"
http:
  routers:
    to-whoami:
      rule: "Host(`domain`) && PathPrefix(`/whoami/`)"
      middlewares:
      - test-user
      service: whoami

  middlewares:
    test-user:
      basicAuth:
        users:
        - test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/

  services:
    whoami:
      loadBalancer:
        servers:
        - url: http://private/whoami-service

在该示例中,我们使用 file provider,即使这是配置 Traefik 最普通的一种方法,但是也明确描述了每个可用的概念。

HTTP / TCP

在该示例中,我们仅仅为 http 请求定义了路由规则,此外 Traefik 还支持 TCP 请求。我们可以添加 TCP 路由TCP 服务,然后在 TCP 部分进行声明,如下所示。

在 whoami.traefik.io 上面为 TCL 请求添加一个 TCP 路由

静态配置

[entryPoints]
  [entryPoints.web]
    # 在8081端口上监听传入请求
    address = ":8081"

[providers]
  # 开启 file provider,可以在一个文件夹中来定义 路由/中间件/服务
  [providers.file]
    filename = "dynamic_conf.toml"
entryPoints:
  web:
    address: :8081
providers:
  file:
    filename: dynamic_conf.yml
--entryPoints.web.address=":8081"

--providers.file.filename=dynamic_conf.toml

动态配置

# http 路由部分
[http]
  [http.routers]
    # 定义请求和服务之间的连接
    [http.routers.to-whoami]
      rule = "Host(`domain`) && PathPrefix(`/whoami/`)"
      # 如果匹配上面的规则,则使用下面的中间件
      middlewares = ["test-user"]
      # 如果经过中间件过后仍然OK,则转发请求到下面定义的 whoami 服务。
      service = "whoami"

  [http.middlewares]
     # 定义一个认证机制
     [http.middlewares.test-user.basicAuth]
       users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"]

  [http.services]
     # 定义在我们的环境中如何获得现有的服务
     [http.services.whoami.loadBalancer]
       [[http.services.whoami.loadBalancer.servers]]
         url = "http://private/whoami-service"

[tcp]
  [tcp.routers]
    [tcp.routers.to-whoami-tcp]
      rule = "HostSNI(`whoami-tcp.traefik.io`)"
      service = "whoami-tcp"
      [tcp.routers.to-whoami-tcp.tls]

  [tcp.services]
    [tcp.services.whoami-tcp.loadBalancer]
      [[tcp.services.whoami-tcp.loadBalancer.servers]]
        address = "xx.xx.xx.xx:xx"
http:

  routers:
    to-whoami:
      rule: Host(`domain`) && PathPrefix(`/whoami/`)
      middlewares:
      - test-user
      service: whoami

  middlewares:
    test-user:
      basicAuth:
        users:
        - test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/

  services:
    whoami:
      loadBalancer:
        servers:
        - url: http://private/whoami-service
tcp:

  routers:
    to-whoami-tcp:
      service: whoami-tcp
      rule: HostSNI(`whoami-tcp.traefik.io`)

  services:
    whoami-tcp:
      loadBalancer:
        servers:
        - address: xx.xx.xx.xx:xx