Traefik Dashboard and IngressRoute not working

After migrating to traefik v3 the dashboard is not showing the IngressRoute objects. It will only show the objects defined by k8s Ingress object. Also the routing does not work with this object

here is an example of httbin definition

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: httpbin
spec:
  entryPoints:
  - websecure
  routes:
  - kind: Rule
    match: PathPrefix(`/get`) && Method(`GET`)
    services:
    - name: httpbin
      port: 80

What am I missing here?

Additional problem is the dashboard. Treafik is installed with this chart GitHub - traefik/traefik-helm-chart: Traefik Proxy Helm Chart v 29.0.1

if i add the following values to values.yaml the IngressRoute will not be installed.

ingressRoute:
  dashboard:
    enabled: true

I had to manually add this ingressroute so I was able to access the dashboard via port-forward

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  annotations:
    meta.helm.sh/release-name: traefik
    meta.helm.sh/release-namespace: ingress
  generation: 1
  labels:
    app.kubernetes.io/instance: traefik-ingress
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: traefik
    helm.sh/chart: traefik-29.0.1
  name: traefik-dashboard
  namespace: ingress
spec:
  entryPoints:
    - traefik
  routes:
    - kind: Rule
      match: PathPrefix(`/dashboard`) || PathPrefix(`/api`)
      services:
        - kind: TraefikService
          name: api@internal

This object is however visible in the dashboard.

What is going on here? Could anyone give me any pointers the documentations is not mentioning these changes. Is my configuration wrong?

Having the same issue, although I was able to use:

ingressRoute:
  dashboard:
    enabled: true

to create the IngressRoute. It just doesn't work. It looks the same as yours.

I gave up on this. I used the highest version 2.

Coming back to this after a year. We need to update but no solution in sight.

I am using helm chart traefik 37.3.0 · traefik/traefik
v37.3.0

my values.yaml is

deployment:
  replicas: null
autoscaling:
  enabled:     true
  minReplicas: ${min_replicas}
  maxReplicas: ${max_replicas}
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type:               Utilization
          averageUtilization: 80
    - type: Resource
      resource:
        name: memory
        target:
          type:               Utilization
          averageUtilization: 80
updateStrategy:
  # -- Customize updateStrategy: RollingUpdate or OnDelete
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 0
    maxSurge: 1
resources:
  requests:
    cpu: "${cpu_requests}"
    memory: "256Mi"
  limits:
    memory: "256Mi"
affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app.kubernetes.io/name: '{{ template "traefik.name" . }}'
            app.kubernetes.io/instance: '{{ .Release.Name }}-{{ .Release.Namespace }}'
        topologyKey: kubernetes.io/hostname
additionalArguments:
    - "--accesslog=true"
    - "--accesslog.format=json"
    - "--accesslog.fields.defaultmode=drop"
    - "--accesslog.fields.names.StartUTC=keep"
    - "--accesslog.fields.names.ClientHost=keep"
    - "--accesslog.fields.names.DownstreamContentSize=keep"
    - "--accesslog.fields.names.DownstreamStatus=keep"
    - "--accesslog.fields.names.Duration=keep"
    - "--accesslog.fields.names.OriginStatus=keep"
    - "--accesslog.fields.names.RequestAddr=keep"
    - "--accesslog.fields.names.RequestMethod=keep"
    - "--accesslog.fields.names.RequestPath=keep"
    - "--accesslog.fields.names.RequestProtocol=keep"
    - "--accesslog.fields.names.RequestScheme=keep"
    - "--accesslog.fields.names.RouterName=keep"
    - "--accesslog.fields.names.ServiceName=keep"
    - "--accesslog.fields.names.TLSVersion=keep"
    - "--accesslog.fields.names.level=keep"
    - "--accesslog.fields.names.time=keep"
    - "--accesslog.fields.headers.names.X-Auth-User=keep"
    - "--accesslog.fields.headers.names.X-Auth-Sub=keep"
    - "--accesslog.fields.headers.names.X-Auth-Origin-Uuid=keep"
    - "--providers.kubernetesCRD.ingressclass=${ingress_class}"
    - "--providers.kubernetesingress.ingressClass=${ingress_class}"
    - "--providers.kubernetescrd.allowCrossNamespace=true"
    - "--entryPoints.web.http.redirections.entryPoint.to=websecure"
    - "--entryPoints.web.http.redirections.entryPoint.scheme=https"
    - "--log.level=DEBUG"

ingressRoute:
  dashboard:
    annotations:
      kubernetes.io/ingress.class: ${ingress_class}
providers:
  kubernetesCRD:
    allowExternalNameServices: true

  kubernetesIngress:
    allowExternalNameServices: true

core:
  defaultRuleSyntax: v2

dashboard still does not work. I use port-forward (since I do not want to expose the dashboard ) and get “404 page not found”

output from the traefik pod

    ports:
    - containerPort: 9100
      name: metrics
      protocol: TCP
    - containerPort: 8080
      name: traefik
      protocol: TCP
    - containerPort: 8000
      name: web
      protocol: TCP
    - containerPort: 8443
      name: websecure
      protocol: TCP

in default chart values the dashboard is enabled

api:
  # -- Enable the dashboard
  dashboard: true
  # -- Configure API basePath
  basePath: ""  # @schema type:[string, null]; default: "/"

http://localhost:8080/dashboard/

I now used a fresh chart install without my old values and it only worked after I used this.

ingressRoute:
  dashboard:
    enabled: true

Also I noticed that even though in default values.yaml you have

api:
  dashboard: true

when the pod starts there are additional args listed bellow.

    containers:
    - args:
      - --entryPoints.metrics.address=:9100/tcp
      - --entryPoints.traefik.address=:8080/tcp
      - --entryPoints.web.address=:8000/tcp
      - --entryPoints.websecure.address=:8443/tcp
      - --api.dashboard=true
      - --ping=true
      - --metrics.prometheus=true
      - --metrics.prometheus.entrypoint=metrics
      - --providers.kubernetescrd
      - --providers.kubernetescrd.allowEmptyServices=true
      - --providers.kubernetesingress
      - --providers.kubernetesingress.allowEmptyServices=true
      - --providers.kubernetesingress.ingressendpoint.publishedservice=default/traefik
      - --entryPoints.websecure.http.tls=true
      - --log.level=INFO

Notice here that after your upgrade -–api.dashboard=true has to be present.

Documentation can be misleading. Under IngressRoute helm values you can jump to the conclusion that you are exposing your dashboard to the internet. But if you carefully read the whole block you can see that the IngressRoute is created only for the entry point traefik. This does not expose it to internet. Your public traefik service with type of LoadBalancer is listening on 80 and 443. So you get no request to the cluster with port 8080.

    # -- Specify the allowed entrypoints to use for the dashboard ingress route, (e.g. traefik, web, websecure).
    # By default, it's using traefik entrypoint, which is not exposed.
    # /!\ Do not expose your dashboard without any protection over the internet /!\
    entryPoints: ["traefik"]