使用 Traefik 的一些补充细节

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

本文作者: 苏洋

创建时间: 2018年09月07日 统计字数: 7211字 阅读时间: 15分钟阅读 本文链接: https://soulteary.com/2018/09/07/some-additional-details-using-traefik.html


使用 Traefik 的一些补充细节

之前我写了不少配合 Traefik 进行服务注册并提供弹性伸缩后自动进行负载均衡的例子,也贴过它的配置,但是似乎一直没有详细的解释过关于 Traefik 配置和使用的文章,考虑了一下,应该写一篇聊聊。

Traefik 是什么又能做什么

管理界面一览

如果看过我之前的文章,那么你会 Traefik 这个软件应该有一些简单的理解,提供类似 Nginx 的负载能力,不同的是可以自动化配置 “ upstream”,或者说是免配置即开即食的 consul。官方的定义如下:

A reverse proxy / load balancer that's easy, dynamic, automatic, fast, full-featured, open source, production proven, provides metrics, and integrates with every major cluster technologies... No wonder it's so popular!

简单来说就是,不论你用它来做负载均衡还是反向代理,都是符合它的设计理念的,也提供了大量的功能支撑,让你能够在不同的业务场景下,简单的配置就能实现一定规模的高性能应用。

实际使用的话,不论是配合 K8S、 compose、 Etcd、 rancher、 tradition docker都是可以的。

我个人使用在 compose 的场景下,以下配置皆以此为例,其他环境配置大体一致,细节稍有不同,等回头买几台微塔服务器,再折腾个人的 K8S 吧(毕竟单节点没什么意思)。

适合的场景

  • 如果你的机器或者 IP 资源有限,但是你却需要部署多个站点,又期望能够让站点应用保持高度隔离。
  • 你已经厌烦传统方案中使用 haproxy 或者 nginx 对于多个应用的前后端扩容修改要来回修改的麻烦事儿。
  • 你不想在服务端挂载 SSL,配置加密算法,添加 gzip 等本该 Gateway 提供的能力,希望让每一层的功能保持简单纯粹。
  • 1分钟内拥有有一个轻量高效的本地开发环境。

如何配置

下面以最新的稳定版本 1.6.x 为例,演示如何快速搭建你的应用网关, docker-compose.yml 配置文件比较简短,我们可以先看一下:

 
  1. version: '3'
  2.  
  3. services:
  4. reverse-proxy:
  5. image: traefik:1.6.6-alpine
  6. restart: always
  7. container_name: traefik
  8. ports:
  9. - 80:80
  10. - 443:443
  11. - 127.0.0.1:4399:4399
  12. - 127.0.0.1:4398:4398
  13. networks:
  14. - traefik
  15. command: traefik -c /etc/traefik.toml
  16. volumes:
  17. # 仅限标准的 Linux 环境
  18. # - /etc/localtime:/etc/localtime
  19. # - /etc/timezone:/etc/timezone
  20. - /var/run/docker.sock:/var/run/docker.sock
  21. - ./traefik.toml:/etc/traefik.toml
  22. - ./ssl/lab.com.key:/data/ssl/lab.com.key
  23. - ./ssl/lab.com.crt:/data/ssl/lab.com.crt
  24. - ./logs:/data/logs
  25.  
  26. networks:
  27. traefik:
  28. external: true

查看配置可以发现我将外部的一些文件和配置映射到了容器内部,并对外公开了 80 、和 443 端口,默认的两个端口被我映射到了容器的 127.0.0.1 ,应用的日志则被保存了出来。

这里如果使用的是标准的 Linux 发行版,可以考虑将时区和宿主机的时间映射到容器内部,保障时间一致,如果是 OSX 系统的话,可以忽略这点。

你可能会问,如果将管理端口和健康检查的端口进行了非公开暴露,那么怎么才能能够进行常规的管理查看和健康检查呢,答案很简单,配合 traefik.toml 配置文件中的 file 功能,在其中定义反向代理的规则即可,稍后会详细描述。

Traefik 支持配置的功能很多,需要注意的是,如果你在入口点配置了 HTTP 协议自动跳转 HTTPS,那么所有的入口点都会进行跳转,你将无法提供 HTTP 服务,所以下面这段注释掉的内容,视你的情况选择是否使用。

 
  1. [entryPoints.http]
  2. address = ":80"
  3. compress = true
  4. # 根据自己情况选择是否进行自动跳转
  5. # [entryPoints.http.redirect]
  6. # entryPoint = "https"

如果你使用它作为前端,装载多个不同域名的证书,实现 SNI 功能,那么只需要多添加一个字段即可同时支持 lab.com 和 lab2.com 的加密访问:

 
  1. [entryPoints.https.tls]
  2. [[entryPoints.https.tls.certificates]]
  3. certFile = "/data/ssl/lab.com.crt"
  4. keyFile = "/data/ssl/lab.com.key"
  5. [[entryPoints.https.tls.certificates]]
  6. certFile = "/data/ssl/lab2.com.crt"
  7. keyFile = "/data/ssl/lab2.com.key"

