<p>In <a href="https://kubernetes.github.io/ingress-nginx/deploy/baremetal/" rel="nofollow noreferrer">https://kubernetes.github.io/ingress-nginx/deploy/baremetal/</a>
In metalLB mode, one node attracts all the traffic for the ingress-nginx
By node port we can gather all traffic and loadbalance it podes by service</p>

<p>what is diffrence between node port and metalLB?</p>

<p>I was also struggling a bit to understand: why would i need a service of type loadbalancer, if i can use a nodePort service, which would allow me to access a service through a nodeport on all the nodes (loadbalanced by kube-proxy).</p>
<p>I think the main reason is security. Nodeport service forces you to expose your k8s nodes ip adresses to users.
Whereas when using loadbalancer service (either with metallb or any cload-provider), as @starfry mentioned it  allocates services with separate dedicated IP addresses allocated from a pool.</p>
<p>Nodeport service allows only exposing ports of the range 30000-32767. As the port is exposed on the K8s node and would be possible otherwise to tromp on real ports used by the node.
So another reason would be for exposing a service outside of this range.</p>
