Traefik路由Docker

一、简介

Traefik 是一款开源的边缘路由器,可以作为整个平台的入口(网关),根据逻辑规则,处理并路由整个传入的请求。

优点:

  1. 自动服务发现
  2. 原生兼容所有主要集群技术,例如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon,并且可以同时处理多个。
  3. 无需维护和同步单独的配置文件,自动实时更新,无需重新启动,不会中断连接
  4. 集成了漂亮的 dashboard 界面

二、配置

Traefik 中的配置分为2部分:

  • 全动态路由配置(动态配置),从Provider获取*,*定义如何由系统来处理请求。此配置可以更改并无缝热重载,不会出现任何请求中断或连接丢失。
  • 启动配置(静态配置),设置与Provider连接并定义Traefik 将侦听的入口点。

在 Traefik 中定义静态配置选项有三种不同的、互斥的(即您只能同时使用一种)的方法:

  1. 在配置文件中
  2. 在命令行参数中
  3. 作为环境变量

配置文件

启动时,Traefik 在以下位置搜索名为traefik.yml(或traefik.yamltraefik.toml)的文件:

  • /etc/traefik/
  • $XDG_CONFIG_HOME/
  • $HOME/.config/
  • .(工作目录)

可以使用configFile参数覆盖它

traefik --configFile=foo/bar/myconfigfile.yml

参数

可以使用 traefik --help 获取参数

常见参数:

--accesslog:
访问日志设置。(默认值:false)--api:
启用 api/仪表板。(默认值:false)--certificatesresolvers.<name>:
证书解析器配置。(默认值:false)--entrypoints.<name>:
入口点定义。(默认值:false)--log:
Traefik 日志设置。(默认值:false)--pilot.dashboard:
在仪表板中启用 Traefik Pilot。(默认值:true)--ping:
启用ping。(默认值:false)--providers.docker:
使用默认设置启用 Docker 后端。(默认值:false)

环境变量

常见的环境变量有(和参数一样,只不过换成大写形式,加上TRAEFIK_前缀):

TRAEFIK_ACCESSLOG:
访问日志设置。(默认值:false)TRAEFIK_API:
启用 api/仪表板。(默认值:false)TRAEFIK_CERTIFICATESRESOLVERS_<NAME>:
证书解析器配置。(默认值:false)TRAEFIK_ENTRYPOINTS_<NAME>:
入口点定义。(默认值:false)TRAEFIK_LOG:
Traefik 日志设置。(默认值:false)TRAEFIK_PILOT_DASHBOARD:
在仪表板中启用 Traefik Pilot。(默认值:true)TRAEFIK_PING:
启用ping。(默认值:false)TRAEFIK_PROVIDERS_DOCKER:
使用默认设置启用 Docker 后端。(默认值:false)

三、docker部署Traefik

version: '3'services:reverse-proxy:# 官方的 Traefik 2.0 Docker 镜像image: traefik# 开启 web UI 并且告诉 Traefik 监听 Dockercommand:- "--entrypoints.http.address=:80"- "--entrypoints.https.address=:443"- "--api=true"- "--api.insecure=true"- "--api.dashboard=true"- "--api.debug=false"- "--ping=true"- "--providers.docker=true"- "--providers.docker.watch=true"- "--providers.docker.exposedbydefault=false"- "--providers.docker.endpoint=unix:///var/run/docker.sock"- "--providers.docker.swarmMode=false"- "--providers.docker.useBindPortIP=false"- "--providers.docker.network=traefik"- "--providers.file=true"- "--providers.file.watch=true"- "--providers.file.directory=/etc/traefik/config"- "--providers.file.debugloggeneratedtemplate=true"ports:# HTTP 端口- "30080:80"# Web UI 端口(通过 --api.insecure=true 启用)- "38080:8080"volumes:# 这样 Traefik 可以监听 Docker 事件- /var/run/docker.sock:/var/run/docker.sock- /opt/traefik/config:/etc/traefik/config

四、路由与负载均衡