Health

关于健康检查和管理界面,默认的路径比较丑陋,必须使用指定端口访问,但是使用 [file] 字段,先将默认的端口定义为你的“后端”服务地址,然后再添加两个不同的前端路由,即可使用浏览器默认的端口进行访问。

 
  1. [file]
  2. [backends]
  3. [backends.dashboard]
  4. [backends.dashboard.servers.server1]
  5. url = "http://127.0.0.1:4399"
  6. [backends.ping]
  7. [backends.ping.servers.server1]
  8. url = "http://127.0.0.1:4398"
  9.  
  10. [frontends]
  11. [frontends.dashboard]
  12. entrypoints = ["https"]
  13. backend = "dashboard"
  14. [frontends.dashboard.routes.route01]
  15. rule = "Host:dashboard.lab.com"
  16. [frontends.ping]
  17. entrypoints = ["https"]
  18. backend = "ping"
  19. [frontends.ping.routes.route01]
  20. rule = "Host:ping.lab.com"
  21. [frontends.ping.routes.route02]
  22. rule = "ReplacePathRegex: ^/ /ping"

参考上面的例子,当你直接访问 dashboard.lab.com ,首先会跳转到 https 协议,然后再展示管理界面。

而原来需要访问 xxx.xxx.xxx.xxx:4398/ping 去实现健康监控,只需要访问 ping.lab.com 即可(这里涉及到路由重写)。

API访问

下面是 traefik.toml 的完整配置。

 
  1. ###############################################################
  2. # 全局设置
  3. ################################################################
  4.  
  5. # 激活调试模式 (默认关闭)
  6. debug = false
  7.  
  8. # 日志等级 (默认 ERROR)
  9. logLevel = "INFO"
  10.  
  11. # 全局入口点类型 (默认 http)
  12. defaultEntryPoints = ["http", "https"]
  13.  
  14. # 不上报统计信息
  15. sendAnonymousUsage = false
  16.  
  17. ################################################################
  18. # 入口点设置
  19. ################################################################
  20.  
  21. [entryPoints]
  22.  
  23. # 默认前端
  24. [entryPoints.http]
  25. address = ":80"
  26. compress = true
  27. # 根据自己情况选择是否进行自动跳转
  28. # [entryPoints.http.redirect]
  29. # entryPoint = "https"
  30. [entryPoints.https]
  31. address = ":443"
  32. compress = true
  33. [entryPoints.https.tls]
  34. [[entryPoints.https.tls.certificates]]
  35. certFile = "/data/ssl/lab.com.crt"
  36. keyFile = "/data/ssl/lab.com.key"
  37.  
  38. # 控制台端口
  39. [entryPoints.traefik-api]
  40. address = ":4399"
  41. # 如果不想公开控制台,可以参考下面的配置生成你自己的 BA 账号密码
  42. # [entryPoints.traefik-api.auth]
  43. # [entryPoints.traefik-api.auth.basic]
  44. #htpasswd -nb soulteary soulteary
  45. users = ["soulteary:$apr1$hVv8KPU8$IiTLEE5QYKgd4mZuCXpOD."]
  46. [entryPoints.traefik-api.redirect]
  47. entryPoint = "https"
  48.  
  49. # Ping端口
  50. [entryPoints.traefik-ping]
  51. address = ":4398"
  52. [entryPoints.traefik-ping.redirect]
  53. entryPoint = "https"
  54.  
  55. ################################################################
  56. # Traefik File configuration
  57. ################################################################
  58.  
  59. [file]
  60. [backends]
  61. [backends.dashboard]
  62. [backends.dashboard.servers.server1]
  63. url = "http://127.0.0.1:4399"
  64. [backends.ping]
  65. [backends.ping.servers.server1]
  66. url = "http://127.0.0.1:4398"
  67.  
  68. [frontends]
  69. [frontends.dashboard]
  70. entrypoints = ["https"]
  71. backend = "dashboard"
  72. [frontends.dashboard.routes.route01]
  73. rule = "Host:dashboard.lab.com"
  74. [frontends.ping]
  75. entrypoints = ["https"]
  76. backend = "ping"
  77. [frontends.ping.routes.route01]
  78. rule = "Host:ping.lab.com"
  79. [frontends.ping.routes.route02]
  80. rule = "ReplacePathRegex: ^/ /ping"
  81.  
  82. ################################################################
  83. # Traefik logs configuration
  84. ################################################################
  85.  
  86. # Traefik logs
  87. # Enabled by default and log to stdout
  88. #
  89. # Optional
  90. #
  91. # Default: os.Stdout
  92. [traefikLog]
  93. filePath = "/data/logs/traefik.log"
  94.  
  95. [accessLog]
  96. filePath = "/data/logs/access.log"
  97.  
  98. # Format is either "json" or "common".
  99. #
  100. # Optional
  101. # Default: "common"
  102. #
  103. # format = "common"
  104.  
  105. ################################################################
  106. # 访问日志 配置
  107. ################################################################
  108.  
  109. # Enable access logs
  110. # By default it will write to stdout and produce logs in the textual
  111. # Common Log Format (CLF), extended with additional fields.
  112. #
  113. # Optional
  114. #
  115. # [accessLog]
  116.  
  117. # Sets the file path for the access log. If not specified, stdout will be used.
  118. # Intermediate directories are created if necessary.
  119. #
  120. # Optional
  121. # Default: os.Stdout
  122. #
  123. # filePath = "/path/to/log/log.txt"
  124.  
  125. # Format is either "json" or "common".
  126. #
  127. # Optional
  128. # Default: "common"
  129. #
  130. # format = "common"
  131.  
  132. ################################################################
  133. # API 及 控制台 配置
  134. ################################################################
  135.  
  136. # 启用API以及控制台
  137. [api]
  138. # 入口点名称
  139. entryPoint = "traefik-api"
  140.  
  141. # 开启控制台(默认开启)
  142. dashboard = true
  143.  
  144. # 默认协议
  145. defaultEntryPoints = ["http"]
  146.  
  147. ################################################################
  148. # Ping 配置
  149. ################################################################
  150.  
  151. # 启用 ping
  152. [ping]
  153. # 入口点名称
  154. entryPoint = "traefik-ping"
  155.  
  156. ################################################################
  157. # Docker 后端配置
  158. ################################################################
  159.  
  160. # 启用Docker后端
  161. [docker]
  162.  
  163. # Docker服务后端
  164. endpoint = "unix:///var/run/docker.sock"
  165. # 默认域名
  166. domain = "traefix.lab.com"
  167. # 监控docker变化
  168. watch = true
  169.  
  170. # 使用自定义模板(可选)
  171. # filename = "docker.tmpl"
  172.  
  173. # 对容器默认进行暴露(默认开启)
  174. # 如果关闭选项,则容器不包含 `traefik.enable=true` 标签,就不会被暴露
  175. exposedbydefault = false
  176.  
  177. # 使用绑定端口的IP地址取代内部私有网络(默认关闭)
  178. usebindportip = false
  179.  
  180. # 使用 Swarm Mode (默认关闭)
  181. swarmmode = false
  182.  
  183. # Enable docker TLS connection.
  184. #
  185. # Optional
  186. #
  187. # [docker.tls]
  188. # ca = "/etc/ssl/ca.crt"
  189. # cert = "/etc/ssl/docker.crt"
  190. # key = "/etc/ssl/docker.key"
  191. # insecureskipverify = true

