You almost answered your own question. One common solution is to have 2 nodes with haproxy (or similar) sharing a virtual IP with keepalived that load balance de traffic to the control plane nodes and to the nodes where your ingress controller runs.
There are other options, like running the haproxy in the control plane nodes.
There are other options, like running the haproxy in the control plane nodes.