更简单的 Traefik 2 使用方式

经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发效率的实践。

在 Traefik 2 使用指南,愉悦的开发体验、配置基于Traefik v2的 Web 服务器 文章中,使用 Traefik 的方案引入了比较多的配置,如果你并不是在一个复杂场景使用,这样的配置是可以简化的。

简化程序配置文件

一般情况下将参数变为配置,更利于在版本控制软件中进行版本管理。在 v2 版本中,因为有了动态配置的概念,传统的固定配置,使用简写的参数来替换,并记录在容器启动配置中,可以在减少分发文件数量的情况下,达到相同的效果。

使用参数取代 traefik.toml

在之前的文章中,我提供了一般情况下,使用的默认配置内容:

[global]checkNewVersion = falsesendAnonymousUsage = false[log]level = "WARN"format = "common"[api]dashboard = trueinsecure = true[ping][accessLog][providers][providers.docker]watch = trueexposedByDefault = falseendpoint = "unix:///var/run/docker.sock"swarmMode = falseuseBindPortIP = falsenetwork = "traefik"[providers.file]watch = truedirectory = "/etc/traefik/config"debugLogGeneratedTemplate = true[entryPoints][entryPoints.http]address = ":80"[entryPoints.https]address = ":443"

想要达到相同的效果,只需要在 command 字段内添加下面的内容即可:

version: '3'services:traefik:
...command:- "--global.sendanonymoususage=false"- "--global.checknewversion=false"- "--entrypoints.http.address=:80"- "--entrypoints.https.address=:443"- "--api=true"- "--api.insecure=true"- "--api.dashboard=true"- "--api.debug=false"- "--ping=true"- "--log.level=warn"- "--log.format=common"- "--accesslog=false"- "--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"
...

现在,你就可以将 traefik.toml 配置文件删除掉了。

简化 dashboard.toml

前文中,我们将 Traefik 的内置 dashboard 等路由通过配置文件来定义,像下面这样。

[http.middlewares.dash-compress.compress]
[http.middlewares.dash-auth.basicAuth]users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",][http.routers.dashboard-redirect-https]rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"entryPoints = ["http"]service = "noop"middlewares = ["https-redirect"]priority = 100[http.routers.dashboard]rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`)"entrypoints = ["https"]service = "dashboard@internal"middlewares = ["dash-compress"][http.routers.dashboard.tls][http.routers.api]rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/api`)"entrypoints = ["https"]service = "api@internal"middlewares = ["dash-compress"][http.routers.api.tls][http.routers.ping]rule = "Host(`dashboard.lab.io`, `dashboard.lab.com`) && PathPrefix(`/ping`)"entrypoints = ["https"]service = "ping@internal"middlewares = ["dash-compress"][http.routers.ping.tls]

其实,只需要将配置保留剩下这两条需要被预先定义的“中间件”即可,如果你不需要页面压缩,或者不需要访问密码,那么也可以不对下面的内容进行保存:

[http.middlewares.dash-compress.compress]
[http.middlewares.dash-auth.basicAuth]users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/",]

接着在容器配置中添加一些 traefik 能够解析处理的规则在 labels 字段中即可:

version: '3'services:traefik:
...    labels:- "traefik.enable=true"- "traefik.docker.network=traefik"# 默认请求转发 https 端口- "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"- "traefik.http.routers.traefik-dash-default.entrypoints=http"- "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"- "traefik.http.routers.traefik-dash-default.service=dashboard@internal"# 处理网页- "traefik.http.routers.traefik-dash-web.entrypoints=https"- "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"- "traefik.http.routers.traefik-dash-web.tls=true"- "traefik.http.routers.traefik-dash-web.service=dashboard@internal"# 处理接口- "traefik.http.routers.traefik-dash-api.entrypoints=https"- "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"- "traefik.http.routers.traefik-dash-api.tls=true"- "traefik.http.routers.traefik-dash-api.service=api@internal"
...

单独抽象保存的 default.toml 配置

虽然我们将 90% 的内容都迁移到了 compose 配置文件中,但是还是有一些内容暂时是不好进行重写的,比如下面提到的“内容Gzip压缩”和“HTTP转发HTTPS”:

