Ingress is a collection of rules that allow inbound connections to reach the cluster services.
Ingress can provide load balancing, SSL termination and name-based virtual hosting.
Ingress can be configured to give services externally-reachable URLs, load balance traffic, terminate SSL, offer name-based virtual hosting, and more. Users request ingress by POSTing the Ingress resource to the API server.
Ingress controller is responsible for fulfilling the Ingress, usually with a loadbalancer, though it may also configure your edge router or additional frontends to help handle the traffic in an HA manner
Choosing a controller
There are many controllers that can be chosen for this job. From my preliminary research, two likely candidates have emerged as the most appropriate for the job at hand - nginx and traefik
The big difference between nginx and traefik is popularity, maturity and configuration model. Nginx is much more popular, much more mature, has a complex configuration model, and requires explicit changes when something in the cluster changes. Traefik is less mature, less well known, and can infer configuration changes directly from cluster metadata.
The overall consensus on the internet is that nginx is more popular but also more complicated while traefik is simpler but a bit slower.
We will be starting to work with the traefik and monitor how the situation develops. Further research on traefik, nginx, and controllers, in general, will be needed for successful implementation of ingress.
Further reading
Kubernetes interactive tutorial found at kubernetes homepage https://kubernetes.io/ for general understanding
Ingress and ingress controller
https://kubernetes.io/docs/concepts/services-networking/ingress/
Choosing a controller
Further reading