kubernetes使用traefik作为ingress(相同域名不同路径访问不同服务)Middleware的StripPrefix进行实现
1.环境kubernetes:v1.20.1traefik:2.4.82.安装kubeadm安装k8shelm安装traefik#Add Traefik's chart repository to Helm:helm repo add traefik https://helm.traefik.io/traefik#You can update the chart repository by run
1.环境
kubernetes:v1.20.1
traefik:2.4.8
2.安装
kubeadm安装k8s
helm安装traefik
#Add Traefik's chart repository to Helm:
helm repo add traefik https://helm.traefik.io/traefik
#You can update the chart repository by running:
helm repo update
#And install it with the helm command line:
#Create namespace
kubectl create ns traefik-v2
# Install in the namespace "traefik-v2"
helm install --namespace=traefik-v2 traefik traefik/traefik
说明:UI界面默认没有通过NodePort进行透出,我自己修改service透出的
3.准备测试环境
#新建两个测试POD
kubectl create deployment nginx --image=nginx:1.19.1
kubectl create deployment nginx2 --image=nginx:1.19.1
#为两个POD建service
kubectl create svc clusterip nginx --tcp=80:80
kubectl create svc clusterip nginx2 --tcp=80:80
#进入POD修改index.html便于区分
kubectl exec -it nginx-65b75dbbf6-ddgfb /bin/bash
echo "111111111" > /usr/share/nginx/html/index.html
kubectl exec -it nginx2-82b75dbcf5-dfghv /bin/bash
echo "222222222" > /usr/share/nginx/html/index.html
4.下面通过两种方式进行实现
须知:在traefik中是通过中间件去除访问路径,比如/bar不会把该路径带入带后端访问变成 /usr/share/nginx/html/bar/,这是个坑点
错误的配置是:
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: foo-bar
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
rules:
- host: nginx.kk.it
http:
paths:
- path: /bar
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
- path: /foo
pathType: Prefix
backend:
service:
name: nginx2
port:
number: 80
如果不用中间件,就会返回404,并且后端日志会打印:
4.1 ingress方式实现相同域名不同路径访问不同服务
1.中间件middleware的配置(不管哪种方式都要用到)
cat nginx-middleware.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: nginx-stripprefix
spec:
stripPrefix:
prefixes:
- /bar
- /foo
#意思就是traefik请求后端时,把/bar或者/foo路径给脱掉
发布:kubectl apply -f nginx-middleware.yaml
2.ingress文件配置
cat nginx-ingress-path.yaml
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
name: foo-bar
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/router.entrypoints: web
traefik.ingress.kubernetes.io/router.middlewares: default-nginx-stripprefix@kubernetescrd #就是多了这一行!!!!!!!
#traefik.ingress.kubernetes.io/router.middlewares 这个可以从https://doc.traefik.io/traefik/routing/providers/kubernetes-ingress/的Annotations里找到
#default-nginx-stripprefix可以从UI界面上看到,@kubernetescrd就是固定搭配,不用动
spec:
rules:
- host: nginx.kk.it
http:
paths:
- path: /bar
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
- path: /foo
pathType: Prefix
backend:
service:
name: nginx2
port:
number: 80
访问traefik流量入口
4.2 IngressRoute方式实现相同域名不同路径访问不同服务
1.中间件middleware的配置(不管哪种方式都要用到)
cat nginx-middleware.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: nginx-stripprefix
spec:
stripPrefix:
prefixes:
- /bar
- /foo
#意思就是traefik请求后端时,把/bar或者/foo路径给脱掉
发布:kubectl apply -f nginx-middleware.yaml
2.IngressRoute文件配置
cat nginx-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nginx-route
spec:
entryPoints:
- web
routes:
- match: Host(`nginx.kk.it`) && PathPrefix(`/bar`)
kind: Rule
services:
- name: nginx
port: 80
middlewares:
- name: nginx-stripprefix #关键点!!!!!!!
- match: Host(`nginx.kk.it`) && PathPrefix(`/foo`)
kind: Rule
services:
- name: nginx2
port: 80
middlewares:
- name: nginx-stripprefix #关键点!!!!!!!
更多推荐
所有评论(0)