I wonder if you might be conflating multiple concepts when you say “cluster external ip”.
Each node in the cluster has (within the status information recorded by the kubernetes API server) a list of addresses that are believed to be able to be used to reach that machine. This can include internal and external ips. (External means not only useable from within pods on the cluster, so potentially public ips.)
If you have a node which you have assigned multiple static public ip addresses, you can create service resources of type ExternalIP so that traffic addressed to each of those public ip addresses will be forwarded (by kubeproxy on that node) to a different selection of pods in the cluster. (This could be slightly more user friendly than NodePort services, but it may create a bottleneck and also cause transient client errors when that node has to be swapped out e.g. for patches/upgrades. Also, public ips are a limited resource, whereas a load balancer can generally host multiple services with different external DNS hostnames through the same public ip.)
If you create a service resource of type ClusterIP, it will be assigned an ip address (and dns hostname) that is not directly reachable (except by other pods in the same cluster), necessitating some ingress/gateway for external access.
If you create a service resource of type LoadBalancer, then kubernetes will try to have your cloud provider provision a load balancer (or gateway proxy) to forward traffic to your pods, and then the service resource will be updated to note the external ip address of that particular load balancer. (However, it is typically more cost efficient to instead use an ingress controller that can configure one load balancer to be shared for multiple services.)
You would create a kubernetes service resource of type ExternalName if you want a local hostname that pods can use as an alias to refer to an externally provided service. (This allows changing where the service is hosted, without needing to reconfigure the pods that are clients of that service. However, some providers may not permit access under alternative hostnames.) It is implemented using kubedns.
https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/