Search code examples
traefikkubernetes-ingresstraefik-ingress

Traefik path based routing in kubernetes ingress not working as expected


I am trying to use the path based routing mechanism provided by Traefik ingress controller in Kubernetes but I have some issues with the url rewriting.

My [UPDATED] configuration is as follow

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/auth-type: "basic"
    traefik.ingress.kubernetes.io/auth-tls-insecure: "true"
    traefik.ingress.kubernetes.io/frontend-entry-points: "http,https"
    traefik.ingress.kubernetes.io/app-root: "/"
    traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    traefik.ingress.kubernetes.io/rewrite-target: "/"
  name: webapp-ingress
  namespace: my-company
spec:
  rules:
   - host: local-ubuntu
   - http:
      paths:
      - path: /
        backend:
          serviceName: webapp
          servicePort: 80
      - path: /db
        backend:
          serviceName: db-manager
          servicePort: 8081

The traffic is routed to the right services but the url is still prefixed with /db when I look at the log for the db-manager (kubernetes) service. What I would have expected with the PathPrefixStrip is that the traffic will be routed without the /db prefix to the container running the db-manager micro-service which is listening on / (http://db-manager:8081) on the backend side.

Am I missing something ? Is it supported by traefik or only nginx ? Thank you by advance for your feedback.

[EDIT]

To be more specific I observe the following with the current annotations discussed below

  • traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
  • traefik.ingress.kubernetes.io/rewrite-target: "/"

URL: http://local-ubuntu/db [OK] -> 200

Then other resources are loading but are pointing on the wrong base url

Example:

Resource URL is : http://local-ubuntu/public/css/bootstrap.min.css

But this should be : http://local-ubuntu/db/public/css/bootstrap.min.css (which works when I've tried manually)

I am not sure what I am missing here in the current configuration.


Solution

  • Regarding the static contents not being served, the documentation states the following:

    Use a *Strip matcher if your backend listens on the root path (/) but should be routeable on a specific prefix. For instance, PathPrefixStrip: /products would match /products but also /products/shoes and /products/shirts. Since the path is stripped prior to forwarding, your backend is expected to listen on /. If your backend is serving assets (e.g., images or Javascript files), chances are it must return properly constructed relative URLs. Continuing on the example, the backend should return /products/shoes/image.png (and not /images.png which Traefik would likely not be able to associate with the same backend). The X-Forwarded-Prefix header (available since Traefik 1.3) can be queried to build such URLs dynamically.