Traefik-Midder-Router

前言:
一直在找关于traefik中间件的资料,可是关于这方面的资料确实很少。
在学习了一段时间后,将其总结出来。

1.安装traefik

在k8s集群的环境中,将traefik按照网盘链接中的yaml资源安装完成

链接:https://pan.baidu.com/s/1Ng4sFkdkGk_3dSxMEA8MTg?pwd=nhxc 
提取码:nhxc

image.png

[root@k8s-master ~]# kubectl get pods 
NAME                               READY   STATUS    RESTARTS   AGE
traefik-ingress-controller-fmsqx   1/1     Running   0          6m39s
traefik-ingress-controller-hjvnw   1/1     Running   0          6m39s
traefik-ingress-controller-xwf4b   1/1     Running   0          6m39s
[root@k8s-master ~]# 

2.配置 Traefik 路由规则

在 Kubernetes 中 Traefik 支持 CRD 和 Ingress 两种方式进行路由规则配置。
因为公司内的trafik是由CRD的方式 ,所以本次实验也是基于CRD的方式来进行路由规则的配置。

2.1 创建基于nginx镜像的myweb容器的yaml

创建service

[root@k8s-master ~]# kubectl create service nodeport myweb --tcp=800:80--dry-run=client -o yaml >myweb.yaml

创建serviceaccount

 kubectl create serviceaccount myweb --dry-run=client -o yaml >>myweb.yaml 

创建基于deploymnet的myweb容器

kubectl create deployment myweb --image=nginx:alpine --port=80 --dry-run=client -o yaml >>myweb.yaml 

查看myweb.yaml文件的配置

apiVersion: v1
kind: Service
metadata:
  labels:
    app: myweb
  name: myweb
spec:
  type: NodePort
  ports:
  - name: http
    port: 800
    protocol: TCP
    targetPort: 80
    nodePort: 31011
  selector:
    app: myweb
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myweb
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myweb
  name: myweb
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      serviceAccountName: myweb
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80

2.2 创建myweb容器

[root@k8s-master ~]# kubectl apply -f myweb.yaml 

[root@k8s-master ~]# kk
NAME                               READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
traefik-ingress-controller-fmsqx   1/1     Running   0          24m   10.244.235.194   k8s-master   <none>           <none>
traefik-ingress-controller-hjvnw   1/1     Running   0          24m   10.244.85.194    k8s-node01   <none>           <none>
traefik-ingress-controller-xwf4b   1/1     Running   0          24m   10.244.58.195    k8s-node02   <none>           <none>
myweb-65c8ffc84b-6gsn6             1/1     Running   0          38s   10.244.85.195    k8s-node01   <none>           <none>
myweb-65c8ffc84b-pf79s             1/1     Running   0          38s   10.244.58.196    k8s-node02   <none>           <none>
[root@k8s-master ~]# 

2.2.1 测试容器image.png

2.3 配置traefik路由

当部署完后启动 Traefik 时,定义了入口点(端口号和对应的端口名称),然后 Kubernetes 集群外部就可以通过访问 Traefik 服务器地址和配置的入口点对 Traefik 服务进行访问,在访问时一般会带上 “域名” + “入口点端口”,然后 Traefik 会根据域名和入口点端口在 Traefik 路由规则表中进行匹配,如果匹配成功,则将流量发送到 Kubernetes 内部应用中与外界进行交互。这里面的域名与入口点与对应后台服务关联的规则,即是 Traefik 路由规则。
上文在安装traefik中的yaml中已经定义好入口web为80端口

创建traefik-sys-myweb-route的yaml文件

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-sys-myweb-route
spec:
  entryPoints:
  - web 						#定义流量入口   web:80
  routes:
  - match: Host(`192.168.1.81`) && PathPrefix(`/`)    #定义主机ip地址
    kind: Rule
    services:
      - name: myweb
        port: 800

image.png
直接访问成功

2.4 访问的流量图

image.png

3.配置midder中间件

Traefik Middlewares 是一个处于路由和后端服务之前的中间件,在外部流量进入 Traefik,且路由规则匹配成功后,将流量发送到对应的后端服务前,先将其发给中间件进行一些列处理(类似于过滤器链 Filter,进行一系列处理),例如,添加 Header 头信息、鉴权、流量转发、处理访问路径前缀、IP 白名单等等,经过一个或者多个中间件处理完成后,再发送给后端服务,这个就是中间件的作用。

3.1 去除请求路径前缀中间件

例如,有一个路由规则中配置的域名路径为 “{host}/one”,traefik 进行路由规则进行流量转发时,也会带上这个前缀作为相对路径发送到后端服务中,而对后端服务来说,一般都是以 “/” 根路径作为相对路径的,如果带上这个路径到后端服务中,那么后端服务则变成以 “/one” 作为相对路径,显然,这样会导致状态码 404 错误。所以,很多时候我们需要去掉这个前缀。

3.2 创建traefik-sys-myweb-middleware.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: myweb
spec:
  stripPrefix:
    prefixes:
      - /

3.3 在traefik-sys-myweb-route.yaml调用

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-sys-myweb-route
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`192.168.199.120`) && PathPrefix(`/`)
    kind: Rule
    services:
      - name: myweb
        port: 800
    middlewares:
      - name: myweb

猜你喜欢

转载自blog.csdn.net/xiaolong1155/article/details/130711687
今日推荐