traefik
traefik介绍
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
- 它非常快
- 无需安装其他依赖,通过Go语言编写的单一可执行文件
- 支持 Rest API *多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, 并且还会更多
- 后台监控, 可以监听后台变化进而自动化应用新的配置文件设置
- 配置文件热更新。无需重启进程
- 正常结束http连接
- 后端断路器
- 轮询,rebalancer 负载均衡
- Rest Metrics
- 支持最小化 官方 docker 镜像
- 后台支持SSL
- 前台支持SSL(包括SNI)
- 清爽的AngularJS前端页面
- 支持Websocket
- 支持HTTP/2
- 网络错误重试
- 支持Let’s Encrypt (自动更新HTTPS证书)
- 高可用集群模式
目前好像只支持7层,不支持4层应用。
配置说明
【docker】选项配置
- watch = true #此选项会实时监控docker容器变化,如果有新的容器就会加到到traefik上,启动容器的时候可以使用此参数来屏蔽,请看下面这个参数,默念此参数是true,所以不想使新启动的所有容器加入到traefix里面的话,那就要把watch = false配置。一般是把此开关打开,用
--label "traefik.enable=false"参数对新启动的容器进行控制,是否要加入到traefik中。 - traefik.enable=false #traefik禁用这个容器,此参数是添加到docker run –labels后面。这样启动的容器就不会被traefik自动发现。如:
docker run --name "nginx3" --label "traefik.enable=false" -d nginx - 当使用静态模块的时候,以下两个参数很重要,不然你就访问不了,返回404的错误:
MaxIdleConnsPerHost = 100000defaultEntryPoints = ["http"],特别是默认入口,一定要写。
本机启动,监控本机docker的配置文件样例
以下配置文件是:traefik不在docker上启动的,是在宿主机上启动的,v发现访问日志文件配置是没有生效的。traefik.toml配置文件如下:
################################################################
# Global configuration
################################################################
# Enable debug mode
#
# Optional
# Default: false
#
debug = true
# Traefik logs file
# If not defined, logs to stdout
#
# Optional
#
traefikLogsFile = "log/traefik.log"
# Log level
#
# Optional
# Default: "ERROR"
#
logLevel = "ERROR"
# Entrypoints to be used by frontends that do not specify any entrypoint.
# Each frontend can specify its own entrypoints.
#
# Optional
# Default: ["http"]
#
# defaultEntryPoints = ["http", "https"]
# Entrypoints definition
#
# Optional
# Default:
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
# [entryPoints.http.auth.basic]
# users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"]
# Enable access logs
# By default it will write to stdout and produce logs in the textual
# Common Log Format (CLF), extended with additional fields.
#
# Optional
#
[accessLog]
# Sets the file path for the access log. If not specified, stdout will be used.
# Intermediate directories are created if necessary.
#
# Optional
# Default: os.Stdout
#
filePath = "log/access.log"
# Format is either "json" or "common".
#
# Optional
# Default: "common"
#
format = "common"
################################################################
# Web configuration backend
################################################################
# Enable web configuration backend
[web]
# Web administration port
#
# Required
#
address = ":8080"
#####################################
# Docker configuration backend
################################
# Enable Docker configuration backend
[docker]
# Docker server endpoint. Can be a tcp or a unix socket endpoint.
#
# Required
#Default: "unix:///var/run/docker.sock"
#
endpoint = "unix:///var/run/docker.sock"
watch = true
# Default domain used.
# Can be overridden by setting the "traefik.domain" label on a container.
#
# Optional
# Default: ""
#
domain = "www.abc.com"
# Expose containers by default in traefik
#
# Optional
# Default: true
#
# exposedbydefault = true
但是docker启动的时候需要添加两个label如下:
docker run --name nginx6 --label="traefik.backend=whoami" --label="traefik.frontend.rule=Host:www.abc.com" -d nginx
静态页面配置样例(类似于nginx)
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":8000"
[file]
[backends]
[backends.backend1]
[backends.backend1.servers.server1]
url = "http://IP-whoami1:80"
weight = 1
[backends.backend1.servers.server2]
url = "http://IP-whoami2:80"
weight = 1
[frontends]
[frontends.frontend1]
backend = "backend1"
[frontends.frontend1.routes.test_1]
rule = "Host: test.traefik"
docker启动并监控docker里web变化,动态更新配置。
docker直接启动traefik的话,配置文件中不要配置domain,如果配置了,它会自己监控自己,而且在docker 上启动的web,启动域名如果和配置文件一样的话,那么你访问的域名的话就会在前面加上东西。具体可以参照下图
实践发现【docker】标签下的domain不需要配置,配置了没有什么用。
在docker中测试发现,一个后端只能加入一个前端
在上图中启了一下前台一样,后台不一样,那么访问后台这个域名的话,会直接访问最后面启的那一台。
docker run --name nginx4 --label="traefik.backend=clc1" \ --label="traefik.frontend.rule=Host:www.abcd.com" -d nginx
也就是没有启动上面这条命令,访问www.abcd.com会访问三台web,启动了上面的web之后,在访问这个域名,就只访问刚才启的这台web。
traefik的配置文件如下:
[root@node1 traefik]# grep -v -E "#|^$" traefik.toml
debug = true
traefikLogsFile = "/var/log/traefik.log"
logLevel = "ERROR"
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[accessLog]
filePath = "/var/log/access.log"
format = "common"
[web]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
watch = true
docker启动文件配置如下:
docker run \ -d \ --name traefik \ -p 88:80 \ -p 89:8080 \ -p 443:443 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /root/docker/traefik/traefik.toml:/etc/traefik/traefik.toml \ -v /root/docker/traefik/log:/var/log \ -v /etc/localtime:/etc/localtime:ro \ traefik:latest
启动docker时相关traefik的label及解释
以给容器用来覆盖默认表现方式的Label:
traefik.backend=foo: 将容器指向 foo 后端
traefik.backend.maxconn.amount=10: 设置后端连接的最大数量。必需与以下label配合使用才能生效。
traefik.backend.maxconn.extractorfunc=client.ip: 设置后端连接最大数量所依赖的维度。必需与上面的label配合使用才能生效。
traefik.backend.loadbalancer.method=drr: 覆盖默认的 wrr 负载均衡算法逻辑
traefik.backend.loadbalancer.sticky=true: 启用后端粘滞session
traefik.backend.loadbalancer.swarm=true: 使用 Swarm 内置的负载均衡器(只有使用Swarm Mode时生效)。
traefik.backend.circuitbreaker.expression=NetworkErrorRatio() > 0.5: 为后端创建一个 断路器 。
traefik.port=80: 注册使用这个端口。当容器暴露出多个端口时非常有效。
traefik.protocol=https: 覆盖默认的 http 协议
traefik.weight=10: 为容器指定权重
traefik.enable=false: 为Træfɪk禁用这个容器
traefik.frontend.rule=Host:test.traefik.io: 覆盖默认前端规则(默认:Host:{containerName}.{domain})。
traefik.frontend.passHostHeader=true: 将客户端header中的 Host 转发到后端。
traefik.frontend.priority=10: 覆盖默认的前端优先级
traefik.frontend.entryPoints=http,https: 将这个前端指向入口点 http 与 https。 覆盖 defaultEntryPoints。
traefik.docker.network: 设置连接到这个容器的docker网络。 \
如果容易被链接到多个网络,一定要设置合适的网络名称(你可以使用docker检查)\
否则它将自动选择一个(取决于docker如何返回它们)。例如,当通过compose文件部署docker stack ,compose定义的网络名将以 stack 为前缀。
报错解析
- 页面直接报404,但实际后端的服务是正常的,这种情况一般是traefik的配置文件有问题,原因是没有指它默认的入口,添加以下配置就可以,
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"] #这个必须指定下面的entrypoints入口,下面定义的是http,所以这里也写http。
[entryPoints]
[entryPoints.http]
address = ":80"
原文链接:traefik,转载请注明来源!

