前言:
一直在找关于traefik中间件的资料,可是关于这方面的资料确实很少。
在学习了一段时间后,将其总结出来。
1.安装traefik
在k8s集群的环境中,将traefik按照网盘链接中的yaml资源安装完成
链接:https://pan.baidu.com/s/1Ng4sFkdkGk_3dSxMEA8MTg?pwd=nhxc
提取码:nhxc
[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 测试容器
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
直接访问成功
2.4 访问的流量图
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