Difference between NodePort and LoadBalancer?

I have just started with Kubernetes and I am confused about the difference between NodePort and LoadBalancer type of service.

The difference I understand is that LoadBalancer does not support UDP but apart from that whenever we create a service either Nodeport or Loadbalancer we get a service IP and port, a NodePort, and endpoints.

From Kubernetes docs:

NodePort: on top of having a cluster-internal IP, expose the service on a port on each node of the cluster (the same port on each node). You'll be able to contact the service on any NodeIP:NodePort address.

LoadBalancer: on top of having a cluster-internal IP and exposing service on a NodePort also, ask the cloud provider for a load balancer which forwards to the Service exposed as a NodeIP:NodePort for each Node.

So, I will always access service on NodeIP:NodePort. My understanding is, whenever we access the node:NodePort, the kubeproxy will intercept the request and forward it to the respective pod.

The other thing mentioned about LoadBalancer is that we can have an external LB which will LB between the Nodes. What prevents us to put a LB for services created as nodeport?

I am really confused. Most of the docs or tutorials talk only about LoadBalancer service therefore I couldn't find much on internet.


Nothing prevents you from placing an external load balancer in front of your nodes and use the NodePort option.

The LoadBalancer option is only used to additionally ask your cloud provider for a new software LB instance, automatically in the background.

I'm not up to date which cloud providers are supported yet, but i saw it working for Compute Engine and OpenStack already.


Difference between Node port and Load Balancer services.

Node Port Load balancer
By creating a NodePort service, you are saying to Kubernetes reserve a port on all its nodes and forwards incoming connections to the pods that are part of the service. There is no such port reserve with Load balancer on each node in the cluster.
NodePort service can be accessed not only through the service’s internal cluster IP, but also through any node’s IP and the reserved node port. Only accessible by Load balancer public IP
Specifying the port isn’t mandatory. Kubernetes will choose a random port if you omit it( default range 30000 - 32767). Load balancer will have its own unique, publicly accessible IP address and will redirect all connections to your service
If you only point your clients to the first node, when that node fails, your clients can’t access the service anymore With Load balancer in front of the nodes to make sure you’re spreading requests across all healthy nodes and never sending them to a node that’s offline at that moment.