What is the difference between a Kubernetes Ingress and a IngressRoute?
Ingress is a shared abstraction that can be implemented by many providers (Nginx, ALBs, Traefik, HAProxy, etc). It is specifically an abstraction over a fairly simple HTTP reverse proxy that can do routing based on hostnames and path prefixes. Because it has to be a shared thing, that means it's been awkward to handle configuration of provider-specific settings. Some teams on the provider side have decided the benefits of a shared abstraction are not worth the complexities of implementation and have made their own things, so far Contour and Traefik have both named them IngressRoute but there is no connection other than similar naming.
Contour handled this fairly well and allowed the two systems to coexist, the Traefik team disregarded our warnings and basically nerfed Ingress to vanilla configs only because they don't see any benefit from supporting it. Can you tell I'm salty about this? Because I definitely am.
Basically Ingress is the official thing but it's imperfect, some people are trying to make a new, better thing but it's not going well.
An ingressRoute
is specific to Traefik. It's not native to Kubernetes. It is a Custom Resource Definition which allows you to take advantage of Traefik features not exposed in the Kubernetes ingress
resource
The Traefik docs explain the reasoning behind this.
...the community expressed the need to benefit from Traefik features without resorting to (lots of) annotations, we ended up writing a Custom Resource Definition (alias CRD in the following) for an IngressRoute type...