Traefik 入门教程

Traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。
至于使用它的原因则基于以下几点:

  • 无须重启即可更新配置
  • 自动的服务发现与负载均衡
  • 原生兼容各主要集群技术(Kubernetes, Docker, Docker Swarm, AWS, etc)

Traefik 初体验

使用 Docker 提供程序启动 Traefik

创建一个 docker-compose-traefik.yml 文件,
在该文件中将使用 Traefik 官方镜像定义一个 reverse-proxy(反向代理) 服务,
文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3'

services:
reverse-proxy:
# The official v2 Traefik docker image
image: traefik:v2.2
# Enables the web UI and tells Traefik to listen to docker
command: --api.insecure=true --providers.docker
ports:
# The HTTP port
- "80:80"
# The Web UI (enabled by --api.insecure=true)
# 要使用 Traefik 的 Web UI,必须 --api.insecure=true
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
# 指定 docker 的 sock文件位置来让 traefik 获取 docker 的事件
- /var/run/docker.sock:/var/run/docker.sock

如果出现 ERROR: .UnicodeDecodeError:,去掉中文注释,或直接到官网复制

1
2
3
4
5
6
7
8
9
10
$ docker-compose -f docker-compose-traefik.yml up -d reverse-proxy

Creating network "username_default" with the default driver
Pulling reverse-proxy (traefik:v2.2)...
v2.2: Pulling from library/traefik
...
...
Digest: sha256:xxx
Status: Downloaded newer image for traefik:v2.2
Creating username_reverse-proxy_1 ... done
1
2
3
4
5
$ docker-compose -f docker-compose-traefik.yml ps

Name Command State Ports
--------------------------------------------------------------------------------------------------------------
username_reverse-proxy_1 /entrypoint.sh --api.insec ... Up 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp

官方文档建议此时你使用 http://localhost:8080/api/rawdata 查看一下数据。

在另外一台有浏览器的机器上,则可以使用 192.168.86.101:8080 浏览 Traefik 的 控制面板,
使用 192.168.86.101:8080/api/rawdata 浏览 Traefik API 的 原始数据。
备注:192.168.86.101,是我的Docker 的宿主主机IP,请替换成你自己的~

Traefik 将检测新服务并为您创建路由

创建一个 docker-compose-whoami.yml 文件,内容如下:

1
2
3
4
5
6
7
version: '3'

services:
whoami:
image: containous/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
1
2
3
4
5
6
7
8
9
10
$ docker-compose -f docker-compose-whoami.yml up -d whoami

WARNING: Found orphan containers (wxb_reverse-proxy_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Pulling whoami (containous/whoami:)...
latest: Pulling from containous/whoami
...
...
Digest: sha256:xxx
Status: Downloaded newer image for containous/whoami:latest
Creating username_whoami_1 ... done
1
2
3
4
$ docker-compose -f docker-compose-whoami.yml ps
Name Command State Ports
--------------------------------------------
username_whoami_1 /whoami Up 80/tcp

官方文档建议此时你使用 http://localhost:8080/api/rawdata 查看一下数据。
你会发现 Traefik 已自动检测到新容器并更新了自己的配置。

在 Docker 宿主主机中 curl whoami.docker.localhost
官方是:curl -H Host:whoami.docker.localhost http://127.0.0.1

在 Docker 宿主主机外怎么访问呢?
本人的环境是 Windows 安装 VMware,
创建一台 Ubuntu 虚拟主机,在 Ubuntu 虚拟主机中安装 Docker,
在 Windows 的 Hosts 上添加 192.168.86.101 whoami.docker.localhost
然后在 Windows 系统上使用浏览器浏览 whoami.docker.localhost
既然看到了 IIS Windows —— Internet Information Services

问题应该是出现在 whoami.docker.localhostlocalhost

所以将使用 docker-compose-whoami.yml 创造出来的容器 docker rm 删除掉,

此时你使用 http://localhost:8080/api/rawdata 查看一下数据。
你会发现 Traefik 已自动检测到新容器并更新了自己的配置。

然后编辑 docker-compose-whoami.yml 文件的内容为:

1
2
3
4
5
6
7
version: '3'

services:
whoami:
image: containous/whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.traefik.com`)"
1
2
3
$ docker-compose -f docker-compose-whoami.yml up -d whoami

Creating username_whoami_1 ... done

在 Docker 宿主主机中 curl whoami.traefik.com 会报 403 Forbidden
因为 whoami.traefik.com 被 DNS 抢先解析了😂
必须得用 curl -H Host:whoami.traefik.com http://127.0.0.1

在 Windows 系统的 Hosts 文件上添加 192.168.86.101 whoami.traefik.com
然后在 Windows 系统上使用浏览器就能正常浏览 whoami.traefik.com 了~

更多实例?让 Traefik 负载平衡它们

1
2
3
4
$ docker-compose -f docker-compose-whoami.yml up -d --scale whoami=2

Starting username_whoami_1 ... done
Creating username_whoami_2 ... done
1
2
3
4
5
6
$ docker-compose -f docker-compose-whoami.yml ps

Name Command State Ports
--------------------------------------------
username_whoami_1 /whoami Up 80/tcp
username_whoami_2 /whoami Up 80/tcp

官方文档建议此时你使用 http://localhost:8080/api/rawdata 查看一下数据。
你会发现 Traefik 已自动检测到新容器并更新了自己的配置。
原因是因为自动更新配置是 Traefik 的卖点,也是下一节要讲解的内容。

多次在 Docker 宿主主机中 curl whoami.traefik.com
你会发现自动负载到两个不同的实例上去了~

traefik

TRAEfik IS THE ONLY ACCESSIBLE CONTAINER FROM THE OUTSIDE
TRAEfik 是唯一可以从外部访问的容器

OTHER SERVICES ARE DEPLOYED ON DEMAND AND AVAILABLE THROUGH TRAEfik
其它服务按需部署,并通过 Traefik AVAILABLE(找到,访问)

LISTENS TO XXX 是下节课要讲解的内容~

Traefik 的配置机制

本节内容解释上一节的 rawdata 是怎么来的,
看图:
Traefik 配置介绍

从图中可以看出,Traefik 将配置逻辑划分为 STATIC(静态)DYNAMIC(动态) 两部分:

  • STATIC(静态) 部分是在 Traefik 启动(STARTUP TIME)时就设置好的。
  • DYNAMIC(动态)部分是在 Traefik 运行(WHILC RUNNING)时通过监听动态 PROVIDER 而更新。

DYNAMIC(动态)配置的选项有:

  • ROUTERS(路由)
  • SERVICES(服务)
  • MIDDLEWARES(中间件)
  • CERTIFICATES STORES & OPTIONS(证书存储与选项)

用上一节的示例来说明:

  1. Docker 这个 Provider 将部署好的 whoami 容器地址与端口告诉 Traefik
  2. Traefik 将 whoami 容器地址与端口更新自己的配置信息中~

STATIC(静态)配置的选项有:

  • ENTRYPOINTS(入口点)
  • PROVIDER CONNECTION INFO(K8s, Docker, AWS 等 PROVIDER 的连接信息)

设置静态配置有四种方式,具体请查阅 官方文档 - The Static Configuration

推荐使用配置 traefik.yaml 文件,原因是有记录可查。
存放到 /etc/traefik/ 或者 与 traefik.exe 同一个目录。
Linux 软件是没有后缀名的,这里用 .exe 表达一下我在说啥

参考资料

Traefik 官方文档

Traefik-v2.x快速入门

觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/traefik/getting-started/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除