# 提供 Gzip 压缩
[http.middlewares.gzip.compress]# tricks 实现,提供 HTTP 默认转发 HTTPS
# https://github.com/containous/traefik/issues/4863#issuecomment-491093096
[http.services][http.services.noop.LoadBalancer][[http.services.noop.LoadBalancer.servers]]url = "" # or url = "localhost"[http.routers][http.routers.https-redirect]entryPoints = ["http"]rule = "HostRegexp(`{any:.*}`)"middlewares = ["https-redirect"]service = "noop"[http.middlewares.https-redirect.redirectScheme]scheme = "https"

这里倒不是说不能够在应用内配置,而是如果这两个中间件在应用内配置,会出现每个应用都需要配置重复配置的问题。尽管独立的配置会让应用的可迁移性更好,然而这份配置可以提供不论是在本地、私有云,还是公有云 SLB 环境下的一致行为,维护一份配置,总比维护几份要来的方便,不是吗?

完整的容器配置

一如既往,这里给出完整的 compose 配置:

version: '3'services:traefik:container_name: traefikimage: traefik:v2.3.4restart: alwaysports:- 80:80- 443:443networks:- traefikcommand:- "--global.sendanonymoususage=false"- "--global.checknewversion=false"- "--entrypoints.http.address=:80"- "--entrypoints.https.address=:443"- "--api=true"- "--api.insecure=true"- "--api.dashboard=true"- "--api.debug=false"- "--ping=true"- "--log.level=warn"- "--log.format=common"- "--accesslog=false"- "--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"volumes:# 仅限标准的 Linux 环境- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- /var/run/docker.sock:/var/run/docker.sock:ro- ./config/:/etc/traefik/config/:ro- ./ssl/:/data/ssl/:rolabels:- "traefik.enable=true"- "traefik.docker.network=traefik"# 默认请求转发 https 端口- "traefik.http.routers.traefik-dash-default.middlewares=https-redirect@file"- "traefik.http.routers.traefik-dash-default.entrypoints=http"- "traefik.http.routers.traefik-dash-default.rule=Host(`dashboard.guava.lab.com`)"- "traefik.http.routers.traefik-dash-default.service=dashboard@internal"# 处理网页- "traefik.http.routers.traefik-dash-web.entrypoints=https"- "traefik.http.routers.traefik-dash-web.rule=Host(`dashboard.guava.lab.com`) && PathPrefix(`/`)"- "traefik.http.routers.traefik-dash-web.tls=true"- "traefik.http.routers.traefik-dash-web.service=dashboard@internal"# 处理接口- "traefik.http.routers.traefik-dash-api.entrypoints=https"- "traefik.http.routers.traefik-dash-api.rule=Host(`dashboard.guava.lab.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"- "traefik.http.routers.traefik-dash-api.tls=true"- "traefik.http.routers.traefik-dash-api.service=api@internal"healthcheck:test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]interval: 3sretries: 12logging:driver: "json-file"options:max-size: "1m"networks:traefik:external: true

最后

官方在前一阵推出了 https://traefik.io/traefik-pilot/,除了作为统一的管理中心之外,还提供了许多有用的中间件,比如请求/响应头改写、IP 禁止名单、IP地址转换、fail2ban 等等。

因为暂时官方无意将 pilot 开源(可能也会是长期状况),如果你不介意“联公网”使用,可以试试注册 pilot 使用。

–EOF


我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,否则不会通过审核)

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2020年12月02日
统计字数: 7102字
阅读时间: 15分钟阅读
本文链接: https://soulteary.com/2020/12/02/easier-way-to-use-traefik-2.html

