Skip to content

Instantly share code, notes, and snippets.

@kehao95
Last active June 20, 2023 08:13
Show Gist options
  • Save kehao95/25fb9db1c0b373073208c6a1907e5667 to your computer and use it in GitHub Desktop.
Save kehao95/25fb9db1c0b373073208c6a1907e5667 to your computer and use it in GitHub Desktop.
开源的反向代理与负载均衡工具Traefik

以Docker为例的反向代理

启动Traefik

首先我们需要启动Traefik并且配置其启用Docker Backend
docker-compose.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

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

修改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。

关于Traefik

Traefik 是一个开源的反向代理与负载均衡工具,其设计非常适合现代微服务模式。

除了传统的反向代理、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

而路由规则则相当灵活,可以有多种配置方式。包括fileAPI、动态发现等。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment