Traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。
至于使用它的原因则基于以下几点:
- 无须重启即可更新配置
- 自动的服务发现与负载均衡
- 原生兼容各主要集群技术(Kubernetes, Docker, Docker Swarm, AWS, etc)
Traefik 初体验
使用 Docker 提供程序启动 Traefik
创建一个 docker-compose-traefik.yml
文件,
在该文件中将使用 Traefik 官方镜像定义一个 reverse-proxy(反向代理) 服务,
文件内容如下:
1 | version: '3' |
如果出现 ERROR: .UnicodeDecodeError:
,去掉中文注释,或直接到官网复制
1 | $ docker-compose -f docker-compose-traefik.yml up -d reverse-proxy |
1 | $ docker-compose -f docker-compose-traefik.yml ps |
官方文档建议此时你使用 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 | version: '3' |
1 | $ docker-compose -f docker-compose-whoami.yml up -d whoami |
1 | $ docker-compose -f docker-compose-whoami.yml ps |
官方文档建议此时你使用 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.localhost
的 localhost
上
所以将使用 docker-compose-whoami.yml
创造出来的容器 docker rm
删除掉,
此时你使用 http://localhost:8080/api/rawdata
查看一下数据。
你会发现 Traefik 已自动检测到新容器并更新了自己的配置。
然后编辑 docker-compose-whoami.yml
文件的内容为:
1 | version: '3' |
1 | $ docker-compose -f docker-compose-whoami.yml up -d whoami |
在 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 | $ docker-compose -f docker-compose-whoami.yml up -d --scale whoami=2 |
1 | $ docker-compose -f docker-compose-whoami.yml ps |
官方文档建议此时你使用 http://localhost:8080/api/rawdata
查看一下数据。
你会发现 Traefik 已自动检测到新容器并更新了自己的配置。
原因是因为自动更新配置是 Traefik 的卖点,也是下一节要讲解的内容。
多次在 Docker 宿主主机中 curl whoami.traefik.com
,
你会发现自动负载到两个不同的实例上去了~
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 将配置逻辑划分为 STATIC(静态)
与 DYNAMIC(动态)
两部分:
- STATIC(静态) 部分是在 Traefik
启动(STARTUP TIME)
时就设置好的。 - DYNAMIC(动态)部分是在 Traefik
运行(WHILC RUNNING)
时通过监听动态 PROVIDER 而更新。
DYNAMIC(动态)配置的选项有:
- ROUTERS(路由)
- SERVICES(服务)
- MIDDLEWARES(中间件)
- CERTIFICATES STORES & OPTIONS(证书存储与选项)
用上一节的示例来说明:
- Docker 这个 Provider 将部署好的
whoami
容器地址与端口告诉 Traefik - Traefik 将
whoami
容器地址与端口更新自己的配置信息中~
STATIC(静态)配置的选项有:
- ENTRYPOINTS(入口点)
- PROVIDER CONNECTION INFO(K8s, Docker, AWS 等 PROVIDER 的连接信息)
设置静态配置有四种方式,具体请查阅 官方文档 - The Static Configuration
推荐使用配置 traefik.yaml
文件,原因是有记录可查。
存放到 /etc/traefik/
或者 与 traefik.exe
同一个目录。
Linux 软件是没有后缀名的,这里用 .exe
表达一下我在说啥