当使用 Docker 作为provider 时,Traefik 使用容器标签(labels)来检索其路由配置。

完整的Traefik 的架构分为这几部分:

  • entryPoints 侦听传入流量(端口,…)EntryPoints 是 Traefik 的网络入口点。它们定义了将接收数据包的端口,以及是侦听 TCP 还是 UDP。
  • routers 分析请求(主机、路径、标头、SSL 等),路由器负责将传入请求连接到可以处理它们的服务
  • services 将请求转发给您的服务(负载平衡,…)
  • middlewares 可能会更新请求或根据请求做出决定(身份验证、速率限制、标头等)
  • providers 发现存在于您的基础架构上的服务(他们的 IP、健康状况……)

entryPoints

EntryPoints 是 Traefik 的网络入口点。它们定义将接收请求的端口(无论是 HTTP 还是 TCP)

部署中指定,可以是启动命令参数:

command:- "--entrypoints.http.address=:80"

静态配置文件中:

entryPoints:http:address: ":80"

Provider配置

  • endpoint必需*,*默认=“unix:///var/run/docker.sock”
  • useBindPortIP可选,默认=false,Traefik 将请求路由匹配到容器的 IP/端口。设置useBindPortIP=true,Traefik 使用附加到容器绑定的 IP/端口,而不是其内部网络 IP/端口。当与traefik.http.services.<name>.loadbalancer.server.port标签结合使用时(告诉 Traefik 将请求路由匹配到特定端口),Traefik 会尝试在 port 上找到绑定traefik.http.services.<name>.loadbalancer.server.port。如果找不到这样的绑定,Traefik 会回退到容器的内部网络 IP,但仍然使用traefik.http.services.<name>.loadbalancer.server.port标签中设置的IP/端口 。
  • exposedByDefault可选*,默认=true。*默认情况下Traefik 公开容器。如果设置为falsetraefik.enable=true则从生成的路由配置中忽略没有标签的容器。
  • network可选,默认=“”定义用于连接到所有容器的默认 docker 网络。可以使用traefik.docker.network标签在每个容器的基础上覆盖此选项。
  • defaultRule*可选,默认=Host({{ normalize .Name }})。*如果标签未定义任何规则,则该选项定义要应用于容器的路由规则。
  • swarmMode*可选,默认=false。*启用 Swarm 模式(而不是独立的 Docker)。
  • swarmModeRefreshSeconds*可选,默认值=15。*定义群模式的轮询间隔(以秒为单位)。
  • httpClientTimeout*可选,默认=0。*定义 HTTP 连接的客户端超时(以秒为单位)。如果它的值为0,则不设置超时。
  • watch*可选,默认=true。*监听 Docker Swarm 事件。

中间件配置

# 在 labels 中指定
traefik.http.middlewares.中间件名称.中间件类型=

常用中间件类型

  • AddPrefix 添加前缀

    # Prefixing with /foo
    labels:- "traefik.http.middlewares.add-foo.addprefix.prefix=/foo"
    
  • BasicAuth 添加基本身份验证

    labels:- "traefik.http.middlewares.test-auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"
    
  • Buffering 限制了可以转发到服务的请求的大小。

    通过缓冲,Traefik 将整个请求读入内存(可能将大请求缓冲到磁盘中),并拒绝超过指定大小限制的请求。这可以帮助服务避免大量数据(multipart/form-data例如),并且可以最大限度地减少向服务发送数据所花费的时间。

    # Sets the maximum request body to 2MB
    labels:- "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
    
  • Compress 中间件使用 gzip 压缩

  • ContentType指定是否让Content-Type标头(如果后端尚未定义)自动设置为从响应内容派生的值。

  • DigestAuth 中间件将您的服务的访问权限限制为已知用户

  • ErrorPage 中间件根据 HTTP 状态代码的配置范围返回一个自定义页面来代替默认页面。

  • ForwardAuth 中间件将身份验证委托给外部服务。如果服务以 2XX 代码应答,则授予访问权限,并执行原始请求。否则,返回来自认证服务器的响应。

  • Headers 中间件管理请求和响应的标头。

  • IPWhitelist 根据客户端 IP 接受/拒绝请求。

  • inflightreq 限制同时进行中的请求数

  • PassTLSClientCert 将通过的客户端 TLS 证书中的选定数据添加到标头中。

  • RateLimit控制进入服务的请求数

  • RedirectRegex 使用正则表达式匹配和替换来重定向请求。

  • RedirectScheme 将请求从一个方案/端口重定向到另一个。

  • replacepath替换请求 URL 的路径。

  • ReplaceRegex 使用正则表达式匹配和替换来替换 URL 的路径。

  • retry 如果后端服务器没有回复,重试中间件向后端服务器重新发出给定次数的请求。服务器一响应,中间件就会停止重试,无论响应状态如何。Retry 中间件有一个可选配置来启用指数退避。

  • stripprefix 在转发请求之前从路径中删除前缀

  • stripprefixregex 在转发请求之前从路径中删除前缀(使用正则表达式)

