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 = 100000
defaultEntryPoints = ["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,转载请注明来源!