Why does k8s allocate node ports for the loadbalancer service?

like this:

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   172.17.247.112   23.91.98.160   15021:47711/TCP,80:37888/TCP,443:33064/TCP,31400:32642/TCP,15443:45164/TCP   2d10h

k8s allocates an additional port for each port of the loadbalancer, so that in addition to passing lb ip(exp:23.91.98.160:80), traffic can also come in through node ip + node port(node-ip:37888).

What is the reason for doing this?

Some LBs were implemented in terms of NodePorts, and it seemed like a simpler API to have them “stack”.

Thank you so much!