markdown 开源的反向代理与负载均衡工具Traefik

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 开源的反向代理与负载均衡工具Traefik相关的知识,希望对你有一定的参考价值。

## 关于Traefik
[Traefik](https://traefik.io/) 是一个开源的反向代理与负载均衡工具,其设计非常适合现代微服务模式。

除了传统的反向代理、loadblance功能,Traefik功能还包括:
* 非停机更新配置
* HTTPS支持
* 线路中断、重试(Circuit breakers, retry)
* 一个漂亮的WebUI
* High Availability
* metrics,log,Rest API
* 服务发现

**服务发现** 是使Traefik显著区别于其他反向代理工具的一点,目前支持:
* Docker / Swarm mode
* Kubernetes
* Mesos / Marathon
* Rancher (API, Metadata)
* Azure Service Fabric
* Consul Catalog
* Consul / Etcd / Zookeeper / BoltDB
* Eureka
* Amazon ECS
* Amazon DynamoDB
* File
* Rest


## 反向代理
与Nginx类似,Traefik反向代理的实现主要包含三个部分:
* Entrypoints
* Frontends
* Backends

**Entrypoints** 即入口可包括 HTTP(80) HTTPS(443) SSL 或者 redirection

**Frontend** 中定义一系列rules用来判断一个request应如何从entrypoint 发向 backend。
Frontends则包括两种 Modifiers 和 Matchers
* Modifiers 只修改request不对路由产生影响
* Matchers 通过匹配判断一个request应该发向何处。
    * 规则可以根据 Headers/Host/Method/Path/QueryParameters 等
    * 匹配逻辑可以是ALL(以;分隔)和 ANY (以,分隔)

**Backends** 代表了一个或一组HTTP Servers,并可以设置复杂的Load-Balancing配置,包括:
* Load-balancing
* Circuit breakers
* Maximum connections
* Sticky sessions
* Health Check

一个Backend一般在业务上代表了一个服务,而其组成可能是多个微服务

### 配置
Traefik的基本配置(Entrypoints/logs/accessLog/API/backendSock...)可以使用单一的toml配置文件来完成。
```
./traefik -c traefik.toml
```
示例文件[traefik.sample.toml](https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml)

而路由规则则相当灵活,可以有多种配置方式。包括[file](https://docs.traefik.io/configuration/backends/file/)、[API](https://docs.traefik.io/configuration/api/)、动态发现等。
## 以Docker为例的反向代理
### 启动Traefik
首先我们需要启动Traefik并且配置其启用Docker Backend  
docker-compose.yml如下:
```yml
services:
  reverse-proxy:
    image: traefik # The official Traefik docker image
    command: --docker # Enables the web UI and tells Træfik to listen to docker
    ports:
      - "80:80"     # The HTTP port
      - "8080:8080" # The Web UI (enabled by --api)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
```
我们看到需要挂载/var/run/docker.sock 并提供 `--docker` command来启用这个功能。这样Traefik就可以发现并路由本机的docker containers了。
启动reverse-proxy 
```
docker-compose up -d reverse-proxy
```
此时我们可以访问 localhost:8080 来查看Traefik UI, 80端口则留作反向代理。

### 启动一个示例Container
我们使用官网案例中的image emilevauge/whoami 这是一个简单的http server访问其80端口会显示一些基本信息。在docker-compose.yml中添加whoami
```yml
whoami:
  image: emilevauge/whoami
```
并启动```docker-compose up -d whoami```  
此时打开Traefik页面就可以看到里面多了一个Backend
```
[backend-whoami-traefik]
  Server: http://172.29.0.2:80
  Weight: 1
```
以及一个指向这个backend的Frontend
```
[frontend-Host-whoami-traefik-0]
Route Rule: [Host:whoami.traefik.]
Entry Points: http
Backend: backend-whoami-traefik
```
**这意味着Traefik已经生效了!**  
我们可以curl Traefik GateWay并提供Host就可以看到容器的response
```
curl -H Host:whoami.traefik. http://127.0.0.
>
Hostname: a1eab6e446fd
IP: 127.0.0.1
IP: 172.29.0.2
GET / HTTP/1.1
Host: whoami.traefik.
User-Agent: curl/7.54.0
...
```
当然因为DNS找不到 whoami.traefik. 如需直接访问我们可以将 `127.0.0.1 whoami.traefik.`加入host然后访问测试。  
值得注意的是,即使whoami使用的也是80端口,然而这里并没有冲突,原因是我们仅Expose 80并没有将端口映射到Host Network。


### 自定义 Traefik frontend.rule
显然,虽然Traefik直接发现非常方便,但我们肯定希望可以控制Routing。对docker来说,这个实现起来非常方便,我们只需要在Container启动的时候添加相应labels即可override相应配置。详见[backends/docker](https://docs.traefik.io/configuration/backends/docker/)

修改docker-compose.yml
```
whoami:
  image: emilevauge/whoami # A container that exposes an API to show its IP address
  labels:
    - "traefik.frontend.rule=Host:whoami.docker.localhost"
```
重新启动whoami,此时我们不需修改host就可以直接访问`whoami.docker.localhost`了。

### 使用 docker.domain
我们还可以在Traefik启动时添加 --docker.domain=docker.localhost 命令来直接设定default domain。
然后即可以通过 `{containerName}.{configuredDomain}` 或 `{service}.{composeName}.{configuredDomain}` 来访问container。

以上是关于markdown 开源的反向代理与负载均衡工具Traefik的主要内容,如果未能解决你的问题,请参考以下文章

Nginx负载均衡与反向代理——扩展功能(NGINX Plus)

使用nginx反向代理负载均衡做免费稳定的markdown图床

Nginx详解(正向代理反向代理负载均衡原理)

集群和负载均衡的区别 nginx

Linux服务:Nginx反向代理与负载均衡

反向代理与负载均衡