1.环境

kubernetes:v1.20.1

traefik:2.4.8

链接:middleware的使用(stripprefix)

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    #关键点!!!!!!!

 

Logo

开源、云原生的融合云平台

更多推荐