I'm trying to understand how traffic can be forwarded to an on-premise Kubernetes cluster.
It's clear to me that in a public Cloud provider, the underlying infrastructure of the Cloud can automatically manage and forward traffic to a Kubernetes distribution, such as EKS, GKE, AKS, by assining a LoadBalancer
IP to a Kubernetes Service
. Then, after a few seconds, this service will receive an external IP and will be reachable from the outside world.
On the other hand, in an on-premise Kubernetes cluster, by assigning a LoadBalancer
IP to a service, it stays on pending forever, unless you assign a node IP, but what if you want to assign a different IP from a private IP range? In order to tackle this, in my homelab, I've deployed metallb
inside my K3s cluster. The metallb
is configured to use a private IP range of my network, let's say 10.0.0.0/24
. Now, services of type LoadBalancer
can consume an address of this range, e.g. my Ingress Controller can receive 10.0.2.3
as its external IP.
I can't understand what's metallb
doing under the hood. How metallb
"listens" to an address of the range and forwards traffic to my cluster. Can this be achieved without a metallb
? I've tried setting an ExternalIP
directly to a service of type LoadBalancer
, but it never managed to claim that specific IP without it.
In addition, I'm aware that this can also be achieved with a "physical" load-balancer solution, such as NGINX and HAProxy, that sits in front of the cluster. To my understanding, technically this does the same thing as metallb
. With such a solution configured, an address can be listened and be forwarded to the cluster. But my question here is, can this be achieved without those technologies? Can a Kubernetes Cluster listen to an external address and accept traffic without an intermediate solution? Maybe through Firewall rules and port-forwarding?
Your time is highly appreciated!