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)