Router配置

# 指定路由入口点,http为traefik启动时定义的端口
"traefik.http.routers.自定义路由名称.entrypoints=http"# 定义路由规则,监听来自于域名的请求,Host中用`符号
"traefik.http.routers.自定义路由名称.rule=Host(`www.domain.com`)"# 设置路由引用中间件
"traefik.http.routers.自定义路由名称.middlewares=中间件名称" # 指定路由后端为哪个service,多个service时需要具体指定路由到哪个
"traefik.http.routers.自定义路由名称.service=服务名"

Services配置

 ## 用于docker服务发现与负载均衡,自动发现指定端口的服务,作为后端服务## 如果容器expose了单个端口,则 Traefik 使用此端口进行私有通信## 如果一个容器 expose了多个端口,或者没有暴露任何端口,那么你必须使用标签手动指定 Traefik 应该使用哪个端口进行通信"traefik.http.services.自定义服务名.loadbalancer.server.port=应用端口"

示例

version: '3'
services:wg-easy:image: weejewel/wg-easycontainer_name: wg-easyenvironment:- WG_HOST=18.183.2.23- WG_DEFAULT_DNS=114.114.114.114,8.8.4.4ports:- "51820:51820/udp"sysctls:- net.ipv4.ip_forward=1- net.ipv4.conf.all.src_valid_mark=1cap_add:- NET_ADMIN- SYS_MODULElabels:# 启用 traefik 动态配置- "traefik.enable=true"# 设置trafik 网络- "traefik.docker.network=traefik"##  定义名为 auth-user 的 基本认证 中间件,密码使用htpasswd生成,$作为转义字符- "traefik.http.middlewares.auth-users.basicauth.users=admin:$$apr1$$WArvArno$$CUyHO2J8dg6BQNUbhTiwA."   # 定义名为 wg-easy 的路由,该路由在入口点 Web(端口80)上侦听- "traefik.http.routers.wg-easy.entrypoints=http"## 设置wg-easy路由入口点 引用中间件auth-users- "traefik.http.routers.wg-easy.middlewares=auth-users" ##  定义此 wg-easy 路由规则,监听来自于域名为he.simple11618.xyz的请求,将其路由到服务- "traefik.http.routers.wg-easy.rule=Host(`he.simple11618.xyz`)"## 将请求转发到容器上的端口,需要使用路由器上的service参数引用服务负载均衡器端口定义## 默认转发到expose的第一个端口,多端口需要单独指定- "traefik.http.services.my-service.loadbalancer.server.port=51821"networks:- traefiknetworks:traefik:external: true

