一、简介
从 2019年 Traefik 正式推出 v2.0 版本开始,已经过了很多年。笔者一直在用 Traefik v1.7 没有升级,但由于公司业务的增长,在灰度发布、熔断和限流方面的需求愈发的强烈,原来 1.7 版本的功能已经无法满足当下的需求。
对比了同类型的 ingress controller 组件,例如 istio、kong、traefik2,结合业务改造的难易程度,在综合评估后决升级现有traefik到2.9版本。
Traefik v2.0 版本相较于 1.0+ 版本增加了许多功能,例如:
为了帮助用户可以从 1.x 版本过度到新版本,官方提供了迁移指南:https://doc.traefik.io/traefik/migration/v1-to-v2/
对于 kubernetes 用户,还提供了迁移工具来帮助将 Ingress 对象转换成新的 IngressRoute 格式,工具地址:https://github.com/traefik/traefik-migration-tool
二、安装 Traefik
支持多种方式安装 Traefik:
官方文档:https://doc.traefik.io/traefik/getting-started/install-traefik/
https://github.com/traefik/traefik-helm-chart
使用 Helm 安装的时候需要注意 helm version 的版本 Helm v3 > 3.9.0
本文以 kubernetes yaml 为例,讲解 Traefik v2 的安装。
2.1 创建 CRD 资源
在 traefik v2.0 版本后,开始使用 CRD(Custom Resource Definition)来完成路由配置等,所以需要提前创建 CRD 资源。
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/kubernetes-crd-definition-v1.yml
2.2 创建 RBAC 权限
Kubernetes 在 1.6 版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行颗粒度的控制。
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/kubernetes-crd-rbac.yml
2.3 创建 ConfigMap 配置文件
如果需要对 Traefik 配置的参数较多,通过 CLI 定义很不方便,会将其选项放在配置文件中写到 ConfigMap 中,然后再将其挂载到 traefik 容器中。
不过一般情况下通过静态参数配置的已经够用,根据实际情况自行决定。
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-configmap.yaml
2.4 部署 Traefik
Traefik 可以使用 Deployment 和 DaemonSet 两种方式部署,为了便于扩展这里以 DaemonSet 为例说明。
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ds.yml
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-svc.yml
Ingress 是 1.0+ 版本中的使用方式,虽然 2.0 版本向下兼容,但建议在新版本中使用 IngressRoute 的 Ingress Controller 的实现方式。
# 基于 Ingress 的 Traefik 配置方式
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ingress-ui.yml
# 基于 IngressRoute 的 Traefik 配置方式
shell> kubectl apply -f http://dlsw.maoxj.com.cn/yaml/k8s/traefik/v2.9/traefik-ingressroute-ui.yml
2.5 添加 IP 白名单
为提高安全性,通常情况下一些后台地址会设置 IP 访问白名单,只希望个别用户可以访问,例如 traefik 的 dashboard url,这个时候就可以使用 traefik 中的 IPWhiteList 中间件来完成。
# 定义 IP 访问白名单的中间件 IPWhiteList,指定可以访问的 IP 列表
shell> cat ip-while-middleware.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: ip-while-list-middleware
namespace: kube-system
spec:
ipWhiteList:
sourceRange:
- 127.0.0.1/32
- 10.200.11.95
ipStrategy:
depth: 1
shell> cat traefik-ui-ingress.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard-route
namespace: kube-system
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`traefik.k8s.91donkey.com`) && PathPrefix(`/api`, `/dashboard`,`/`)
services:
- kind: TraefikService
name: api@internal
middlewares:
- name: ip-while-list-middleware
curl -I http://traefik.k8s.91donkey.com/dashboard
```1) 修改 traefik daemonset,增加 forwarded header 参数```
- --entrypoints.web.forwardedheaders.insecure
# - --entrypoints.websecure.forwardedheaders.insecure # 启用 https 的转发 header
```2) 检查 nginx vhost,确保 proxy_set_header 与下列一致```
server {
server_name *.traefik.k8s.91donkey.com traefik.k8s.91donkey.com;
location / {
proxy_pass http://kubernetes_backend_traefik;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}
}
```3) 检查 iptables SNAT 规则```
2.6 熔断
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止该服务的调用。
2.7 限流
2.8 灰度发布
Traefik 支持灰度发布,有时候也会成为 金丝雀发布(Canary),就是让一部分测试的服务也参与到线上去,测试观察是否符合上线要求。
但 Traefik 不支持将自定义的请求头信息流量转发到指定的后端服务上。Traefik 支持的 Header 路由转发,只能对 Header 添加 / 更新头信息。因此,Traefik 的灰度发布实际上只是基于权重轮询(WRR)的路由转发方式。
shell> kubectl create deployment nginx-demo1 --image=nginx:1.18.0
shell> kubectl expose deployment nginx-demo1 --port=80
shell> kubectl create deployment nginx-demo2 --image=nginx:1.18.0
shell> kubectl expose deployment nginx-demo2 --port=80
shell> cat traefik-service.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
name: nginx-wrr
spec:
weighted:
services:
- name: nginx-demo1
weight: 5 # 定义权重
port: 80
kind: Service # 可选,默认就是 Service
- name: nginx-demo2
weight: 1
port: 80
kind: Service
shell> cat ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: wrr-ingress-route
namespace: default
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`nginx.demo.91donkey.com`) && PathPrefix(`/`)
services:
- name: nginx-wrr
kind: TraefikService
2.9 基于 Header 的路由检查
在 IngressRoute 对象中定义了一些匹配规则:
# 检查域名的 Header 中是否包含指定的头信息,如果匹配则,则转发至后端服务上,反之,返回404状态码。
shell> cat ingress-route.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-demo-route
namespace: default
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`nginx.demo.91donkey.com`) && Headers(`x-poc-sn`,'MP203L6B')
services:
- port: 80
name: nginx-demo
# 验证,当匹配时返回200
shell> curl -I -H "x-poc-sn: MP203L6B" nginx.demo.91donkey.com
HTTP/1.1 200 OK
Server: openresty
Date: Mon, 23 Oct 2023 09:31:36 GMT
Content-Type: text/html
Content-Length: 641
Connection: keep-alive
Accept-Ranges: bytes
Etag: "6535d8f7-281"
Last-Modified: Mon, 23 Oct 2023 02:22:47 GMT
X-Via-Svr: x2q-devk8s-proxy0211.k8s.host.com
页面更新:2024-02-08
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号