Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。
除了众多的功能之外,Traefik 的与众不同之处还在于它会自动发现适合你服务的配置。当 Traefik 在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求。
Traefik 兼容所有主流的集群技术,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同时处理多种方式。(甚至可以用于在裸机上运行的比较旧的软件。)
有了Traefik,就不需要维护和同步一个单独的配置文件:一切都会自动、实时地发生(没有重新启动,没有连接中断)。使用Traefik,您可以花时间在系统中开发和部署新特性,而不是配置和维护其工作状态。

<!--more-->
Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。
传统的边缘路由器(或反向代理)需要一个包含到服务的每个可能路由的配置文件,Traefik从服务本身获取它们。
在部署您的服务时,您需要附加一些信息,告诉Traefik服务可以处理的请求的特征。
这意味着在部署服务时,Traefik会立即检测到它并实时更新路由规则。反之亦然:当您从基础设施中删除服务时,路由将相应地消失。
您不再需要创建和同步混杂着IP地址或其他规则的配置文件。
在了解 Traefik 之前有几个核心概念我们必须要了解:
<code>Providers</code> 用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
<code>Entrypoints</code> 监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。
<code>Routers</code> 分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
<code>Services</code> 将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。
<code>Middlewares</code> 中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
由于 Traefik 2.X 版本和之前的 1.X 版本不兼容,而且1.X 已经停止更新了。我们这里选择功能更加强大的 2.X 版本来和大家进行讲解,我们这里使用的镜像是 <code>traefik:2.3.2</code>。
本文档使用<code>KubernetesCRD</code> 作为<code>provider</code>,所以需要创建CRD
traefik-crd.yaml
traefik-rbac.yaml
在 Traefik 中的配置可以使用两种不同的方式:
动态配置:完全动态的路由配置
静态配置:启动配置
<code>静态配置</code>中的元素(这些元素不会经常更改)连接到 providers 并定义 Treafik 将要监听的 entrypoints。
在 Traefik 中有三种方式定义静态配置:在配置文件中、在命令行参数中、通过环境变量传递
<code>动态配置</code>包含定义系统如何处理请求的所有配置内容,这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。
我们这里将通用的基本配置放到静态配置里面,以<code>configmap</code> 形式实现
traefik-config-cm.yaml
traefik-deploy.yaml
这时候就可以通过节点http://IP:8090,可以看到<code>dashboard</code>相关信息
traefik 通过CRD实现动态修改配置文件
可以在下表中找到可用自定义资源
Kind
Purpose
Concept Behind
IngressRoute
HTTP Routing
HTTP router
Middleware
Tweaks the HTTP requests before they are sent to your service
HTTP Middlewares
TraefikService
Abstraction for HTTP loadbalancing/mirroring
HTTP service
IngressRouteTCP
TCP Routing
TCP router
IngressRouteUDP
UDP Routing
UDP router
TLSOptions
Allows to configure some parameters of the TLS connection
TLSStores
Allows to configure the default TLS store
Traefik 已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,这里用traefik dashboard 和 <code>whoami</code> 举例。
首先创建whoami 的 deployment
whoami.yaml
dashboard.yaml
因为静态配置文件指定了ingressclass,所以这里的<code>annotations</code> 要指定,否则访问会404
whoami-ingressroute.yaml
接下来配置 Hosts,客户端想通过域名访问服务,必须要进行 DNS 解析,这里可以通过 DNS 服务器进行域名解析,也可以修改 hosts 文件将 Traefik 指定节点的 IP 和自定义 host 绑定
如果我们需要用 HTTPS 来访问我们这个应用的话,就需要监听 <code>websecure</code> 这个入口点,也就是通过 443 端口来访问,同样用 HTTPS 访问应用必然就需要证书,这里我们用 <code>openssl</code> 来创建一个自签名的证书:
然后通过 Secret 对象来引用证书文件:
这个时候我们就可以创建一个 HTTPS 访问应用的 IngressRoute 对象了:
whoami-tcp.yaml
whoami-udp.yaml
中间件是 Traefik2.0 中一个非常有特色的功能,我们可以根据自己的各种需求去选择不同的中间件来满足服务,Traefik 官方已经内置了许多不同功能的中间件,其中一些可以修改请求,头信息,一些负责重定向,一些添加身份验证等等,而且中间件还可以通过链式组合的方式来适用各种情况。
白名单举例
上面的dashboard属于重要信息,我们可以设置只能白名单的ip可以访问
创建白名单中间件
middleware-ipwhitelist.yaml
然后将这个中间件附加到 dashboard的服务上面去
这个时候我们再去访问dashboard,不在白名单的就会报403,关于更多中间件的用法可以查看文档 Traefik Docs。
在实际的生产环境,除了上线业务之外,还有更复杂的使用要求。
在开始traefik的高级用法之前,还需要了解一个<code>TraefikService</code>,通过把<code>TraefikService</code>注册到CRD来实现更复杂的请求设置。
<code>TraefikService</code> 目前能用于以下功能 servers load balancing.(负载均衡) services Weighted Round Robin load balancing.(权重轮询) services mirroring.(镜像)
创建k8s service
创建IngressRoute
创建TraefikService
需要注意的是现在我们配置的 Service 不再是直接的 Kubernetes 对象了,而是上面我们定义的 TraefikService 对象
这里的流量复制演示2种
流量复制到k8s 的service
流量从Traefik Service 导入