首页 » docker » traefik

traefik

 
文章目录

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中测试发现,一个后端只能加入一个前端

trafik-web%e8%af%b4%e6%98%8e

在上图中启了一下前台一样,后台不一样,那么访问后台这个域名的话,会直接访问最后面启的那一台。

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 为前缀。

报错解析

  1. 页面直接报404,但实际后端的服务是正常的,这种情况一般是traefik的配置文件有问题,原因是没有指它默认的入口,添加以下配置就可以,
MaxIdleConnsPerHost = 100000
defaultEntryPoints = ["http"] #这个必须指定下面的entrypoints入口,下面定义的是http,所以这里也写http。

[entryPoints]
    [entryPoints.http]
    address = ":80"

 

原文链接:traefik,转载请注明来源!

1