Clarify Ingress load balancer
It seems like the first scheme you drew is correct. But I think you get confused in terminology. Particularly in the difference between ingress
and ingress-controller
.
Ingress
is a type of resources in k8s (like Service
, Deployment
, ReplicaSet
etc). We use ingress if we want to expose some services to an external world with binding to some path and host (i.e. myapp.com/api -> my-api-service).
The job of ingress-controller
is to handle creation/update/deletion of ingress resources and implement all the functionality needed for ingress. Under the hood ingress-controller is a simple deployment exposed as LoadBalancer
or NodePort
service depending on where k8s is deployed. And image-controller forwards received request further to one of pods of service which matches host and path in some of the deployed ingress resources.
The ClusterIP
services themselves perform load balancing. The naming can be confusing as LoadBalancer
services are not the only services that involve load balancing - LoadBalancer
actually means something more like 'cloud provider please create an external load balancer and point it at this service'. The kubernetes ClusterIP
services also load-balance across Pods in different Nodes using the kube-proxy. If you don't want kubernetes to do load balancing then you have to specifically disable it by creating a headless service.