Fari

Traefik

traefik教程

使用traefik创建反向代理过程见:https://blog.woyou.cool/post/1908

本文来自官网文档的部分翻译并加以解释:https://doc.traefik.io/traefik/

由于本人不善描述,故请结合下述举例进行了解

简述

traefik是一个边际路由,它在服务中扮演着网关的角色。它拦截所有请求并进行一系列处理后再传递到具体的处理服务器。

其特点是可以进行自动的服务发现。例如,我希望在项目中添加一个新的服务,如果使用nginx的话就需要手动修改nginx配置文件,并创建路由规则。而traefik则会自动监听服务状态,新加的服务也会根据规则自动创建路由。这就使得它在初始配置时略微麻烦,但是后续使用的过程比较简单。

重要概念

traefik有几个较为重要的概念:

配置文件

traefik有两种非常重要的配置文件:静态配置和动态配置

静态配置就是一个 traefik.yml 的配置文件,这里面配置的是traefik的一些启动参数,例如其监听的端口、是否开始dashboard等

动态配置就是用来配置各种路由规则的。traefik一旦启动后就不需要再进行配置了,所有新加入的服务都应该在该服务启动时就指定路由规则,然后等待traefik自动发现。

例如:我启动了一个traefik,此时需要新加入一个web服务S,则我应该在启动S时给定一个启动参数“rule=my-router-rule”用于路由的配置(真实的配置不是这样,但也是kv的形式),这个参数就是一个动态配置。由于不同的provider中服务的启动方式不同,故动态配置都是不尽相同的。例如若使用docker作为provider,则启动新的docker容器时,就需要加上 --label rule=my-router-rule 的参数。因为docker做provider时是使用容器的label作为动态配置的。

(三个月后的后记:不得不说,这种配置方式,当时一时爽,后来火葬场。当我再次进入这个服务器看的时候,我发现我完全忘记了当时是怎么配置的,我完全不知道访问规则是什么,就算我找到了域名解析规则,但我依旧无法想起它到底是怎么访问的,为什么可以这样,我已经怀疑人生到不会组织语言了)

举例

开启一个traefik并使用docker作为provider

#traefik静态配置文件 traefik.yml

# 使用docker作为provider
providers:
  docker: {}

# 使用安全模式并开启dashboard
api:
  dashboard: true
  insecure:  false

启动traefik

docker run -d -p 8080:8080 -p 80:80 -p 443:443 --name traefik -v /var/run/docker.sock:/var/run/docker.sock -v /home/hunt/Templates/traefik.yml:/etc/traefik/traefik.yml --network net1 -l "traefik.http.routers.dashboard.rule=Host(\`traefik.huntzou.com\`) && (PathPrefix(\`/api\`) || PathPrefix(\`/dashboard\`))" -l "traefik.http.routers.dashboard.service=api@internal" traefik

为了便于使用域名访问,我手动在host文件中添加了一些dns解析,其中192.168.190.128就是我的服务器ip

docker中使用traefik作反向代理

拉取traefik镜像

docker镜像地址:https://hub.docker.com/_/traefik

docker pull traefik

创建traefik配置文件

traefik.yml

# Docker configuration backend
providers:
  docker:
    defaultRule: "Host(`{{ trimPrefix `/` .Name }}.your-domain`)"

# API and dashboard configuration
api:
  insecure: false
  dashboard: true

注:配置文件中的 your-domain 应替换成服务器的域名,前面那一串就是将被代理服务器名拼接成二级域名,当使用该二级域名访问时就会重定向到对应的服务器

启动traefik

docker run -d -p 8080:8080 -p 80:80 --name traefik -v /var/run/docker.sock:/var/run/docker.sock -v /home/hunt/Templates/traefik.yml:/etc/traefik/traefik.yml --network net1 -l "traefik.http.routers.dashboard.rule=Host(\`traefik.huntzou.com\`) && (PathPrefix(\`/api\`) || PathPrefix(\`/dashboard\`))" -l "traefik.http.routers.dashboard.service=api@internal" traefik

注:

  1. 也可以不挂载traefik.yml文件,在运行traefik之后使用docker cp将其复制到挂载的位置

  2. 挂载 docker.sock 目的是监听docker容器的变化,当有新的容器被创建时traefik就能自动监测到并创建代理规则。sock=socket

  3. 需将traefik和被代理服务器放在同一个network下

  4. 8080端口用于traefik的控制面板,80和443将用作web服务端口

  5. 启动命令中的两个 -l 参数是为了在安全模式下启动dashboard

  6. 由于linux命令行中的反引号有特殊意义,故这里都需要转义

  7. 关于安全模式下的dashboard配置较为复杂,详见:https://doc.traefik.io/traefik/operations/dashboard/

启动web服务

我这里使用两个nginx当作被代理服务器

sudo docker run -d --name nginx1 --network net1 nginx
sudo docker run -d --name nginx2 --network net1 nginx

打开traefik控制台页面就能看到其自动检测出了nginx,并根据其配置文件生成了二级域名映射。