Here’s the deal with K8s - it defines standards and protocols for a whole bunch of stuff but doesn’t necessarily provide an implementation.
This is the case with ingress controllers. The K8s spec describes a bunch of HTTP routing behaviours with things like path based routing and default backends which you add to your K8s configuration yaml files.
The idea of the ingress controller is that it allows external traffic to reach your containers (pods).
You pick (and deploy…) your own ingress controller and it will work with the annotations of your deployments to route incoming requests appropriately.