I use metallb as well, but I use it completely separate from ingresses.
My use case is getting access to services that communicate over TCP or UDP but not http.
For that I create LoadBalancer’s by importing a yaml file.
It would be nice if Rancher had support for LoadBalancers via metallb if it’s a custom cluster.
Anywho if your goal is sticky sessions, that can already be done via the nginx-ingress.
As far as getting rid of the NodePort option, there’s a chance that upgrades would override any changes you made to the DaemonSet, thereby adding the nodeports back in.
But you could just leave the NodePorts there and ignore them.
As to creating a LoadBalancer that forwards to ingress-nginx you could import this which I think would do it:
If you really wanted to remove the NodePorts, just edit the yaml of the ingress-nginx DaemonSet and remove the nodeports line from the ports section in the container. I think that would do it, at least until an upgrade happened and overrode your changes. (not sure if they would or not, but I suspect they might)
Also, it should be noted that using a LoadBalancer via MetalLB Layer 2 mode is probably not a good idea, as all your traffic would be running through that LoadBalancer and could become bottlenecked see this for more info.