如何去除 Kubernetes Traefik 入口中的路径前缀?

Ste*_*fen 4 kubernetes kubernetes-ingress k3s

我在 Ubuntu 20.04 上使用 k3s v1.22.7。我想/bar/xyz加入/xyz豆荚。如果没有中间件,我可以正确路由到 Pod,有了它,我可以从 Traefik 获得,就好像从/404中剥离发生在 Ingress 路径评估之前一样。网上的例子都是这样的……replacePathRegexstripPrefix

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix
spec:
  #replacePathRegex:
  #  regex: ^/(?:[^/]+)/(.*)
  #  replacement: /$1
  stripPrefix:
    prefixes:
      - /bar
      - /baz
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: foo-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.middlewares: strip-prefix@kubernetescrd
spec:
  rules:
  - host: example.org
    http:
      paths:
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 5001
      - path: /baz
        pathType: Prefix
        backend:
          service:
            name: foo-service
            port:
              number: 5002
Run Code Online (Sandbox Code Playgroud)

Ste*_*fen 7

看起来中间件需要命名空间前缀,所以要么

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix
  # No namespace defined
spec:
  stripPrefixRegex:
    regex:
    - ^/[^/]+
---
kind: Ingress
metadata:
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: default-strip-prefix@kubernetescrd
Run Code Online (Sandbox Code Playgroud)

或者

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix
  namespace: example # Namespace defined
spec:
  stripPrefixRegex:
    regex:
    - ^/[^/]+
---
kind: Ingress
metadata:
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: example-strip-prefix@kubernetescrd
Run Code Online (Sandbox Code Playgroud)

应该管用。

来源