traefik 简介

traefik(https://traefik.io/) 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持 Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API 等等后端模型。

traefik 的具体模型如下:
traefik

为什么选择 traefik?

事实上在之前我对 LB 的选择一直更倾向于使用 HAProxy。但是选择 traefik 主要是有以下特点让我们决定使用:

  • Golang 编写,单文件部署,与系统无关,同时也提供小尺寸 Docker 镜像。
  • 支持 Docker/Etcd 后端,天然连接我们的微服务集群。
  • 内置 Web UI,管理相对方便。
  • 自动配置 ACME(Let’s Encrypt) 证书功能。
  • 性能尚可,我们也没有到压榨 LB 性能的阶段,易用性更重要。

除了这些以外,traefik 还有以下特点:

  • Restful API 支持。
  • 支持后端健康状态检查,根据状态自动配置。
  • 支持动态加载配置文件和 graceful 重启。
  • 支持 WebSocket 和 HTTP/2。

除了上面提到的微服务化集群支持,一些 AB 测试阶段也可以通过 frontend 的路由特性进行动态分配,当然这些对 HAProxy 等软件都是标准支持的。

traefik 的配置

traefik 支持的配置方式支持文件方式进行配置,这个也是比较常见的配置方式,我们这里简单介绍一下。

traefik 支持的 toml 方式进行配置,官方提供了一个 示例的 traefik.toml 文件 用于演示配置。除此之外,后端服务一般是采用单独文件进行存储,比如演示配置中指定的 rules.toml。

具体一个例子,如果我们有两个后端,127.0.0.1:7727,127.0.0.1:7728,我们希望所有的 Chrome 用户都可以访问 127.0.0.1:7727,其它人都访问 127.0.0.1:7728,这样这个 rules.toml 应该如何配置呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# rules.toml
[backends]
[backends.backend1]
[backends.backend1.servers.server1]
url = "http://127.0.0.1:7727"
[backends.backend2]
[backends.backend2.servers.server1]
url = "http://127.0.0.1:7728"


[frontends]
[frontends.frontend1]
entrypoints = ["http"]
backend = "backend1"
[frontends.frontend1.routes.test_1]
rule = "HeadersRegexp: User-Agent, Chrome"
[frontends.frontend2]
entrypoints = ["http"]
backend = "backend2"

首先定义两个后端服务,每个后端服务可以支持多个服务单元,这里我们只有一个。前端 frontends 用于匹配请求落到哪个后端服务中。我们这里定义一个规则 test_1,设置规则为根据 HTTP 请求头部正则进行分配:如果 UserAgent 中包含 Chrome 字样,则访问到 127.0.0.1:7727。匹配的规则方式包含了以下几种方式:

  • Headers/HeaderRegexp: 头部匹配方式,分别对应按值和正则表达式两种方式。
  • Host/HostRegexp: 按照请求主机名进行匹配,与头部信息相似。
  • Method: 按照请求方式区分。
  • Path/PathStrip/PathPrefix/PathPrefixStrip: 按照路径区分后端。

traefik 与微服务集群

这个有人已经写过相关的文章了,我在这里简单推荐一下: Microservices Bliss with Docker and Traefik中文译文)。我就不做额外的描述了。