<p>I use MetalLB and Nginx-ingress controller to provide internet access to my apps.
I see that in most configurations, the service is set to ClusterIP, as the ingress will send traffic there.</p>
<p>My question is: does this end up with double load balancing, that is, one from MetalLB to my ingress, and another from my ingress to the pods via ClusterIP?</p>
<p>If so, is this how it is supposed to be, or is there a better way?</p>

<p>Metallb doesn't receive and forward any traffic, so</p>
<blockquote>
<p>from MetalLB to my ingress</p>
</blockquote>
<p>doesn't really make sense. Metallb just configures kubernetes services with an external ip and tells your surrounding infrastructure where to find it. Still with your setup there will be double load-balancing:</p>
<p>Traffic reaches your cluster and is load-balanced between your nginx pods. Nginx handles the request and forwards it to the application, which will result in a second load-balancing.</p>
<p>But this makes total sense, because if you're using an ingress-controller, you don't want all incoming traffic to go through the same pod.</p>
<p>Using an ingress-controller with metallb can be done and can improve stability while performing updates on you application, but it's not required.</p>
<p>Metallb is a solution to implement kubernetes services of type <code>LoadBalancing </code> when there is no cloud provider to do that for you.</p>
<p>So if you don't need layer 7 load-balancing mechanism you can instead of using a service of type <code>ClusterIP</code> with an ingress-controller just use a service of type <code>LoadBalancing</code>. Metallb will give that service an external ip from your pool and announce it to it's peers.</p>
<p>In that case, when traffic reaches the cluster it will only be load-balanced once.</p>
