Accessing Kubernetes services in the cluster from outside of the local network - Bare Metal
If you are using metalb, I think you don't need to have an external vm with haproxy, you could install an ingress controller in kubernetes and change the service type of the ingress controller to LoadBalancer.
Now You will have an external ip in your lan to access your local service through the ingress controller ip.
(Internet) -> (Router) -> Nat -> Metalb-Ip -> Ingress-controller -> k8s-service