部署 traefik 作为网关入口对流量进行转发.
需求背景
因业务需求,边缘端设备访问云端服务需要在网关这一侧来完成流量拦截验证,验证通过后才给放行流量到后端服务,因此我们需要一款便于插件开发的云原生的开源网关来承载这一任务,经调研, traefik 网关在插件开发这一块比较便捷,且应用比较灵活,所以我们选择在集群内部署一套 traefik 网关供业务侧使用。
部署方式
为了方便,我们用 helm 部署,由于某种科学原因,导致 charts 下载特别慢,首先,我们到 官网github 克隆仓库下来。加速我们的部署。
版本 v2.10.1 。
如果需要自定义部署参数,可直接对 values.yaml 文件进行编辑,我们本次更改到的参数:
- 开启访问日志,日志格式 json ,输出到 /tmp 目录(或者其他 pvc 挂载卷,不然其他目录没权限)。
执行命令部署。
1
2
3
4
5
6
7
|
cd traefik-helm-chart
# 部署
helm install traefik -n kube-system ./traefik
#更新
helm upgrade traefik -n kube-system ./traefik
|
路由配置
路由配置有 2 种方式,一种是原生的 Ingress 配置,一种是 traefik 的 crds 资源配置,我们本次用 traefik 的 IngressRoute 配置。
下面是配置样例,注意的点:目前发现 http 和 https 不能同时在同一分 yaml 配置里面设置监听。如果有发现其他能兼容的配置方法,可以共同探讨一下。
我们本次的目的是需要对从 traefik 进来的流量进行拦截,因为我们需要先提前开发好 webhook ,流量进入后,先转发到 webhook 验证,返回特定状态码即验证通过,拦截配置在 middlewares 处。
https 配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: yourservice-https-ingress
namespace: prod
spec:
entryPoints:
- websecure
# more fields...
routes:
- match: Host(`yourdomainname.com.com`) && PathPrefix(`/youruri`)
kind: Rule
services:
- name: yourservice-svc
port: 80
middlewares:
- name: forward-auth
tls:
secretName: yourdomainname.com
|
http 配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: yourservice-http-ingress
namespace: prod
spec:
entryPoints:
- web
# more fields...
routes:
- match: Host(`yourdomainname.com`) && PathPrefix(`/youruri`)
kind: Rule
services:
- name: yourservice-svc
port: 80
middlewares:
- name: forward-auth
|
中间件配置:
1
2
3
4
5
6
7
8
|
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: forward-auth
namespace: prod
spec:
forwardAuth:
address: https://yourauthadd.com
|
至此,我们就完成了对服务的流量转发配置,测试也验证通过。
最后
traefik 的配置比较模块化,比如我想配置 http2 相关的参数,我需要配置一个 Tlsoptions 来跟路由挂钩,从而实现配置生效。如下,就是同时兼容 http/1.1 和 h2 协议,并且开启 gzip 压缩传输:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: yourservice-https-ingress
namespace: dev
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`yourdomainname.com`)
services:
- name: yourservice-svc
port: 80
middlewares:
- name: enable-gzip-dev
tls:
options:
name: disable-h2-dev
namespace: dev
secretName: yourdomainname.com
---
apiVersion: traefik.io/v1alpha1
kind: TLSOption
metadata:
name: disable-h2-dev
namespace: dev
spec:
alpnProtocols:
- http/1.1
- h2
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: enable-gzip-dev
namespace: dev
spec:
compress: {}
|
总结
traefik 的配置比较灵活,相比 ingress nginx ,它的很多参数都是支持对单个路由生效的,这就避免诸如 h2 这种协议的配置,动一发而牵全身。
它也可以针对整个命名空间配置默认配置,然后插件开发也便捷,总的来说如果对 traefik 使用比较熟悉的话,用起来还是不错的。
唯一比较不好的缺点就是官方文档写得太散,指引有点烂,有点什么问题查起来很费劲。