更简单的 Traefik 2 使用方式相关推荐

  1. 深入解析 Kubebuilder:让编写 CRD 变得更简单

    原文连接:https://developer.aliyun.com/article/719215 作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource ...

  2. 【Python自动化任务】让运维更简单的7种定时任务实现方式,总有一种适合你的场景

    想要看更加舒服的排版.更加准时的推送 关注公众号"不太灵光的程序员" 每日八点有干货推送 有粉丝留言问什么时候可以写一个关于自动化任务的文章 准备上!~ 感觉有用关注公众号 &qu ...

  3. SAP IRPA ---LoginSAP的更简单方式

    LoginSAP 场景: 前言: 第一步:添加应用程序 第二步:创建工作流 第三步:编写脚本 Step: Login_To_SAP 场景: 登陆到SAP(比上一篇博客的登陆方式更简单) 前言: 上一篇 ...

  4. 使用C#开发HTTP服务器系列之更简单的实现方式

      各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com.到目前为止,我已经发布了3篇HTTP服务器开发的系列文章.对我个人而言,我非常享受这个从 ...

  5. android滑动图形验证码,Android使用更简单的方式实现滑块拼图验证码功能

    实现滑块拼图验证码功能之前已经写过一篇了,上一篇使用的是自定义控件的方式实现这个功能,主要还是想让童鞋们知其然更知其所以然,还没看的童鞋可以先看看Android实现滑块拼图验证码功能这篇. 在项目的开 ...

  6. 三星s20 android auto,Automagic一个更简单的方式来自动化您的Android手机 | MOS86

    你有没有想过你的智能手机会在你回家的时候开始播放音乐?当你关闭社交网络的时候怎么样?Automagic是一种替代方案,通过使用易于理解的流程图执行许多相同的任务,向用户提供了一种更简单的自动化Andr ...

  7. KubeVela 1.4:让应用交付更安全、上手更简单、过程更透明

    作者:孙健波,曾庆国 KubeVela 是一个现代化的软件交付控制平面,目标是让应用的部署和运维在如今的混合多云环境下更简单.敏捷.可靠.自 1.1 版本发布以来,KubeVela 架构上天然打通了企 ...

  8. 机器学习本该用起来更简单

    机器学习本该用起来更简单 作者 | Caleb Kaiser译者 | 王强免责声明:本文内容是基于我对一些机器学习团队的观察结果,而不是对这个行业的一份学术调查.利益相关,我需要先表明自己是 Cort ...

  9. 让CoreData更简单些

    从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...

最新文章

  1. 软件工程结对作业02
  2. Tomcat8.0 JDK1.8 的详细配置 Win10
  3. AcWing 845. 八数码(3阶数字华容道):bfs求最短路,状态表示困难
  4. 博士选题的态度:商量着来
  5. 微信小程序_(表单组件)button组件的使用
  6. LeetCode 454. 四数相加 II 思考分析
  7. 写出python字符串三种常用的函数或方法_python中几种常用字符串函数
  8. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理
  9. Educational Codeforces Round 55 (Rated for Div. 2)
  10. 计算同比和环比的区别_【数据说第三期】同比和环比数据分析时,有哪些需要注意的点?...
  11. 免费计算机网络基础ppt,计算机网络基础概念课件.ppt
  12. nodejs动态加载代码
  13. C语言printf输出格式总结
  14. Java 采用MD5加密解密
  15. Can‘t open /dev/sdb1 exclusively. Mounted filesystem? --redhat7.8
  16. java加载so包,undefined symbol处理方法
  17. c语言杖举,形近字组词。直()植()杖()仗()提()题()漫()慢()
  18. epub阅读器 html,打造web版epub阅读器(书架设计)
  19. 适用于 Android 的 Visual Studio 模拟器
  20. [Java 基础] 深入理解List的toArray()方法和toArray(T[] a)方法

热门文章

  1. 网络通信面试题详细解答
  2. 第四届“图灵杯”NEUQ-ACM程序设计人赛真题重现
  3. 2021_WWW_Self-Supervised Multi-Channel Hypergraph Convolutional Network for Social Recommendation
  4. 2022年十大数据泄露事件
  5. 调制 Modulation
  6. 矩阵A可逆,则A的逆矩阵也可逆
  7. 人工智能之深度学习常见应用方向你都了解吗?(文末包邮送书5本)
  8. Python量化分析(1)——Tushare的使用介绍
  9. 常见的图像文件格式又有哪些呢?
  10. 微信缓存dat怎么转图片_微信 .dat图片格式转换为.jpg