traefik是边缘路由网关
| Nginx Ingress | Traefik ingress | |
|---|---|---|
| 协议 | http/https、http2、grpc、tcp/udp | http/https、http2、grpc、tcp、tcp+tls |
| 路由匹配 | host、path | host、path、headers、query、path prefix、method |
| 命名空间支持 | - | 共用或指定命名空间 |
| 部署策略 | - | 金丝雀部署、蓝绿部署、灰度部署 |
| upstream探测 | 重试、超时、心跳探测 | 重试、超时、心跳探测、熔断 |
| 负载均衡算法 | RR、会话保持、最小连接、最短时间、一致性hash | WRR、动态RR、会话保持 |
| 优点 | 简单易用,易接入 | Golang编写,部署容易,支持众多的后端,内置WebUI |
| 缺点 | 没有解决nginx reload,插件多,但是扩展性能查差 | 这么一看好像没啥缺点 |
x1#将 Traefik 的图表存储库添加到 Helm:2helm repo add traefik https://helm.traefik.io/traefik3
4#更新图表存储库5helm repo update6
7#helm并使用命令行安装它:8kubectl create ns traefik-v2 #创建命名空间9
10helm install --namespace=traefik-v2 \11 traefik traefik/traefik12 13#暴露web服务14
15vim dashboard.yaml16
17apiVersion: traefik.containo.us/v1alpha118kind: IngressRoute19metadata:20 name: dashboard21 namespace: traefik-v222spec:23 entryPoints:24 - web25 routes:26 - match: Host(`traefik.ts.cn`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))27 kind: Rule28 services:29 - name: api@internal30 kind: TraefikService31 32 33#hosts解析:34170.11.0.5 traefik.ts.cn35
36#访问端口查看37[root@k8s-master traefik-2.7.0]#kubectl get svc -n traefik-v2 38NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE39traefik LoadBalancer 10.1.168.121 <pending> 80:32361/TCP,443:30763/TCP 11d40
41#浏览器访问42traefik.ts.cn:32361/dashboard43
中间件附加到请求路由上面,经过绑定的中间件,比如鉴权,路由前缀、限流、熔断等中间件后转发到服务中。
SmartCloud的web页面不设置前缀,域名直接访问
Ids4服务需要创建两个路由:
- 一个为ids4登录页面,不设置前缀
- 一个为网关调用ids4服务,设置前缀
xxxxxxxxxx211# cd k8s_yaml/traefik2# vim middleware-headercors.yaml3apiVersiontraefik.containo.us/v1alpha14kindMiddleware5metadata6 namemid-headercors #服务调用的名字7spec8 headers9 accessControlAllowMethods10"GET"11"OPTIONS"12"PUT"13"POST"14"DELETE"15 accessControlAllowOriginList16"*"17 accessControlAllowHeaders18"*"19 accessControlMaxAge10020 addVaryHeadertrue21
x
1# cd k8s_yaml/traefik2# vim middleware-auth.yaml3apiVersiontraefik.containo.us/v1alpha14kindMiddleware5metadata6 namemid-auth #服务调用的名字7spec8 forwardAuth9 addresshttp//localhost30003/AllResource/VerifyToken #鉴权的地址(鉴权地址)10 trustForwardHeadertrue11
前缀中间件因无法全部写到一个文件中,所有需要每个服务创建一个相对应的路由中间件
x
1# cd k8s_yaml/traefik2# vim middleware-replacepathregex.yaml3apiVersiontraefik.containo.us/v1alpha14kindMiddleware5metadata6 namemid-replacepathregex-common #路由前缀替换中间件(正则)7spec8 replacePathRegex9 regex^/Common/(.*) #匹配路由中的Common + 后续内容10 replacement/api/$1 #替换成api + 后续内容11 12---13apiVersiontraefik.containo.us/v1alpha114kindMiddleware15metadata16 namemid-replacepathregex-personalization17spec18 replacePathRegex19 regex^/pss1/(.*) 20 replacement/api/$121 22---23apiVersiontraefik.containo.us/v1alpha124kindMiddleware25metadata26 namemid-replacepathregex-ids427spec28 replacePathRegex29 regex^/IdentityServer/(.*) 30 replacement/api/$131
32
33---34apiVersiontraefik.containo.us/v1alpha135kindMiddleware36metadata37 namemid-replacepathregex-config38spec39 replacePathRegex40 regex^/Config/(.*)41 replacement/api/$142
43
44---45apiVersiontraefik.containo.us/v1alpha146kindMiddleware47metadata48 namemid-replacepathregex-mongo49spec50 replacePathRegex51 regex^/Mongo/(.*) 52 replacement/api/$153 中间件需要执行:
每个中间件文件需要单独执行,路由配置也需要单独执行
x
1kubectl apply -f dapr-pess.yaml x
1# cd k8s_yaml/traefik2# vim ingressroute-services.yaml3apiVersiontraefik.containo.us/v1alpha14kindIngressRoute5metadata6 nameingressroute-service7spec8 entryPoints9web10 routes11matchHost(`ts.cn`) && PathPrefix(`/Common`) #设置域名ts.cn,并增加前缀 Common12 kindRule13 middlewares#添加中间件14namemid-headercors #中间件1 (Cors)15namemid-auth #中间件2(身份认证中间件)ids4服务不用加这个中间件16namemid-replacepathregex-common #中间件3 (替换路径)17 services18namecommon-svc #服务svc19 port8020matchHost(`ts.cn`) && PathPrefix(`/Config`)21 kindRule22 middlewares23namemid-headercors24namemid-auth 25namemid-replacepathregex-config26 services27nameconfig-svc28 port8029matchHost(`ts.cn`) && PathPrefix(`/MongoServer`)30 kindRule31 middlewares32namemid-headercors33namemid-auth 34namemid-replacepathregex-config35 services36namemongo-svc37 port8038matchHost(`ts.cn`) && PathPrefix(`/Pess`)39 kindRule40 middlewares41namemid-headercors42namemid-auth 43namemid-replacepathregex-personalization44 services45namepersonalization-svc46 port8047matchHost(`ts.cn`) && PathPrefix(`/IdentityServer`)48 kindRule49 middlewares50namemid-headercors51namemid-auth 52namemid-replacepathregex-ids453 services54nameids4-svc55 port8056
57
58
xxxxxxxxxx311#cd k8s_yaml/traefik2#vim ingressroute-web.yaml3apiVersiontraefik.containo.us/v1alpha14kindIngressRoute5metadata6 nameingressroute-service7spec8 entryPoints9web10 routes11matchHost(`ts.cn`) #设置域名ts.cn12 kindRule13 services14namemvc-svc #服务svc15 port8016
17---18
19apiVersiontraefik.containo.us/v1alpha120kindIngressRoute21metadata22 nameingressroute-service23spec24 entryPoints25web26 routes27matchHost(`ts.cn`) #设置域名ts.cn28 kindRule29 services30nameids4-svc #服务svc31 port80xxxxxxxxxx101apiVersiontraefik.containo.us/v1alpha12kindMiddleware3metadata4 nameflask-k8s-traffic5 namespacepro6spec7 rateLimit8 # 1s 内接收的请求数的平均值不大于500个,高峰最大1000个请求9 burst100010 average500xxxxxxxxxx91apiVersiontraefik.containo.us/v1alpha12kindMiddleware3metadata4 namek8s-flask-breaker5 namespacepro6spec7 circuitBreaker8 expressionLatencyAtQuantileMS(50.0) > 1009 # 50% 的请求比例响应时间大于 100MS 时熔断