相关资源

如果你有更多对 Header 的定制需求,或者转发需求,可以了解一下下面的文档。

当然如果你想要配合 UFW(iptable) 使用,那么可以参考这篇文章,直接裸跑 Traefik

其他

Traefik 的介绍就先到这里,或许等 1.7 正式发布后,我会更新额外的内容。

--EOF

Traefik是一个基于Kubernetes的Ingress控制器,用于在Kubernetes集群中处理入站网络流量。您可以通过在Kubernetes集群中使用Traefik来实现负载均衡、路由和HTTPS等功能。 要在Kubernetes中使用Traefik,您可以按照以下步骤进行操作: 1. 首先,您需要添加Traefik的Helm chart仓库到您的Kubernetes集群中。您可以使用以下命令将Traefik的Helm chart仓库添加到Helm中: ``` helm repo add traefik https://helm.traefik.io/traefik ``` 2. 然后,您可以使用Helm来安装Traefik。您可以使用以下命令来安装Traefik: ``` helm install traefik traefik/traefik ``` 3. 安装完成后,Traefik将会被部署到您的Kubernetes集群中。您可以使用以下命令来验证Traefik的部署状态: ``` kubectl get pods -n <namespace> ``` 4. 一旦Traefik部署成功,您可以通过创建Ingress资源来配置Traefik的行为。您可以使用以下命令创建一个简单的Ingress资源: ``` apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-service port: number: 80 ``` 在这个示例中,Traefik将会将来自example.com的流量路由到名为example-service的后端服务。 5. 您还可以使用Traefik提供的其他功能,如TLS证书管理和动态配置等。您可以参考Traefik官方文档以了解更多详细的配置选项和用法。 总结起来,要在Kubernetes中使用Traefik,您需要添加Traefik的Helm chart仓库,并使用Helm来安装Traefik。然后,您可以通过创建Ingress资源来配置Traefik的行为,实现负载均衡和路由等功能。记得查看官方文档以获取更多使用Traefik的详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值