Traefik路由Docker相关推荐

  1. openwrtx86安装docker_PVE下openwrt软路由docker环境安装unifi controller

    PVE下openwrt软路由docker环境安装unifi controller 2020-03-29 14:10:18 48点赞 491收藏 44评论 [写作说明]:之前分享了一篇m920x准系统作 ...

  2. openwrt 软路由 docker安装青龙面板(基础版)

    置顶:无条件部署的小伙伴可以直接上车,名额有限,手动获取 JD  CK提交版 必要准备: 务必先下载好 京东.京喜.京东极速版三个app并开启以下活动(有些需要选择种植或者生产的物品自行选择即可,千万 ...

  3. openwrt 软路由 docker安装青龙面板 + Ninja(进阶版)

    前言:此为openwrt 使用docker安装青龙面板 + Ninja的教程,有一定的上手难度,教程可能不一定适合所有人,如果是萌新小白,建议先看我的基础版教程,熟悉后再来尝试进阶版,基础版与进阶版功 ...

  4. 利用Traefik+Docker构建可弹性扩展的微服务或服务集群

    简介 Traefik是一个与Nginx.HAProxy有些相似的HTTP反向代理服务器,兼有负载均衡的功能.Nginx和HAProxy都有一个相同的问题就是,后端服务(通常称之为upstream或ba ...

  5. 更完善的 Docker + Traefik 使用方案

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载.或重新修改使用,但需要注明来源. 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2018年08月2 ...

  6. Docker Swarm集群中部署Traefik负载均衡器

    一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay tr ...

  7. Traefik 一个反向代理的新工具

    由于工作需要最近试用了几个反向路由的开源项目,Traefik就是其中之一. 一,Traefik 是干什么用的 简单来说它就是用来作反向代理和负载均衡的,比较适用于微服务化的场景,支持多种分布式的Key ...

  8. docker swam 集群实现负载均衡

    docker swam 集群实现负载均衡 文章目录 docker swam 集群实现负载均衡 1. 初始化集群 2. 虚拟IP 3. 服务发现 4. 多主机LB和服务发现 1. 初始化集群 第一个节点 ...

  9. Traefik 详解

    为什么80%的码农都做不了架构师?>>>    traefik是一个使你把微服务暴露出来变的更容易的http反向代理和负载均衡软件.traefik支持K8S.docker swarm ...

最新文章

  1. 使用mac pro电脑当tomcat端口被占用怎么解决?
  2. 动态数组 allocator
  3. Flowable节点跳转
  4. 迈好“转战”第一步-丰收节交易会·陶以平: 谋定乡村振兴
  5. 操作系统 第二章【记录型信号量机制、独木桥问题】【MOOC答案】
  6. 机器翻译 - 日期翻译
  7. 【转】关于LoadRunner的迭代
  8. 亮度 调整_显示器对比度多少合适 显示器亮度多少合适【详细介绍】
  9. 天泉证道四句教与价值观
  10. 哈萨克--阿拉木图之行
  11. 如何在 iPhone 上恢复微信聊天记录!
  12. 从NCBI 上下载 gbff 文件并得到 CDS 信息
  13. 华工计算机科学与技术专业评级,华南理工高考专业分数排名,计算机分数遥遥领先,双一流专业垫底...
  14. Windows无法安装驱动原因总结
  15. hive中如何判断字符串是否是数字
  16. 为什么要嫁给物理学3
  17. Web项目之购物网站
  18. 传奇手游战神引擎架设安装教程
  19. R语言:接受拒绝法(Acceptance-Rejection Method)生成随机数
  20. C/C++语言优秀书籍清单,新手入门必看

热门文章

  1. 【设计模式】-创造篇-原型
  2. Hex-Rays: 十步杀一人,两步秒OLLVM-BCF
  3. 华为云CDN加速OBS桶文件最佳实践
  4. Java SQL异常:java.sql.SQLException: Incorrect DATE value: ‘2021.02.31‘
  5. python中复制n次字符串_Python 字符串操作方法大全
  6. delphi操作png的单元pngimage.pas包括引用的ZlibExApi.pas和 PngLang.pas
  7. 李开复致女儿的一封信
  8. RocketMQ消息刷盘
  9. 【c++】判断子矩阵
  10. python之 模拟简单图书馆