2

we're (finally) migrating from Traefik 1 to 2. We run 400+ apps on GKE. Our one remaining challenge is this:

In Traefik 1 we set an annotation on each app's Ingress that adds a header to the request to the backend. The value of that header is unique to each Ingress. Here's an example with the value . Each app has another value in its Ingress.:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testapp
  namespace: test
  annotations:
    ingress.kubernetes.io/custom-request-headers: X-Backend-Hint:<appname>
spec:
...

Traefik 2 no longer supports this header. It seems that the only way to add such a request header to each app is by creating a unique customRequestHeaders middleware for each unique value, then adding that middleware to the matching Ingress. Like so:

---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: backend-hint-header
  namespace: test
spec:
  headers:
    customRequestHeaders:
      X-Backend-Hint: <appname>
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testapp
  namespace: test
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: test-backend-hint-header@kubernetescrd
spec:
...

Automating this is of course possible, but it does mean deploying 400+ almost identical middlewares. Won't that cause problems for Traefik?

Is this really the best way? Or can we somehow use a single middleware with a variable passed in via an Ingress annotation? Maybe something else I haven't thought of?

At this point, due to compatibility with other tools that reference Ingresses such as cert-manager and external-dns, we can't use the IngressRoute CRD yet but have to use classic Ingress.

Martijn Heemels
  • 7,438
  • 6
  • 39
  • 62

0 Answers0