You may check out the HAProxy ingress controller:
HAProxy is extremely fast and resource-efficient allowing you to get
the most out of your infrastructure and minimize latencies in
high-traffic scenarios. It also brings an almost endless list of
options for tuning and customization. HAProxy’s features like dynamic
scaling and reconfiguration without reloading are also very valuable
in this use case as Kubernetes pods are often spawned, terminated, and
migrated in quick bursts and in high amounts, especially during
deployments.
We will use the HAProxy Ingress Controller implementation available at
jcmoraisjr/haproxy-ingress. It is a project to which HAProxy
Technologies has contributed code that enables the Ingress Controller
to take advantage of the HAProxy Runtime API. (Another useful HAProxy
Ingress Controller implementation that you could look into would be
appscode/voyager.)
The main advantage of this solution is that the HAProxy ingress controller runs natively inside the Kubernetes cluster, and can be easily configured using ConfigMap. It means that HAProxy ingress controller will use the Flannel overlay network without any additional configuration.
This manual could be helpful if you decide to give it a try:
Update:
If you want to use Flannel on the instances outside of the cluster consider reading this manual: